簡體   English   中英

AI 跟隨並朝玩家旋轉

[英]AI follow and rotate towards the player

我的腳本有問題,我想要我的敵人,跟隨並轉向玩家。 當他四處走動時。 看起來效果不錯,但是當我的玩家在 y 上旋轉 180 度時,我的敵人似乎 go 向后退了很多(他的位置),只有當我的玩家恢復正常旋轉時,敵人似乎回來了。 我做錯了什么?

 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); }

通過“返回”,我理解的是旋轉,而不是 position。 我認為您的問題出在 Vector3.Angle 上。 文檔中檢查 function 返回兩個向量之間的兩個可能角度中的較小者。 如果角度大於 180,您需要在代碼中處理它以使您的敵人相應地旋轉。

編輯:我認為這是由平移 function 的旋轉空間產生的。 transform.Translate中設置Space.World arguments 試試這個:

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM