1

有一個簡單的AI,它在範圍內跟隨玩家,並在不在玩家範圍內時隨機移動AI。當人工智能撞牆並超出玩家範圍時,它始終開始旋轉。無法弄清楚爲什麼它一直這樣做。Ai在發生碰撞時始終在旋轉

我可能會錯過一件簡單的事情...... 非常感謝您的任何幫助。

void Update() 
{ 
    Target = GameObject.FindGameObjectWithTag("Player"); 

    if (Vector3.Distance(Target.transform.position, transform.position) < 25) 
    { 
     followPlayer(); 
    } 
    else 
    { 
     randomMovement(); 
    } 

} 

public void followPlayer() 
{ 

    if (Vector3.Distance(transform.position, Target.transform.position) >= MinDist) 
    { 

     transform.position += transform.forward * MoveSpeed * Time.deltaTime; 
     transform.LookAt(Target.transform); 


     if (Vector3.Distance(transform.position, Target.transform.position) <= MaxDist) 
     { 
     } 

    } 
    else 
    { 

    } 

} 

public void randomMovement() 
{ 
    transform.position += transform.forward * MoveSpeed * Time.deltaTime; 
    transform.Rotate(RandomDirection * Time.deltaTime * 10.0f); 

} 

void OnCollisionEnter(Collision col) 
{ 
    bool hasTurned = false; 

    if (col.transform.gameObject.name != "Terrain") 
    { 
     if(hasTurned == false) 
     { 
      RandomDirection = new Vector3(0, Mathf.Sin(TimeBetween) * (RotationRange/2) + OriginalDirection, 0); 
      randomMovement(); 
      hasTurned = true; 
     } 
     else 
     { 
      randomMovement(); 
      hasTurned = false; 
     } 


     Debug.Log("Hit"); 
    } 
+0

你有一個剛體連接到你的AI實體嗎?這可能會導致碰撞後的旋轉。如果是這樣,請嘗試凍結旋轉。看看:https://docs.unity3d.com/ScriptReference/Rigidbody-freezeRotation.html它也可能,它看起來像它的旋轉,導致它不斷進入與牆壁的碰撞,因爲你選擇了一個漂亮隨機旋轉,讓它移動,而不是有一個「智能」的方式擺脫障礙 –

+0

是的,我可以,這可能是問題的原因!謝謝@TobiasTheel – Robertgold

+0

如果你可以確認,這是真的,我會爲此創建一個答案:) –

回答

1

它是不斷旋轉的原因是因爲你不斷在更新()的汽車無適用的旋轉與Rotate()你的對象調用randomMovement()。這聽起來像你想要做的是讓對象每隔幾秒漫無目的地漫遊。你可以通過在你的randomMovement()上實現定時器來做到這一點,以便每隔幾秒鐘就產生一個新的旋轉(類似於onCollision中的)。下面的例子。

float t = 0; 
public void randomMovement() 
{ 
    transform.position += transform.forward * MoveSpeed * Time.deltaTime; 

    t += Time.deltaTime; 
    if (t > 3f) // set to a new rotation every 3 seconds. 
    { 
     t = 0; // reset timer 
     RandomDirection = new Vector3(0, Random.Range(0f, 360f), 0); // turn towards random direction 

     transform.Rotate(RandomDirection); 
    } 
}