2017-05-08 14 views
0

私は単純なパトロールスクリプトに取り組んでいますが、すべてがうまくいきますが、周りを回るときに文字がランダムに床を転がっています。ここではそれらの短いクリップ...ここ なぜ私のキャラクターは床にひっくり返っていますか?

https://gfycat.com/gifs/detail/EnchantedShabbyChihuahua

は私のスクリプトです...

public class Patrol : MonoBehaviour 
{ 
    public float speed = 5; 
    public float directionChangeInterval = 1; 
    public float maxHeadingChange = 30; 
    public bool useRootMotion; 

    CharacterController controller; 
    float heading; 
    Vector3 targetRotation; 

    Vector3 forward 
    { 
     get { return transform.TransformDirection(Vector3.forward); } 
    } 

    void Awake() 
    { 
     controller = GetComponent<CharacterController>(); 

     // Set random initial rotation 
     heading = Random.Range(0, 360); 
     transform.eulerAngles = new Vector3(0, heading, 0); 

     StartCoroutine(NewHeadingRoutine()); 
    } 

    void Update() 
    { 
     transform.eulerAngles = Vector3.Slerp(transform.eulerAngles, targetRotation, Time.deltaTime * directionChangeInterval); 
     if (useRootMotion) 
     { 
      return; 
     } 
     else 
     { 
      controller.SimpleMove(forward * speed); 
     } 
    } 

    void OnControllerColliderHit(ControllerColliderHit hit) 
    { 
     if (hit.gameObject.tag == "Player") 
     { 
      // Bounce off the obstacle and change direction 
      var newDirection = Vector3.Reflect(forward, hit.normal); 
      transform.rotation = Quaternion.FromToRotation(Vector3.forward, newDirection); 
      heading = transform.eulerAngles.y; 
      NewHeading(); 
     } 
     if (hit.gameObject.tag == "Boundary") 
     { 
      // Bounce off the obstacle and change direction 
      var newDirection = Vector3.Reflect(forward, hit.normal); 
      transform.rotation = Quaternion.FromToRotation(Vector3.forward, newDirection); 
      heading = transform.eulerAngles.y; 
      NewHeading(); 
     } 
    } 


    /// Finds a new direction to move towards. 
    void NewHeading() 
    { 
     var floor = transform.eulerAngles.y - maxHeadingChange; 
     var ceil = transform.eulerAngles.y + maxHeadingChange; 
     heading = Random.Range(floor, ceil); 
     targetRotation = new Vector3(0, heading, 0); 
    } 

    /// Repeatedly calculates a new direction to move towards. 
    IEnumerator NewHeadingRoutine() 
    { 
     while (true) 
     { 
      NewHeading(); 
      yield return new WaitForSeconds(directionChangeInterval); 
     } 
    } 
} 

は、私が文字に剛体を追加すると回転を制約しようとしたが、それdoesntの作業があります。奇妙なことに、キャラクターコントロールは全く回転していません。シーンビューではキャラクターのコライダーがそのままになっているのを見ることができますが、キャラクターはそれ自身でメッシュをめくっていきます。

答えて

1

彼らはコーナーに歩いていて、2つの壁の間で常にバウンスされているために、奇妙な動作をするようです。私は一連の非常に速い衝突をチェックする方法を追加して、コーナーにいるかどうかを検出し、それに応じて適応します。おそらく、180度回転させて歩くなどの方法があります。

あなたはこのようにそれを行うことができます。複数の衝突が互いの0.1秒以内に存在する場合、あなたはそれを扱うことができることを意味し

float fTime = 0.1f 
float fTimer = 0; 
int iCollisionCounter; 
if(collision){ 
    if(fTimer > 0) iCollisionCounter++; 
    if(iCollisionCounter >= 5) //Character is stuck 
    fTimer = fTime; 
} 
Void Update(){ 
    fTimer -= time.deltaTime; 
} 

希望すると便利です。

+0

私はそれを私のOnColliderHitメソッドに追加しようとしましたが、デバッグメッセージをスローすることができません。 –

+0

シーン内のキャラクターが1つだけで、壁に衝突するたびにデバッグをスローすることができますか、実際にコーナーで急速に衝突しているかどうかを確認することができますか? –

関連する問題