【Unity2D】オブジェクトを押す・引く処理を実装する

Unity2D

Unity2D ARPG

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

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

前回「【Unity2D】Linecastを使って掴み処理を実装する」にて掴む処理を実装できました。

あとは引っ張る処理と押す処理が必要になってきますね。

掴んで停止するところまでは出来ましたので、あとは向いている方向に対して逆方向を押すか進行方向を押すかの分岐になります。

それでは今回は引っ張る処理を実装していきます。

掴んでいる状態で背後キーが有効になるようにする

向きはnowAnimの2桁目の0~3で判断していましたね。

掴んでいる最中はその状態を見て入力できるキーを制御します。

この場合はSwitchで現在の方向を見てcaseで分けたら良さそうです。

早速組んでみましょう。

    // 掴み処理
    private void PlayerGrab() {
        Debug.DrawLine(
                castPosition,
                castPosition - castPositionDistance,
                Color.red
        );
        is_lcast = Physics2D.Linecast(
            castPosition,
            castPosition - castPositionDistance,
            layerMask
        );

        if (is_lcast.collider != null) {
            if (is_lcast.collider.tag == "GrabOK") {
                // 向いてる方向の掴みにする
                if ( nowAnim != (nowAnim-nowAnim%10) + 5) {
                    nowAnim = (nowAnim-nowAnim%10) + 5;
                    animator.SetInteger("AnimIdx",nowAnim);
                } else {
                    // 引っ張るか押す処理
                    PlayerPullPush();
                }
            }
        }
    }

初回時には掴むのアニメーションになるので、次のフレームで掴んでいる最中はPlayerPullPush関数が呼ばれ続けます。

この中身を作っていきます。


    private void PlayerPullPush() {
        switch(nowAnim - nowAnim%10) {
            case 0:
                if (PushedArrowKeyList.Contains(KeyCode.UpArrow)) {
                    PlayerPull(1);
                } else if (PushedArrowKeyList.Contains(KeyCode.DownArrow)) {
                    PlayerPush(0);
                }
                break;
            case 10:
                if (PushedArrowKeyList.Contains(KeyCode.DownArrow)) {
                    PlayerPull(0);
                } else if (PushedArrowKeyList.Contains(KeyCode.UpArrow)) {
                    PlayerPush(1);
                }
                break;
            case 20:
                if (PushedArrowKeyList.Contains(KeyCode.RightArrow)) {
                    PlayerPull(3);
                } else if (PushedArrowKeyList.Contains(KeyCode.LeftArrow)) {
                    PlayerPush(2);
                }
                break;
            case 30:
                if (PushedArrowKeyList.Contains(KeyCode.LeftArrow)) {
                    PlayerPull(2);
                } else if (PushedArrowKeyList.Contains(KeyCode.RightArrow)) {
                    PlayerPush(3);
                }
                break;
        }
    }

    private void PlayerPull(int direct) {
        Debug.Log("引っ張り!");
    }
    private void PlayerPush(int direct) {
        Debug.Log("押し!");
    }

PlayerPullPush関数では現在の向きにおいて引っ張ったのか押したのかを判るようにしました。

それぞれの関数の引数に移動方向を渡しました。

この時点で掴んで前後にキーを押すとデバッグログが良い感じに流れてくれるはずです。

引っ張っているときにプレイヤーと掴んだオブジェクトを動かす

とりあえず今の状態で引っ張ることができるか?などの制限は考えず
とにかく引っ張る処理を作ってみましょう。

引っ張りキーを押したときにプレイヤーの座標を後ろにさげるのと同時に
掴んでいるオブジェクトの座標も一緒に変化させます。

PlayerPullの中身を書いていきましょう。

    private void PlayerPull(int direct) {
        switch(direct) {
            case 0:
                vy = speed/4;
                break;
            case 1:
                vy = -(speed/4);
                break;
            case 2:
                vx   = -(speed/4);
                break;
            case 3:
                vx = speed/4;
                break;
        }
        is_lcast.transform.Translate(vx/50, vy/50, 0);
    }

向きに応じてvxとvyを加減算しています。

あとはupdate側で移動処理してくれますね。

ついでに掴んだオブジェクトも移動させたいので、
取得したオブジェクト情報のtransformがもつTranslateでプレイヤーと同じように移動させます。

Unity2D ARPG

押す処理もついでに実装

引く処理が出来たらとは押す処理は逆にすればOKなのでちゃっちゃと実装しましょう。

    private void PlayerPush(int direct) {
        switch(direct) {
            case 0:
                vy = speed/4;
                break;
            case 1:
                vy = -(speed/4);
                break;
            case 2:
                vx   = -(speed/4);
                break;
            case 3:
                vx = speed/4;
                break;
        }
        is_lcast.transform.Translate(vx/50, vy/50, 0);
    }

内容一緒でした……

プログラミングは同じことを書くのはナンセンスなので、本来はこういったのは1つにまとめてしまうべきですが
この後に本当に押せるのかどうかの処理も追加したいので一旦同じコードでもわけています。

それでもなお同じコードがあった場合は1つの関数にして共通して呼び出せるようにしましょう。

今回は短いですがここまでです。

次回はプレイヤーかオブジェクトの後ろにぶつかってしまう障害物があった場合、
押す引く処理を中断する条件分岐を作っていきます。

それでは。