FC2ブログ

記事一覧

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スポンサーリンク

Unity 2D キャラクター移動 解説

これの解説?です!


アニメーションをさせるには、制御するためのスクリプトを書く他に
Unityのアニメーションシステムからアレコレ設定する必要があります。
今回はスクリプトの解説のみにして、アニメーションシステムの設定方法等は次回!ということにします。
(そっちのほうも詳しく書きたいので・・・)

移動の処理も入っていますが、アニメーションについてをメインに書いていきます。

まずはスクリプトを

2D_walk.jpg

・Animator でパラメータを設定
・何らかの条件でスクリプトからパラメータをセット
・変更されたパラメータに応じてアニメーションが遷移


こんな感じで実際にアニメーションを遷移させます。

※アニメーションはパラメータを基準にして遷移します。
Bool , Trigger , Int , Float の4種類があります。
例: Bool型パラメータ A がtrue なら アニメーションを遷移させる ....等

スクリプトのほうを見ていきます。

Update() 内から


まずは大きく2つに分岐しているのが分かると思います。
if(num == 0) と、 if(wait) です。

前者の方はキーの入力待ちと、入力後のアニメーション遷移の処理に続きます。
後者の方はキャラクターを移動させる処理が書いてあります。


ここを分けた理由はアニメーションの遷移より前にキャラクターが大きく移動するのを防ぐためです。
後で詳しく書きますが、キー入力後少しの時間待機することでアニメーションの遷移と移動のズレを埋めています。

if(num == 0) の中身を見てみます。
変数numは宣言時に0を代入されていますから
まずはこちらの処理が実行されるはずですね。

if(Input.GetKeyDown("")) というのは、”この中のキー”が押された時 という意味です。
a , d , w , s のそれぞれのキーが入力された時、変数 num に別々の数字が代入されるようになっています。

※GetKeyDown:キーが押された時
GetKeyUp:キーが離された時
GetKey:キーが押されている間
 とそれぞれ異なります。要注意!


移動方向上下左右にそれぞれ、wsadを当てはめています。
ネトゲとかでよくあるやつですね。

num に値を代入した後、 StartCoroutine でコルーチンを呼び出しています。
コルーチンはここでも使いました

途中で処理を止めることができるアレです。
下の方に宣言されています。

private IEnumerator WaitTime(float a) というところです。

float a で引数(関数等に渡す値)を受け取ります。
呼び出すときに StartCoroutine(WaitTime(0.02f)) としていますから
0.02を受け取るわけですね。

コルーチン WaitTime の中身を見てみると

anime.SetInteger("case" ,num);
となっています。

anime というのは最初の方に宣言してある、Animator コンポーネントを取得した変数です。
SetInteger というのは、少し触れたパラメータというやつに値をセットする という関数です。
この場合 Int 型(Integer)パラメータに 変数num の値をセットする という意味になります。
パラメータの説明は次回詳しくしますが、numの値に応じてアニメーションを遷移させる、という設定をしてあります。

パラメータをセットして、次に

yield return new WaitForSeconds(a);
となっています。
これは処理をa秒だけ止める、という意味で
a には呼び出すときに引数として与えた 0.02が当てはまります。

wait = true;
これは移動方向が決定、アニメーションの遷移処理もしたので
移動の処理をしてもOKですよ、という判定に使う変数です。
Update() 内の大きな分岐で if(wait) というところがありましたから
これでそちらの処理に進めるようになるわけですね。

ではif(wait) の中身を見てみます。

各方向(adws)で多少の違いはありますが、大体は同じです。
Input.GetKeyの説明は先程した通り、キーが押されている間は中の処理が実行されます。

transform.Translate();(Vector3型で指定)で指定した値だけtransformが加算されていきます。
transformが加算される = オブジェクトが移動するということです。

Input.GetKeyUp はキーが離された時の処理です。

anime.Play("",0,0.0f);
anime.speed = 0;
// "" の中はstate(ステート、状態)名で指定します。これはAnimator側で設定するものです。


これは アニメーション("この中で指定したもの")を0.0フレーム目から再生する
そして アニメーションのスピードを0にする という意味です。

※アニメーションスピードを0にすると他のアニメーションに遷移した後も0のまま。
元に戻す必要があるので注意。


これにどんな意味があるかというと
例えば左向きにキャラクターが歩いていたとして
キーを離したときに移動は終了するのに、アニメーションだけ動き続けていたらおかしくなってしまいます。
なのでアニメーションを最初のフレーム(各アニメーションの最初のフレームは直立姿勢に設定してあります)
に戻してアニメーションスピードを0にすることで
止まっているように見せる、という処理です。

最初は止まっている状態のアニメーションを各向きで用意してやっていたんですが
アニメーションの遷移に時間がかかるため、なるべく少なくしたかったので
色々試した結果この形になりました。

次に
wait = false;
num = 0;


で、また最初の状態に戻します。
つまりキー入力を受け付けて、移動方向を決定するところに戻るということです。

最後に

if(wait) に進むと

if(num == 4 && .....) とか if(num == 3 && .....) とか 書いてありますね。
これは何かというと、ある方向に移動中にはそれ以外のキー入力を受け付けない
という処理です。

num には最初にキーを入力したとき、そのキーに応じて数字を代入しています。
例えば最初に"a" キーを入力したとすれば num  には4が代入されています。
この場合

if(num == 4 && Input.GetKey("a")).... という条件には当てはまりますが
if(num == 3 && Input.GetKey("d")).....という条件には当てはまりませんね。

※&& は全ての条件が満たされる時 という意味です。

ある方向に移動中に別方向のキーを押して、アニメーションだけ遷移してしまう
という状況を防ぐためにこの処理を用意しました。


少し長くなりましたがおわりです!
次回はUnity側のAnimatorでの設定について書きます。


ありがとうございました。






スポンサーサイト

スポンサーリンク

コメント

コメントの投稿

非公開コメント

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。