【Unity2D】斜め移動できるようにしよう

Unity2D

Unity2D ARPG

こんにちは。なおキーヌです。

ブログ毎日更新は 311 日目になります。

前回「【Unity2D】キー入力を保持する配列を作ろう」にてキー配列を作成しました。

上下左右のどれかがキー配列の 0 個目に格納されるので、その値を見て移動させるように switch 文で分岐しました。

その弊害もあり斜め移動ができなくなってしまったので改良しましょう。

ネタバレすると配列の 1 個目の要素を見てさらに分岐させるだけです。

正直な所前回にまとめてしまえばよかったと思いました。

Unity2Dで ARPG 作成、第4回目始めましょう。

移動処理の分岐を細分化して斜め移動を実装しよう

移動処理は PlayerMove 関数を作って実装しました。

最初の分岐は switch 文でやりましたが、次に上下か左右かを判定する時は
if 文で分岐させようと思います。

正直どれが正解なのかはわかりませんね……

見やすいようにするが一番だと思います。

switch の中に switch が入っていたら個人的には見辛くなる気がします。

追記修正:2020/05/27 斜め移動しかできなくなってた。1 つしか押されてないときリスト範囲外である添え字 1 を参照しようとしてエラーがでていたため。

    private void PlayerMove() {
        if (PushedArrowKeyList.Count > 0) {
            // 最初に押されているキーの方向に移動
            switch (PushedArrowKeyList[0]) {
                case KeyCode.LeftArrow:
                    vx = -speed;
                    // キー配列が2つ以上リストに格納されている場合
                    if (PushedArrowKeyList[1].Count >= 2) {
                        if (PushedArrowKeyList[1] == KeyCode.UpArrow) {
                            vy = speed;
                        } else if  (PushedArrowKeyList[1] == KeyCode.DownArrow) {
                            vy = -speed;
                        }
                    }
                    break;
                case KeyCode.RightArrow:
                    vx = speed;
                    // キー配列が2つ以上リストに格納されている場合
                    if (PushedArrowKeyList[1].Count >= 2) {
                        if (PushedArrowKeyList[1] == KeyCode.UpArrow) {
                            vy = speed;
                        } else if  (PushedArrowKeyList[1] == KeyCode.DownArrow) {
                            vy = -speed;
                        }
                    }
                    break;
                case KeyCode.UpArrow:
                    vy = speed;
                    // キー配列が2つ以上リストに格納されている場合
                    if (PushedArrowKeyList[1].Count >= 2) {
                        if (PushedArrowKeyList[1] == KeyCode.LeftArrow) {
                            vx = -speed;
                        } else if  (PushedArrowKeyList[1] == KeyCode.RightArrow) {
                            vx = speed;
                        }
                    }
                    break;
                case KeyCode.DownArrow:
                    vy = -speed;
                    // キー配列が2つ以上リストに格納されている場合
                    if (PushedArrowKeyList[1].Count >= 2) {
                        if (PushedArrowKeyList[1] == KeyCode.LeftArrow) {
                            vx = -speed;
                        } else if  (PushedArrowKeyList[1] == KeyCode.RightArrow) {
                            vx = speed;
                        }
                    }
                    break;
                default:
                    break;
            }
            // 実際の移動処理
            this.transform.Translate(vx/50, vy/50, 0);
        }
    }

ちょっと見辛いコードになってしまいましたが、vx と vy を別々のコードにすると
コントローラーならありえないですがキーボードだと上下同時押しとかが出来てしまう為の対策です。

上下どちらかを押している時は左右しか認識させないように。

左右どちらかを押している時は上下しか認識せないように。

こういう細かな処理はゲーム作りする上で結構大事になってきます。

実際問題もうちょっと綺麗なコードの書き方あるかもしれませんが、最適化はあとからで大丈夫です。

これで斜め移動ができるようになりました。

次回は歩行アニメーションを導入してみよう

移動処理の延長線上の処理としてアニメーションを実装していきます。

処理は次回に回しますが、やっていく方法だけは書いておきます。

Unity はアニメーターというアニメーションファイルを管理する仕組みがあります。

フローチャートみたいな感じでアニメーションの遷移を作ることが出来るのですが、
これが意外と初心者殺しでして思ったようにきれいに遷移してくれないいうことが多かったりします。

3D モデルのアニメーションを制御する時は問題ないかもしれませんが、
2D ドット絵のようなモーションを作るときはちょっとばかり工夫が必要になったりします。

私の場合は上記のように 1 つのデフォルトステートからすべてに分岐させられるような仕組みにしています。

この辺は自分の納得いくやり方でいいと思います。

というのもアニメーションはこのアニメーターだけではなくスクリプト側で処理したいので
こういう形にしています。

Unity の教本とかにはこういうやり方は多分書いてないと思います。

大体は普通のやり方をやっているので、もし書籍にあるようなやり方でダメそうなら
私と同じやり方をしてみて使いやすいかどうかを判断してみてください。

答えは一つじゃないのが制作の楽しみです。

分からない場合は誰かに習ってしまって、あとは自分のやりやすいように改変していきましょう。

それでは。