#詰みました
まさか本当に前回の記事から即詰むとは自分でも思っていませんでしたよ。
いやー毎日更新目標にしてるのに、記事のネタが無くなるの怖いなーとか思っていたんですけどもね、はい。
杞憂でした!
モーションを組み込めたは良いもの静止→歩くへのモーションに移行してくれないのだ!!※解決してます
エラーも出てくれない!
こんな感じです。
豪鬼の阿修羅閃空みたいになってる(知らない人は調べてみてね!)
では、早速解決する為に原因を考えてみましょう!
#推理編
##Animatorの設定が間違っている説
実は私が今まで作ったオリジナルのゲームとアプリは、アニメーションを使っていない。基本addforce等で動かしているだけだ。
もちろんチュートリアルで使用したことはあるのだが、これで合っている!という確たる自信は無い。
数々のQiitaに投稿されている素晴らしいAnimatorのチュートリアルを見て、自分に間違いはないか念入りに確認する。
結果……
完璧でした
##Transition周りの設定が間違っている説
Transitionとは、Animationの移行をする時に使う矢印のことである。(大体あってるハズ
この矢印通りに動かすには、Parameterを入れ組む必要があるのだが、
Parameterはbool型だとかTrigger型だとかint型だとかに最初に設定する必要があり(今回はbool)
その設定を間違えているのでは無いか? うっかりでParameterの名前を間違えているのは?
結果……
大丈夫でした
##プログラミングコードに問題がある説
上二つが合っているなら、正直これしかない。
しかしエラーが出てこないので、自分にはとんと皆目見当が付かないのだ。
このコードはとあるチューリアル系ブログから拝借し、少しだけ手を加えたものだ。
わかる人ならこれを見ただけで、なぜ上二つが合っており、なおかつエラーが出ないにも関わらず阿修羅閃空しているのかわかると思う。
しかし私にはどうしてもわからなかった!
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;
}
}
}
動いてくれ!!
##結果
動いた!
#今回の教訓
今回の教訓としてはズバり、Updateに気を付けろ!
こいつはif文等での条件を指定しない限り、永遠と実行し続けるメソッドだ。
それが災いし、私の様な被害者を生み出してしまった。
もし私と同じようなミスをして途方に暮れている初心者がいたら、この記事が救いになることを心から願う。
※あと今までアニメーションを蔑ろにしてゲームを作っていたのも悪い!
それではまた!
ブログを書く時間が思った以上に多いので、休みにまとめて記事を作る方向に変えようかなと考えています。