繁体   English   中英

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

[英]Why is this transform.position reset between frames

所以,我的问题如下:

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

现在,我的问题的特别之处在于:这不是关于使用 localPosition 而不是位置(巨魔没有父母 - 双关语),这不是关于通过“[SerializeField]”引用脚本中的转换,这不是关于处理静态对象或混乱的预制坐标或我在互联网上绝望的 10 小时搜索中发现的任何其他问题。 不,问题是我的代码中有巨魔变换,我成功修改了它,但随后它无法应用于游戏中的巨魔对象。 让它沉下去——我正确地修改了正确的变换(通过调试多次检查),但在下一帧的开始,所有的变化都神奇地恢复了,变换没有丝毫移动。

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

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 保持不变是在最后一帧的开头——好像从未进行过计算或更改。

@鲁兹姆,

你是对的!!! 原来是 troll 的 Animator 组件导致了这个问题——“应用根运动”被关闭,我打开它,现在位置得到正确更新。 非常感谢您的帮助!

例子:

检查器中的动画组件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM