为什么这个 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" 被关闭,我打开它并且位置现在得到正确更新。非常感谢您的帮助!
示例:
那么,我的问题如下:
我正在开发一款非常简单的 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" 被关闭,我打开它并且位置现在得到正确更新。非常感谢您的帮助!
示例: