2016-10-25 19 views
1

は、私は、このリンクで最初の答えをステートマシンを使用するように助言された。私はまだRaycastHitとLookAtの問題を解決することができません。

State Machine

が、私は今のことを必要とIIFはよく分かりません。私の問題は解決しやすいはずです。私はまた、ステートマシンの使い方をまだ理解していませんでした。

RaycastHitとLookAtを使用している最初の部分では、マウスの周りをマウスで動かすと回転してマウスの位置に向いています。この部分は私のデフォルトアイドル状態でなければなりません。ゲームを実行しているときに、プレーヤーが歩いて目標ポイントに達するたびに(マウスをクリックした位置)

他の2つの状態は、アイドルとウォーキングであり、両方とも、ヒューマノイドウォークおよびヒューマノイドイドルを使用するアニメーション状態である。私がマウスボタンをクリックすると、プレイヤーはクリックされたマウスの位置を目標に「歩く」ことになり、そこに到達すると「アイドル」になり、LookAtモードに戻り、再びマウスを動かすことができます。回転してマウスに面します。

しかし、キャラクターがマウスクリックポイントに到達したときに、彼はクレイジーナンバーストップのように回転し始めます。マウスを動かすと、マウスの動きに沿って歩くことになります。これは私が望むものではありません。

私は1.0fから2.0fまでの距離をテストのため3.0fに変更しようとしましたが、問題のいずれも解決しませんでした。

ゲームを実行すると、文字がマウスが何とかこの部分の結合すべき位置をクリック到達したとき、メインアイドル状態:

_animator.CrossFade("Idle", 0); 

これを:アイドル状態で

RaycastHit hit; 
      Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 

      if (Physics.Raycast(ray, out hit) && hit.collider.name != "ThirdPersonController") 
      { 
       transform.LookAt(hit.point); 
      } 
      else 
      { 
       transform.LookAt(ray.GetPoint(100)); 
      } 

をスクリプトです:

using UnityEngine; 
using System.Collections; 

public class MoveObjects : MonoBehaviour { 

    private Animator _animator; 

    void Start() 
    { 
     _animator = GetComponent<Animator>(); 
     _animator.CrossFade("Idle", 0); 
    } 

    void Update() 
    { 
     MovePlayerWithMouse(); 
    } 

    private void MovePlayerWithMouse() 
    { 
     RaycastHit hit; 
     Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 

     if (Physics.Raycast(ray, out hit) && hit.collider.name != "ThirdPersonController") 
     { 
      transform.LookAt(hit.point); 
     } 
     else 
     { 
      transform.LookAt(ray.GetPoint(100)); 
     } 
     if (Input.GetMouseButtonDown(0)) 
     { 
      if ((transform.position - hit.point).magnitude < 1.0f) 
      { 
       _animator.CrossFade("Idle", 0); 
      } 
      else 
      { 
       _animator.CrossFade("Walk", 0); 
      } 
     } 
    } 

答えて

1

「knそれがポイントになった。それ自身の中の一点を見ると、それは足の点に向かって回転しようとすると、不規則に回転します。

文字がその宛先に到達するタイミングを調べ、fsmの現在の状態が宛先に到達したときに変更されるかどうかをデバッグし、期待するときに「アイドル」状態になっているかどうかをデバッグしますさあ。もしそうでなければ、私は条件を改めるでしょう。

また、レイキャストにコライダー文字列の比較を使用しないでください。速度が遅くて面倒です。私は無視するものにコリジョン行列を設定する別のコントローラ(ゲームループの実行順序メニューで最初に実行される)を持っています。

https://docs.unity3d.com/Manual/LayerBasedCollision.html

これは、エディタのメニューですが、ゲームにアクセスすることができます。このコントローラーでは、次に層の名前を設定し、衝突の例外をここに追加します。

衝突を無視するための「一回限りの」例外が必要な場合は、 < layerNumberの形式になるレイアマスクを使用します。

コード内のレイヤータグからレイヤー番号を取得することもできます。これは、基本的には、各層の衝突を無視するかどうかを1つの整数で表現することによって行われます(32ビットの最大値は32ビットです)。すべてのビットは1(無視する)または0(そのレイヤーのコリジョンを検出する)にすることができます。無視するすべてのレイヤの最終的な結果を得るために、bitwise &(基本的に各anded整数から1を組み合わせる)を使用して複数のレイマスクを組み合わせることができます。

関連する問題