You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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里的代码会在动画更新后再执行,这样就能确保你的移动不会被动画覆盖。

另外,因为你的两个handObstacle空对象的子物体,也可以考虑把移动逻辑挂载在父对象Obstacle上,让两个子物体跟着父对象一起移动,这样动画和移动的冲突会更少哦~

备注:内容来源于stack exchange,提问作者Qatawneh Razvan

火山引擎 最新活动