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

Unity2D

Unity2D ARPG

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    private void PlayerMove() {
        if (PushedArrowKeyList.Count > 0) {
            // 最初に押されているキーの方向に移動
            switch (PushedArrowKeyList[0]) {
                case KeyCode.LeftArrow:
                    vx = -speed;
                    if (PushedArrowKeyList[1] == KeyCode.UpArrow) {
                        vy = speed;
                    } else if  (PushedArrowKeyList[1] == KeyCode.DownArrow) {
                        vy = -speed;
                    }
                    break;
                case KeyCode.RightArrow:
                    vx = speed;
                    if (PushedArrowKeyList[1] == KeyCode.UpArrow) {
                        vy = speed;
                    } else if  (PushedArrowKeyList[1] == KeyCode.DownArrow) {
                        vy = -speed;
                    }
                    break;
                case KeyCode.UpArrow:
                    vy = speed;
                    if (PushedArrowKeyList[1] == KeyCode.LeftArrow) {
                        vx = -speed;
                    } else if  (PushedArrowKeyList[1] == KeyCode.RightArrow) {
                        vx = speed;
                    }
                    break;
                case KeyCode.DownArrow:
                    vy = -speed;
                    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の教本とかにはこういうやり方は多分書いてないと思います。

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

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

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

それでは。