在 Unity 中,一个游戏对象具有 NavMeshAgent 和 Animator 组件。
我在运行时通过以下方式在名为“changeAnimatorController”的函数中更改 Animator 组件的 runTimeAnimatorController:(语言 - C#)
RuntimeAnimatorController newAnimController = Resources.Load("AnimControllers/WalkAnimatorController") as RuntimeAnimatorController;
void changeAnimatorController()
{
this.gameObject.GetComponent<Animator>().runtimeAnimatorController =
newAnimController ;
}
现在调用这个函数在以下两种不同方式调用时的工作方式不同: 1. 如果我直接从脚本调用函数'changeAnimatorController',我的 Animator 控制器将更新为新的,但游戏对象的位置正在更改为游戏对象的位置在游戏开始之前存在的原始位置,并在下一帧更新到正确的位置。
例如,在游戏开始之前,我的游戏对象位于 (0,0,0) 位置。游戏开始后,在特定时间,我的游戏对象通过动画移动到 (10,0,0)。现在,如果我调用函数“changeAnimatorController”,游戏对象的位置将更改为 (0,0,0) ,但在下一帧再次更新为 (10,0,0)。
2.如果我从当前动画控制器(我将要替换)中存在的动画剪辑事件调用函数'changeAnimatorController',则游戏对象的位置将更改为游戏开始之前存在的游戏对象的原始位置,并且永远不会得到在任何帧中更新为正确的值。
例如,在游戏开始之前,我的游戏对象位于 (0,0,0) 位置。游戏开始后,在特定时间,我的游戏对象通过动画移动到 (10,0,0)。现在,如果我从动画剪辑的事件中调用函数“changeAnimatorController”,gameObject 的位置将更改为 (0,0,0) 并且永远不会回到 (10,0,0)。但令我惊讶的是,如果 gameObject 的 navMeshAgent 的 baseOffset 在以下列方式更新 RunTimeAnimatorController 后立即更新为某个值,则它的位置将更新为正确的值(上例中的(10,0,0))。
void changeAnimatorController()
{
this.gameObject.GetComponent<Animator>().runtimeAnimatorController = newAnimController ;
this.gameObject.GetComponent<NavMeshAgent>().baseOffset = requiredBaseOffset;
}
在上述所有情况下,在更改游戏对象的 RunTimeAnimatorController 后,游戏对象的旋转将更改为游戏开始之前存在的游戏对象的原始旋转。例如,在游戏开始之前,我的游戏对象的旋转是 (0,0,0)。游戏开始后,在特定时间我的游戏对象的旋转是 (120,0,0) 通过动画。现在如果我调用函数'changeAnimatorController',游戏对象的旋转将变为(0,0,0)并且永远不会回到(120,0,0)。
知道为什么会这样吗?为什么从不同的地方调用函数'changeAnimatorController'的工作方式不同?在运行时更改 Animator 的 runTimeAnimatorController 的正确方法是什么?