2016-08-16 9 views
0

私はこの問題に直面したとき、しばらくの間、3Dエンドレスランナーゲームに取り組んできました。横方向の動きの間に、各レーンを切り替えた後、私のキャラクターはちょうど、ゲームをプレイしている人にとっては目立つ2つの小数点を戻します(-z軸)。彼はいくつかの小数を逆戻りしているように感じる。問題は、この単純なコードtransform.position = locationAfterChangingLane;を追加した後に発生し、横方向の動きのオーバーフローを止めました。それはあふれることを止めましたが、この厄介なバグを作りました。Unityでオーバーフローを起こさずにキャラクターサイドウェイを移動するには?

(if文のコード行を更新方法でisChangingLaneに位置する。)

ここに私のスクリプトがあります(フル、また、私は簡単に参照できる場所を上記のコード行をコメントしています。)

//Variables for Lane switching 
    private bool isChangingLane = false; 
    private Vector3 locationAfterChanginLane = Vector3.zero; 
    private Vector3 sideWayMovementDistance = Vector3.right * 2f; // This might be the case that triggers abnormal movements 
    private float sideWaySpeed = 6f; 

    public enum Lane 
    { 
     Left, 
     Right, 
     Center 
    } 

    public enum MoveDirection 
    { 
     Left, 
     Right, 
     None 
    } 

    Lane currentLane = Lane.Center; 

    void Update() 
    { 
     currentBaseState = anim.GetCurrentAnimatorStateInfo(0); 

     if (controller.isGrounded) 
     { 
      verticalVelocity = -0.5f; 
      if (currentBaseState.fullPathHash == locoState) 
      { 
       if (Input.GetButtonDown("Jump")) 
       { 
        verticalVelocity = 18f; 

        anim.SetBool("Jump", true); 
       } 
       else if (Input.GetKeyDown(KeyCode.S)) 
       { 
        anim.SetBool("Slide", true); 
       } 

      } 

      MoveLeftRight(); // This is the method to move right and left. 

      if (isChangingLane) 
      { 
       if (Math.Abs(transform.position.x - locationAfterChanginLane.x) < 0.1f) 
       { 
        isChangingLane = false; 
        moveVector.x = 0; 
        transform.position = locationAfterChangingLane; // This is the code which throws this issue. 
       } 
      } 



     } 
    } 

    private void MoveLeftRight() 
    { 

     MoveDirection requestedMoveDirection = MoveDirection.None; 
     if (Input.GetKeyDown(KeyCode.A) && !isChangingLane) 
     { 
      requestedMoveDirection = MoveDirection.Left; 
      isChangingLane = true; 
     } 
     else if (Input.GetKeyDown(KeyCode.D) && !isChangingLane) 
     { 
      requestedMoveDirection = MoveDirection.Right; 
      isChangingLane = true; 
     } 

     switch (requestedMoveDirection) 
     { 
      case MoveDirection.Right: 
       if (currentLane == Lane.Right) 
       { 
        Debug.Log("Right Lane"); 
        break; //Do nothing when in right lane. 

       } 
       else if (currentLane == Lane.Center) 
       { 
        locationAfterChanginLane = transform.position + sideWayMovementDistance; 
        moveVector.x = +sideWaySpeed; 

        currentLane = Lane.Right; 
        Debug.Log("Center --> Right"); 
       } 
       else if (currentLane == Lane.Left) 
       { 
        locationAfterChanginLane = transform.position + sideWayMovementDistance; 
        moveVector.x = +sideWaySpeed; 

        currentLane = Lane.Center; 
        Debug.Log("Left --> Center"); 
       } 
       break; 
      case MoveDirection.Left: 
       if (currentLane == Lane.Left) 
       { 
        Debug.Log("Left Lane"); 
        break; //Do nothing when in left lane. 
       } 
       else if (currentLane == Lane.Center) 
       { 
        locationAfterChanginLane = transform.position - sideWayMovementDistance; 
        moveVector.x = -sideWaySpeed; 

        currentLane = Lane.Left; 

        Debug.Log("Center --> Left"); 
       } 
       else if (currentLane == Lane.Right) 
       { 
        locationAfterChanginLane = transform.position - sideWayMovementDistance; 
        moveVector.x = -sideWaySpeed; 

        currentLane = Lane.Center; 

        Debug.Log("Right --> Center"); 
       } 
       break; 
     } 
    } 

ヘルプをいただければ幸いです。これをどうすれば解決できますか?また、なぜこれが起こるのかを親切に説明できますか?どうもありがとう!

答えて

1

あなたのキャラクターがレーンを変えるときに瞬時に動きのあるアニメーションがあるようです。それは良いことですが、誰かが左または右を押す瞬間に目的地点を保存するようにも見えます。このポジションはメモリに保存され、約0.5秒後にレーンに完全に到着すると、そのポジションが後ろにとどまっています。

一度車線のアニメーションが終了したら、locationAfterChangingLaneのZコンポーネントをプレーヤーの現在のZコンポーネントに合わせて変更するだけです。または、そのベクトルを保存して設定する代わりに、特定の最大値を超えないようにMath.Max/Math.Min操作をプレーヤーの位置に適用します。

もうひとつの注意点:すべての数字が高い範囲に入っているため、無限ランナーを数分以上プレイすると数学の問題に遭遇する人もいます。単に世界の各セクションが単にまだ主人公を「スライド」させて、彼の後ろにリサイクルされているので、彼はまだ(0、0、0)にいるのです。

+0

すばらしいです!私はあなたのサイドノートを考えています。なぜなら、統一ユーザーの多くは、プレイヤーよりも世界をより良く動かすと言っているからです。だから私は世界のセクションを移動する方法を試してみるだろう。助けてくれてありがとう。 –

+0

私は世界を変えることについて知らない。これはクランプ値に戻ります。不必要な不正確さでフロートがどこからでも出血するのを防ぎます。 –