为什么这个 transform.position 在帧之间重置

Why is this transform.position reset between frames

那么,我的问题如下:

我正在开发一款非常简单的 2D 游戏,因为我对 Unity 还很陌生。基本上,有一个骑士,还有一个巨魔。我正在为巨魔开发自定义 AI,但一开始就被难住了。我试图让巨魔精灵正确地旋转并走向玩家(在 Update() 中),但后来发现巨魔游戏 object 没有移动到百万分之一单位(尽管它正确旋转)!

现在,我的问题的特别之处在于:它与使用 localPosition 而不是位置无关(巨魔没有 parents – 双关语意),它与通过以下方式在脚本中引用转换无关“[SerializeField]”,它不是关于使用静态 objects 或 messed-up 预制坐标或我在 Internet 上绝望的 10 小时搜索中发现的任何其他问题。不,问题是我的代码中有 troll 转换,我成功修改了它,但后来它未能应用于 in-game troll object。让它沉入——我正在 correctly 修改 correct 转换(通过调试检查多次)但在下一帧开始时,所有更改神奇地恢复原样,变换丝毫没有移动。

我已经对我的代码进行了将近二十次修改以尝试使其工作(包括按照特定论坛主题中的建议将不同文件中的内容分开)但它就是没有,我不能'别想别的了。非常非常感谢任何帮助。

public class EnemyController : MonoBehaviour
{
    [SerializeField]
    private Animator animator;
    [SerialiseField]
    private float walkingSpeed;
    [SerializeField]
    [Header("The aggro range of the enemy in Unity units.")]
    private float aggroRange;

    private float dir;

    private Transform playerTransform;

    void Update()
    {
        if (Aggro(playerTransform, aggroRange))
        {
            //WALKING:
            WalkTowards(playerTransform, walkingSpeed); 
        }
    }

    private void WalkTowards(Transform targetTransform, float walkingSpeed)
    {
        animator.SetBool("IsRunning", false);
        dir = 0.0f;

        //Get the direction (left or right)
        if (targetTransform.position.x < transform.position.x) //Left
        {
            dir = -1.0f;
            //Flip the sprite to the left
            transform.rotation = Quaternion.Euler(0.0f, 180.0f, 0.0f);
        }
        else //Right
        {
            dir = 1.0f;
            //Flip the sprite to the right
            transform.rotation = Quaternion.Euler(0.0f, 0.0f, 0.0f);
        }

        transform.position = new Vector3(
            transform.position.x + (walkingSpeed * dir * Time.deltaTime),
            transform.position.y,
            transform.position.z
        );

        Debug.Log(
            string.Format("Troll 1 position:\nx: {0:#.##}",  transform.position.x) +
            string.Format(" y: {0:#.##}", transform.position.y) +
            string.Format(" z: {0:#.##}", transform.position.z)
        );
    }
}

(注意:Aggro() 是一个自定义方法,用于确定敌人何时攻击;未包含在代码中,因为它与问题无关)

所以基本上,transform.position 在脚本中得到正确更改并保持这种状态直到方法结束,但在下一帧开始时 - 即当再次调用 WalkTowards() 时,transform.position 保持与上一帧开始时相同——就好像从未进行任何计算或更改一样。

@Ruzihm,

你是对的!!!结果是巨魔的 Animator 组件导致了这个问题——"Apply root motion" 被关闭,我打开它并且位置现在得到正确更新。非常感谢您的帮助!

示例: