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