1

範囲内にいるときにプレイヤーを追いかけると、プレイヤーの範囲にないときにAIをランダムに動かします。 AIが壁に当たってプレイヤーの範囲から外れると、AIは常にスピンし始めます。それがなぜそうし続けるのかうまくいかない。衝突が発生したとき、Aiはいつも回転します

私は単純なことを逃しているかもしれません... 何か助けてくれてありがとう。あなたが継続的に継続的にRotate()を使用してオブジェクトに回転を適用し、あなたの更新()でrandomMovement()を呼び出しているので、それが継続的に回転している

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

理由があります。あなたが何をしようとしているかのように聞こえるのは、オブジェクトが数秒ごとに無意味にさまようようにすることです。あなたは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); 
    } 
} 
関連する問題