问题描述
我的脚本有问题,我想要我的敌人,跟随并转向玩家。在他四处走动的时候。 看起来效果不错,但是当我的播放器在 y 上旋转 180 度时,我的敌人似乎退回了很多(他的位置),只有当我的播放器恢复正常旋转时,敌人似乎又回来了。 我做错了什么?
public class EnemyTesting : MonoBehavIoUr
{
public GameObject player;
public float speed = 1.5f;
public float turnRate;
private void Update()
{
Vector3 toTarget = player.transform.position - transform.position;
float angletoTarget = Vector3.Angle(transform.forward,toTarget);
Vector3 turnAxis = Vector3.Cross(transform.forward,toTarget);
transform.RotateAround(transform.position,turnAxis,Time.deltaTime * turnRate * angletoTarget);
transform.Translate(toTarget * speed * Time.deltaTime);
}
解决方法
“返回”我理解的是旋转,而不是位置。 我认为你的问题是 Vector3.Angle。检查 docs 函数返回两个向量之间的两个可能角度中较小的一个。如果角度大于 180,您需要在代码中处理它以使您的敌人相应地旋转。
编辑:我认为这是由 translate 函数的旋转空间产生的。
在 Space.World
参数中设置 transform.Translate
试试这个:
private void Update() {
Vector3 toTarget = player.transform.position - transform.position;
transform.LookAt(player.transform.position);
transform.Translate(toTarget * speed * Time.deltaTime,Space.World);
}
,
您可以使用 Quaternion.RotateTowards 缓慢地将敌人的方向转向玩家。
这种行为也会使敌人走向它的前向向量,而不是直接朝玩家走。
var towardsPlayer = player.transform.position - transform.position;
transform.rotation = Quaternion.RotateTowards(
transform.rotation,Quaternion.LookRotation(towardsPlayer),Time.deltaTime * turnRate
);
transform.position += transform.forward * speed * Time.deltaTime;