2016-10-15 16 views
1

移動しているかどうかに応じて、ウォーキングアニメーションとスタンディングアニメーションを切り替える単純なAI(単純な楕円)を作成しようとしています。Unity3D - 移動に基づいてアニメーションの状態を変更する

私は既にAIを設定してプレーヤに向けるようにしていますが、アニメーションの状態を切り替える方法はわかりません。

私はtrue場合は歩行アニメーションに切り替え、そしてfalse場合は常任アニメーションに切り替えるように設定されている、「isWalking」、アニメーターにBooleanパラメータを持っています。

私の問題は、オブジェクトが動いているかどうかをチェックする方法です。私は基本的にこのような何かをして、いくつかのコード書きたい :

If(object is moving) 
{ 
    isWalking == true; 
} 
else 
{ 
    isWalking == false; 
} 

を私は、Webで検索しましたが、私は解決策を見つけるしたことはありません。 私はrigidbody.IsSleeping()を使ってオブジェクトがスリープ状態になっているかどうかを確認しましたが、使用方法の例は見つかりませんでした。

私はユニティとプログラミングの完全な初心者です。

ありがとうございます。 :)

enter image description here

The object, as shown in the inspector window

編集: 私はこのコードを試してみましたが、それと間違って何かがおそらくあります。 :/

Animatorクラスから
using UnityEngine; 
using System.Collections; 

public class aiscript : MonoBehaviour { 

    NavMeshAgent agent; 
    public Transform target; 
    public Animator anim; 
    Vector3 pos; 
    public GameObject monmon; 

    void Start() 
    { 
     pos = monmon.transform.position; 
     anim = GetComponent<Animator>(); 
     agent = GetComponent<NavMeshAgent>(); 
    } 


    void Update() 
    { 
     pos = monmon.transform.position; 
     Vector3 originalPosition = pos; 
     agent.SetDestination(target.position); 
     Vector3 difference = originalPosition - pos; 
     anim.SetBool("isWalking", difference.magnitude > 0.5f); 
    } 

} 
+0

アニメーターウィンドウで 'isWalking'ブール変数のsccreenshotを送信しますか?これはあなたの質問に答えるのに役立ちます – Programmer

答えて

0

、あなたはGetBool機能でそれを行うともSetBool機能とアニメーション状態を変更設定することができます。あなたも、私は

myAnim.SetBool("isWalking", false); 
myAnim.SetBool("isWalking", true); 
+0

申し訳ありませんが、私のオブジェクトは、周囲のプレーヤーの後で、シーンの周りを自由に移動します。オブジェクトの動きが止まったら、アニメーションを元のアニメーションに、アニメーションがプレーヤーに追いついているときはウォーキングアニメーションに変更する必要があります。オブジェクトが動いていないかどうかを確認する方法が必要です。 – MiekeUyt

+0

あなたの質問はアニメーターから 'isWalking'変数にアクセスしていると思いましたか? – Programmer

0

と後でisWalkingの状態を変更することができます

Animator myAnim; 

.....

myAnim = GameObject.Find("ObjectAnimatorIsAttachedTo").GetComponent<Animator>(); 

.....

if (myAnim.GetBool("isWalking") == true) 
{ 
    //Is walking..... 
} 
else 
{ 
    //Is not walking 
} 

あなたのオブジェクトには剛体が取り付けられていると仮定しますそれを動かすために、そしてアニメーター。

もしそうなら、あなたは剛体の速度ベクトルをチェックし、大きさを特定の閾値にチェックするだけです。

スレッシュホールドが0.5fであるとします。これは、オブジェクトが0.5単位/秒を超えていずれの方向にも移動している場合は実行中とみなされ、そうでない場合は動作しているとみなされます。

Animator myAnimator; 
Rigidbody myRigidbody; 

void Awake() { 
    this.myAnimator = GetComponent<Animator>(); 
    this.myRigidbody = GetComponent<Rigidbody>(); 
} 

void Update() { 
    myAnimator.SetBool("isWalking", myRigidbody.velocity.magnitude > 0.5f); 
} 

EDIT:

それを最適化するには、アニメーター

int isWalkingAnimationId = Animator.StringToHash("isWalking"); 

のブールパラメータのハッシュを保存し、文字列の代わりにそれを使用することができます。

myAnimator.SetBool(isWalkingAnimationId , myRigidbody.velocity.magnitude > 0.5f); 

UPDATE:剛体の運動学的であるそれはあなたを思わ

、速度は常になります(0,0,0)。 私はあなたがオブジェクトを移動するためにtransform.positionを手動で変更していると思います。そうである場合:

Vector3 originalPosition = transform.position; 
// Your manual changes on transform.position 
Vector3 difference = originalPosition - transform.position; 
myAnimator.SetBool("isWalking", difference.magnitude > 0.5f); 
+0

なんらかの理由で私はそれを動作させることができません。 :/ おそらく、私のオブジェクトコンポーネントの設定方法と関係がありますか?インスペクタウィンドウのスクリーンショットを追加しました。ありがとう:) – MiekeUyt

+0

私は答えを更新しました。 リジッドボディはキネマティックです。 https://docs.unity3d.com/ScriptReference/Rigidbody-isKinematic.html – Lupi

+0

ありがとうございました:) 私はあなたのアドバイスを使用して私の試みで質問を更新しました: – MiekeUyt

関連する問題