作者cjcat2266 (CJ Cat)
看板GameDesign
标题Re: [请益] Unity-横向卷轴的移动控制
时间Sun Mar 27 11:34:43 2016
※ 引述《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)",只是比较消耗资源
--
Web
http://AllenChou.net
Twitter
http://twitter.com/TheAllenChou
LinkedIn
http://linkedin.com/in/MingLunChou
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 172.91.156.131
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/GameDesign/M.1459049686.A.EA5.html
※ 编辑: cjcat2266 (172.91.156.131), 03/27/2016 11:43:35
1F:推 wix3000: 感谢回应,嗯~所以果然没有简单设定就能实现的方法吗 03/27 18:50
2F:→ juicefish: Unity用物理引擎解的话 应该是调整重量或重力 03/28 00:47
3F:→ cjcat2266: 还是有可能会浮空,仍需要额外逻辑把角色确实钉在地上 03/28 08:26
4F:→ cjcat2266: 要做出紧密操控的平台动作游戏,只靠物理模拟是不够的 03/28 08:27
5F:→ cjcat2266: 玩家对紧密操控的期望,是其确定性(determinism) 03/28 08:29
6F:→ cjcat2266: 全依赖物理模拟而不用额外逻辑,极有可能破坏这项期望 03/28 08:30
7F:→ cjcat2266: 主打紧密操控,只要有1%机率会浮空,就会让玩家不爽 03/28 08:31
8F:推 johnny94: 同意,尤其是很吃操作的动作游戏,更是不能仰赖通用的物 03/28 11:35
9F:→ johnny94: 理引擎 03/28 11:35
10F:推 azureblaze: 不钉地板其实也可以靠n个frame内有碰到地板就算着地 03/28 14:41
11F:→ azureblaze: 这样可以处理稍微飘起来的状况,个人试起来感觉还不错 03/28 14:42
12F:→ azureblaze: 在游戏界「简单设定就能实现」的效果通常不是你要的 03/28 14:44
13F:→ azureblaze: 需求变化实在太多了,除非你想要看起来千篇一律 03/28 14:45
14F:推 wannasaynone: 推实用 03/29 10:09
15F:推 sdsg5bpnl: 实用推 03/30 21:11
16F:推 lemmii: push 03/30 22:48