C# 为什么要在帧之间重置transform.position

C# 为什么要在帧之间重置transform.position,c#,unity3d,2d,game-development,C#,Unity3d,2d,Game Development,因此,我的问题如下: 我正在开发一个非常简单的2D游戏,因为我对Unity非常陌生。基本上,有一个骑士,也有一个巨魔。我正在为巨魔开发我的自定义AI,一开始就被难倒了。我试着让巨魔精灵正确地旋转并朝玩家走去(在Update()中),但后来发现巨魔游戏对象的移动量不到百万分之一个单位(尽管它旋转正确) 现在,我的问题的特殊之处在于:它不是关于使用localPosition而不是position(troll没有父对象,这是双关语),它不是关于通过“[SerializeField]”在脚本中引用转换,

因此,我的问题如下:

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

现在,我的问题的特殊之处在于:它不是关于使用localPosition而不是position(troll没有父对象,这是双关语),它不是关于通过“[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)
        );
    }
}
公共类EnemyController:MonoBehavior
{
[序列化字段]
私人动画师;
[串行字段]
私人浮动步行速度;
[序列化字段]
[标题(“单位中敌人的攻击范围。”)]
私人浮动协议;
私人浮动目录;
私有转换玩家转换;
无效更新()
{
if(Aggro(玩家转换,aggroRange))
{
//步行:
走向(玩家转换、行走速度);
}
}
私有虚漫游(变换目标变换、浮动漫游速度)
{
animator.SetBool(“正在运行”,false);
dir=0.0f;
//获取方向(左或右)
if(targetTransform.position.x
(注意:Aggro()是一个自定义方法,用于确定敌方何时进行攻击;代码中未包含此方法,因为它与问题无关)

因此,基本上,transform.position在脚本中得到正确更改,并一直保持这种方式,直到方法结束,但在下一帧开始时–即再次调用walktowing()时,transform.position与上一帧开始时的位置保持不变,就好像没有进行任何计算或更改一样。

@Ruzihm

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

例如:


您是如何检查修改了正确的变换的?另外,您可以包括一个Debug.Log(“playerttransform.gameObject.scene==null检查:”+(playerttransform.gameObject.scene==null))
在Update()的顶部,让我们知道它输出了什么?@Ruzihm感谢您的回答!playerTransform.gameObject.scene==null返回false。我知道这是正确的转换,因为我在调试器窗口中检查了它的信息(名称、坐标等),它们都与真实的匹配;我还尝试过在某一点上使用[SerializeField]显式引用它,但仍然存在transform.position问题:(我打错了,你能改为检查一下:
Debug.Log(“playerTransform.gameObject.scene.name==null检查:”+(playerTransform.gameObject.scene.name==null));
:)@Ruzihm当然,但它仍然返回false:/似乎有其他内容正在覆盖您的更改。您没有共享足够的代码来指示可能是什么。首先可以禁用所有非玩家、非巨魔(而非其祖先)游戏对象,并禁用玩家和巨魔(及其祖先)上的所有非
EnemyController
组件。这将导致转换值不会意外重置。然后,您可以启用这两个游戏对象上的组件,然后重新启用其他游戏对象,直到问题再次出现。这将有望表明罪犯很高兴你找到了答案!添加了我在unity文档中找到的“应用根运动”的示例图像。