更新RuntimeAnimatorController后,GameObject的Transform变换不正确

时间:2017-11-02 08:46:18

标签: c# unity3d animator navmesh

在Unity中,gameObject具有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控制器将更新到新的控制器,但是gameObject的位置会在游戏开始之前变为gameObject的原始位置,并且更新到正确的位置在下一帧。

例如,在游戏开始之前,我的gameObject位于(0,0,0)位置。游戏开始后,在特定时间我的gameObject通过动画移动到(10,0,0)。现在,如果我调用函数'changeAnimatorController',gameObject的位置将变为(0,0,0),但在下一帧中再次更新为(10,0,0)。

2.如果我从当前动画控制器中存在的动画片段事件(我将要替换)中调用函数'changeAnimatorController',则gameObject的位置将变为gameObject在游戏开始前的原始位置,并且永远不会在任何框架中更新到正确的值。

例如,在游戏开始之前,我的gameObject位于(0,0,0)位置。游戏开始后,在特定时间我的gameObject通过动画移动到(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;
}

在上述所有情况下,在更改gameObject的RunTimeAnimatorController之后,gameObject的旋转在游戏开始之前变为gameObject的原始旋转。 例如,在游戏开始之前,我的gameObject的旋转是(0,0,0)。游戏开始后,在特定时间我的gameObject的旋转是(120,0,0)通过动画。现在如果我调用函数'changeAnimatorController',gameObject的旋转将变为(0,0,0)并且永远不会回到(120,0,0)。

知道为什么会这样吗?为什么从不同的地方调用函数'changeAnimatorController'的工作方式不同? 在运行时更改Animator的runTimeAnimatorController的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

它已经解决了。它是Unity早期版本中的一个错误,但不是2017.x中的错误。 Unity 2017.x中一切正常。