【Unity】3.アニメーションが移行してくれない【初心者記事】

#詰みました

　まさか本当に[前回の記事](https://qiita.com/unity_mitton/items/bf67cc6b56ca5a712820)から即詰むとは自分でも思っていませんでしたよ。
　いやー毎日更新目標にしてるのに、記事のネタが無くなるの怖いなーとか思っていたんですけどもね、はい。

　**杞憂でした！**

　モーションを組み込めたは良いもの静止→歩くへのモーションに移行してくれないのだ！!※解決してます
　エラーも出てくれない！
![bandicam-2019-01-14-22-34-10-479.gif](https://qiita-image-store.s3.amazonaws.com/0/286514/9329dfff-7631-1d84-5b06-40daaedf30fc.gif)

　こんな感じです。
　豪鬼の阿修羅閃空みたいになってる（知らない人は調べてみてね！）

　では、早速解決する為に原因を考えてみましょう！


#推理編

##Animatorの設定が間違っている説

　実は私が今まで作ったオリジナルのゲームとアプリは、アニメーションを使っていない。基本addforce等で動かしているだけだ。
　もちろんチュートリアルで使用したことはあるのだが、これで合っている！という確たる自信は無い。

　数々のQiitaに投稿されている素晴らしいAnimatorのチュートリアルを見て、自分に間違いはないか念入りに確認する。
　結果……

　**完璧でした**

##Transition周りの設定が間違っている説
　Transitionとは、Animationの移行をする時に使う矢印のことである。（大体あってるハズ

　この矢印通りに動かすには、Parameterを入れ組む必要があるのだが、
　Parameterはbool型だとかTrigger型だとかint型だとかに最初に設定する必要があり(今回はbool)
　その設定を間違えているのでは無いか？　うっかりでParameterの名前を間違えているのは？
　結果……

　**大丈夫でした**

##プログラミングコードに問題がある説
 
　上二つが合っているなら、正直これしかない。
　しかしエラーが出てこないので、自分にはとんと皆目見当が付かないのだ。

　![スクリーンショット (331).png](https://qiita-image-store.s3.amazonaws.com/0/286514/ee26f93e-d003-feab-f7a3-406947fa4e3b.png)

　このコードはとあるチューリアル系ブログから拝借し、少しだけ手を加えたものだ。
　わかる人ならこれを見ただけで、なぜ上二つが合っており、なおかつエラーが出ないにも関わらず阿修羅閃空しているのかわかると思う。

　しかし私にはどうしてもわからなかった！
　SNSの力を借り、どこが間違っているのか教えてくれと吠え、哭き、叫ぶ。
　結果……


#解決編

##void Update()の罠

　上のコード、よく見てみると


  `animator.SetBool("isFWalking", false);`

　この部分がUpdate(ﾌﾚｰﾑ毎に実行)されている。
　つまり、永遠にisFWalkingがfalseになっていたのだ！！

　このbool型、trueとfalesを同時に受け取ることはできないらしく、
　永遠にfalseがUpdateされているためtrueされなかったという悲しいお話だ。
　falseが入っていてもtrueの入力があればそっちを受け付けるだろうと、勝手に思っていた私が馬鹿だった。

　皆も気を付けて欲しい！

##訂正後のコード
 using UnityEngine;

// プレイヤーに関するスクリプト
public class PlayerController : MonoBehaviour
{

    [SerializeField] private Vector3 velocity;              // 移動方向
    [SerializeField] private float moveSpeed = 3.0f;        // 移動速度
     private Animator animator;

    private void Start()
    {
        animator = GetComponent<Animator>();
    }
    void Update()
    {
        velocity = Vector3.zero;
        // WASD入力から、XZ平面(水平な地面)を移動する方向(velocity)を得ます
        if(Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow)){
            animator.SetBool("isFWalking",true);
            velocity.z += 1;         
        }
        if(Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow)){
            velocity.x -= 1;
            animator.SetBool("isFWalking",true);
        }
        if(Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow)){
            velocity.z -= 5;
            animator.SetBool("isFWalking",true);
        }
        if(Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow)){
            velocity.x += 1;
            animator.SetBool("isFWalking",true);
        }
        if (velocity == Vector3.zero ){
         animator.SetBool("isFWalking", false);
        }

    // 速度ベクトルの長さを1秒でmoveSpeedだけ進むように調整します
    velocity = velocity.normalized * moveSpeed * Time.deltaTime;

        // いずれかの方向に移動している場合
        if (velocity.magnitude > 0)
        {
            // プレイヤーの位置(transform.position)の更新
            // 移動方向ベクトル(velocity)を足し込みます

            transform.rotation = Quaternion.LookRotation(velocity);
            transform.position += velocity;
        }
    }
}







 動いてくれ！！

##結果

![bandicam-2019-01-14-23-35-45-983.gif](https://qiita-image-store.s3.amazonaws.com/0/286514/2a4c6e92-0759-39d9-5ea9-eabd8458c684.gif)

　動いた！


#今回の教訓

　今回の教訓としてはズバり、**Updateに気を付けろ！**

　こいつはif文等での条件を指定しない限り、永遠と実行し続けるメソッドだ。
　それが災いし、私の様な被害者を生み出してしまった。

　もし私と同じようなミスをして途方に暮れている初心者がいたら、この記事が救いになることを心から願う。
　※あと今までアニメーションを蔑ろにしてゲームを作っていたのも悪い！


　それではまた！
　ブログを書く時間が思った以上に多いので、休みにまとめて記事を作る方向に変えようかなと考えています。