Unity游戏对象世界空间方向控制及动画移动失效问题求助
Unity游戏对象世界空间方向控制及动画移动失效问题求助
嘿,我来帮你搞定这两个Unity里的小问题!
一、让物体始终朝向世界坐标系的「右」移动
你现在的Update代码里,transform.Translate默认是基于物体自身的本地空间(Space.Self)计算移动方向的,所以当物体旋转180度后,它自己的「右」方向就和世界空间的「右」反过来了。要解决这个问题,只需要在Translate方法里指定使用世界空间即可:
原来的代码:
void Update() { transform.Translate(Vector2.right * speed * Time.deltaTime); }
修改后的代码:
void Update() { // 指定Space.World,强制使用世界坐标系的右方向 transform.Translate(Vector2.right * speed * Time.deltaTime, Space.World); }
这样不管你的hand子物体或者父对象Obstacle怎么旋转,物体都会一直朝着世界空间的右侧移动,完全不受自身旋转状态的影响。
二、动画播放后物体无法移动的解决思路
动画播放后物体不动,通常是Animator组件的设置或者动画剪辑的关键帧冲突导致的,给你几个实用的解决办法:
- 关闭「根运动」(Apply Root Motion):选中你的
hand物体,找到Animator组件,取消勾选Apply Root Motion。这个选项开启时,动画会接管物体的根位置/旋转,导致你代码里的Translate移动被覆盖。关闭后,动画只会控制物体的局部动画(比如手的摆动、旋转),代码的移动逻辑就能正常生效了。 - 检查动画剪辑的关键帧:打开你的动画Clip,看看有没有添加「位置」相关的关键帧。如果动画里固定了物体的位置,播放时就会强制把物体拉回关键帧的位置,自然代码移动就失效了。删掉这些位置关键帧,只保留你需要的动画(比如手的旋转、缩放动画)就行。
- 调整代码的执行时机:如果必须开启根运动,可以把你的移动代码从
Update()移到LateUpdate()里。因为Animator的更新逻辑是在Update之后执行的,LateUpdate里的代码会在动画更新后再执行,这样就能确保你的移动不会被动画覆盖。
另外,因为你的两个hand是Obstacle空对象的子物体,也可以考虑把移动逻辑挂载在父对象Obstacle上,让两个子物体跟着父对象一起移动,这样动画和移动的冲突会更少哦~
备注:内容来源于stack exchange,提问作者Qatawneh Razvan




