【问题标题】:AI follow and rotate towards the playerAI跟随并朝玩家旋转
【发布时间】:2021-02-01 09:59:23
【问题描述】:

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

    
    }

【问题讨论】:

    标签: c# unity3d rotation


    【解决方案1】:

    “返回”我理解的是旋转,而不是位置。 我认为您的问题出在 Vector3.Angle 上。检查docs,该函数返回两个向量之间两个可能角度中较小的一个。如果角度大于 180,则需要在代码中进行处理,以使敌人相应地旋转。

    编辑:我认为这是由 translate 函数的旋转空间产生的。 在transform.Translate 参数中设置Space.World 试试这个:

    private void Update() {
        Vector3 toTarget = player.transform.position - transform.position;
        transform.LookAt(player.transform.position);
        transform.Translate(toTarget * speed * Time.deltaTime, Space.World);
    }
    
     
    

    【讨论】:

    • 对不起,如果我的回去是误解,我的意思是他只是按位置回去。 (旋转可能没问题,因为敌人刚走到某个位置,我看不到他)
    • 效果很好!! Space.World,从来没用过!修复!谢谢!!!
    【解决方案2】:

    你可以使用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;
    

    【讨论】:

    • 嗨!感谢您的回答,但是当我试图将我的播放器旋转到周围时,敌人的位置仍然消失了
    • 那一定是另一个问题,这段代码对我来说很好。
    • 对于锄头你乘以turnRate?我一直在尝试使用它。
    • 您可能正在使用带有Space.Self 参数的transform.Translate(toTarget * speed * Time.deltaTime, Space.Self);,而不是建议的transform.position += transform.forward * speed * Time.deltaTime;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 2021-04-05
    • 2020-03-20
    相关资源
    最近更新 更多