Re: [请益] Unity-横向卷轴的移动控制

楼主: cjcat2266 (CJ Cat)   2016-03-27 11:34:43
※ 引述《wix3000 (痒,好吃)》之铭言:
: 当脚色从上坡切换到下坡时,会因为惯性浮空一小段时间
: 只是就个人的游戏经验,大部分的横向卷轴游戏在高低差表面上移动时都是平贴着地面的
: 不知道这个部分是运用到了什么机制让它们能够平贴著
: 或者说有什么更好的架构来处理移动功能?
这就要谈到平台动作游戏(platformer)角色移动机制的一道分水岭
看你是要 "物理模拟(physics-based)" 还是 "紧密操控(tight control)"
物理模拟为主的游戏
就是用你的做法,设定角色的速度,然后交给物理引擎去模拟
像小小大星球就是这种作法
优点是可以很容易地让角色跟环境做物理互动,因为角色也是物理模拟的一部份
缺点就像你说的,角色会有 "浮浮的感觉(floaty)" 而抓地困难
大部分平台动作游戏采用紧密操控的作法
角色不属于物理引擎模拟的一部份,与环境的互动是用额外的逻辑去处理
本世代游戏的作法,是用 "射线投射(ray cast)" 将角色"钉"在地上
假设+Y轴为正上方
角色移动的时候,先决定下个frame的XZ位置
然后往-Y方向做ray cast,找出把角色"钉"在地上的正确Y轴位置
如此一来,角色就会紧紧的抓住地面
处理跳跃的时候,也不依靠物理引擎,而是直接对transform的Y分量做修改
当角色在空中落下的时候
每个frame在当时位置和下个frame的预期位置形成的线段,对地面做碰撞侦测
如果线段与地面没有相交,那就按照预期位置更新角色位置
若有相交,则把角色的位置设定到交点,这样角色就着地完成了
以上是处理Y分量的方式
处理XZ分量的方法就有很多种,端看环境的碰撞资料格式
也有混搭的作法
角色移动用设定速度和物理模拟的方式更新
但是每个frame也做-Y方向的ray cast,找出抓地点
如果抓地点没有离角色太远,就直接设定transform的Y分量,把角色重新"钉"回地上
补充:依照需求,除了ray cast
也可以考虑 "形状投射(shape cast)",只是比较消耗资源
作者: wix3000 (痒,好吃)   2016-03-27 18:50:00
感谢回应,嗯~所以果然没有简单设定就能实现的方法吗
作者: juicefish (果汁鱼)   2016-03-28 00:47:00
Unity用物理引擎解的话 应该是调整重量或重力
楼主: cjcat2266 (CJ Cat)   2016-03-28 08:26:00
还是有可能会浮空,仍需要额外逻辑把角色确实钉在地上要做出紧密操控的平台动作游戏,只靠物理模拟是不够的玩家对紧密操控的期望,是其确定性(determinism)全依赖物理模拟而不用额外逻辑,极有可能破坏这项期望主打紧密操控,只要有1%机率会浮空,就会让玩家不爽
作者: johnny94 (32767)   2016-03-28 11:35:00
同意,尤其是很吃操作的动作游戏,更是不能仰赖通用的物理引擎
作者: azureblaze (AzureBlaze)   2016-03-28 14:41:00
不钉地板其实也可以靠n个frame内有碰到地板就算着地这样可以处理稍微飘起来的状况,个人试起来感觉还不错在游戏界“简单设定就能实现”的效果通常不是你要的需求变化实在太多了,除非你想要看起来千篇一律
作者: wannasaynone (阿魂本命)   2016-03-29 10:09:00
推实用
作者: sdsg5bpnl   2016-03-30 21:11:00
实用推
作者: lemmii   2016-03-30 22:48:00
push

Links booklink

Contact Us: admin [ a t ] ucptt.com