【Unity2D】防御と回避の実装

Unity2D

Unity2D ARPG

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

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

前回「【Unity2D】オブジェクトを押す・引く処理を実装する」にて押す・引く処理を実装しました。

残りの基本的なアクションは防御と回避!

防御の実装は簡単ですが、回避はちょっとクセがありそうですね。

シャベルで掘るアクションも付けたかったのですが、ちょっと後回しにします。

まずは普通にARPGとして遊べるようにしたいと思います。

防御の実装

まずは簡単な防御の実装から行きましょう。

もう掴む処理である程度完成しているので、ちゃちゃっと実装しましょう!

GrabでGキーが使っちゃってるので、Sとかにしてみましょうか。

まずはキー入力を実装します。

    // キーチェック関数
    private void KeyCheck() {
        // 十字(上下左右)
        KeyAddRemove(KeyCode.LeftArrow);
        KeyAddRemove(KeyCode.RightArrow);
        KeyAddRemove(KeyCode.UpArrow);
        KeyAddRemove(KeyCode.DownArrow);

        // 掴み(G)
        KeyAddRemove(KeyCode.G);

        // 防御(S)
        KeyAddRemove(KeyCode.S);

お好きなキーで大丈夫です。

後にキーコンフィグを出来るようにしたいので他のキーと被らなければ正直なんでもOKです。

次に防御アニメーションと切り替え関数を実装しましょう。

やることはほぼ掴みと同じです。

    private void CharaMove() {
        // キー押チェック
        KeyCheck();

        // キー状態を見て移動
        PlayerMove();
        PlayerAttack();
        if (PushedArrowKeyList.Contains(KeyCode.G)) {
            PlayerGrab();
        } else {
            PlayerGrabRelease();
        }
        if (PushedArrowKeyList.Contains(KeyCode.S)) {
            PlayerGuard();
        } else {
            PlayerGuardRelease();
        }

    }

このままだと掴みと防御が同時に出来てしまうので、
一通りプレイヤーアクションが完成したら全体を見渡しておかしいところの制御をしたいと思います。

とりあえずは実装してしまいましょう!

続いてPlayerGuardとReleaseの関数を作ります。

これもほぼ掴みと同じです。


    private void PlayerGuard() {
        // 向いてる方向のガードにする
        if ( nowAnim != (nowAnim-nowAnim%10) + 3) {
            nowAnim = (nowAnim-nowAnim%10) + 3;
            animator.SetInteger("AnimIdx",nowAnim);
        } else {
            // ガード中から回避行動待機
            PlayerAvoidance();
        }
        Debug.Log("ガード中");
    }
    private void PlayerGuardRelease() {
        if ( nowAnim == (nowAnim-nowAnim%10) + 3) {
            nowAnim = nowAnim-nowAnim%10;
            animator.SetInteger("AnimIdx",nowAnim);
        }
        Debug.Log("ガード解除");
    }

ほぼ一緒ですね。

特に説明することはないです。

変更しているのは関数名とアニメーションの+してる数値ですね

防御は1桁目が3にしてあります。

次に回避処理であるAvoidance関数を作ります。

    // 回避処理
    private void PlayerAvoidance() {
        switch(nowAnim - nowAnim%10) {
            case 0:
                if (PushedArrowKeyList.Contains(KeyCode.UpArrow)) {
                    PlayerAvoid(1);
                } else if (PushedArrowKeyList.Contains(KeyCode.LeftArrow)) {
                    PlayerAvoid(2);
                } else if (PushedArrowKeyList.Contains(KeyCode.RightArrow)) {
                    PlayerAvoid(3);
                }
                break;
            case 10:
                if (PushedArrowKeyList.Contains(KeyCode.DownArrow)) {
                    PlayerAvoid(0);
                } else if (PushedArrowKeyList.Contains(KeyCode.LeftArrow)) {
                    PlayerAvoid(2);
                } else if (PushedArrowKeyList.Contains(KeyCode.RightArrow)) {
                    PlayerAvoid(3);
                }
                break;
            case 20:
                if (PushedArrowKeyList.Contains(KeyCode.UoArrow)) {
                    PlayerAvoid(0);
                } else if (PushedArrowKeyList.Contains(KeyCode.DownArrow)) {
                    PlayerAvoid(1);
                } else if (PushedArrowKeyList.Contains(KeyCode.RightArrow)) {
                    PlayerAvoid(3);
                }
                break;
            case 30:
                if (PushedArrowKeyList.Contains(KeyCode.UoArrow)) {
                    PlayerAvoid(0);
                } else if (PushedArrowKeyList.Contains(KeyCode.DownArrow)) {
                    PlayerAvoid(1);
                } else if (PushedArrowKeyList.Contains(KeyCode.LeftArrow)) {
                    PlayerAvoid(2);
                }
                break;
        }
    }

これもほぼ掴み引押と同じですね。

違うのは向いてる方向以外に動けるところでしょうか。

そして実際の回避処理であるAvoidも作りましょう。

    private void PlayerAvoid(int direct) {
        switch(direct) {
            case 0:
                vy = -(speed*2);
                break;
            case 1:
                vy = speed*2;
                break;
            case 2:
                vx   = -(speed*2);
                break;
            case 3:
                vx = speed*2;
                break;
        }
        Debug.Log("回避");
    }

回避は素早く行きたいので移動速度の2倍にしてみました。

今のところ引く・押す・回避のアニメーションに切り替えはしてないのですが
制御処理をした後にでも入れておきましょう。

回避は一定距離進むまで操作不能にした

今のところ向いてる方向以外は回避できるのですが、
あまりにもリスクがない状態です。

回避があるゲームを見てみると、大抵一定の距離までは操作不能な状態で移動したりしてますよね。

モンハンの回避とかもそんな感じです。

この処理はあとから実装しますがやり方としては、
現地点から一定値加算されるまでフラグを切り替えたままとかで実装できそうですね。

これで基本的なアクションは揃いました。

どれもこれも雑いので次回はそれぞれの処理のクオリティを上げていきましょう。

それでは。