微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AI跟随并朝向玩家旋转

如何解决AI跟随并朝向玩家旋转

我的脚本有问题,我想要我的敌人,跟随并转向玩家。在他四处走动的时候。 看起来效果不错,但是当我的播放器在 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;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。