【Unity2D】ドアの実装と仕掛けによる開錠

Unity2D

Unity2D ARPG

無事にオブジェクト移動による仕掛けの動作が完成したので、それをトリガーとして扉を開く仕組みを作ります。

現状オブジェクトが保持する正解位置に行くと「正解」と表示していたのでそこをトリガーにしてみましょう。

開く扉の情報をオブジェクトに持たせる

オブジェクトが正解位置に来た時に開く対象の扉を設定しておき、
正解の通知が来たら対象オブジェクトのスクリプトを実行して何かをするという仕組みにします。

まずは_ObjectStateGeneralにオブジェクトを保持する変数を作りましょう。

    // 対象ギミックオブジェクト
    public GameObject gimicObj;

    // ギミック動作フラグ
    private bool _gimicFlag = false;
    public bool GimicFlag
    {
        get
        {
            return _gimicFlag;
        }
        set
        {
            _gimicFlag = value;
        }
    }

これでプロパティから対象オブジェクトに設定できます。

プレハブの大本ではなくプレハブ側でオブジェクト設定をしてやらないと両方とも同じオブジェクトになるので注意しましょう。

さらに正解位置になったときにMove_Playerから通知をもらうためのフラグを作りました。

外部から書き換えるのでセッターは必須です。

ゲッターはいらないかもですが一応作っておきました。

これをMove_Playerから操作します。

if (checkGrabObjTruePos(castFront))
{
    castFront.collider.GetComponent<_ObjectStateGeneral>().GimicFlag = true;
    Debug.Log("正解");
}
else
{
    Debug.Log("不正解");
}

これで正解位置になったときにフラグをTrueにすることができました。

そしてTrueとなった時に対象オブジェクトを消えるようにします。

GameObjectにenabledプロパティがないしsetActiveもできなかったので、
一旦画面の見えないところに移動させるという苦肉の策をとりました。

解決次第変更します。

_ObjectStateGeneralを少し改変して新たな関数を付け加えました。

    void Update()
    {
        if (this.tag == "Grab_Push")
        {
            // 位置リセットフラグチェック
            _posInitFlagCheck();
            // 位置リセット
            _posInit();

            // ギミックフラグがONであれば対象オブジェクトを消す
            _GimicOnHiddenObj();
        }
    }

    // GimicがOnになったら対象のオブジェクトを消す
    private void _GimicOnHiddenObj()
    {
        if (_gimicFlag)
        {
            // 対象のオブジェクトを見えない場所に移動させる
            gimicObj.transform.localPosition = Vector3.zero;
            // 何度も動かさないようにギミックフラグは消す
            _gimicFlag = false;
        }
    }

押すオブジェクトはタグを「Grab_Push」にしました。

このオブジェクトを持つものだけがUpdateで動くように条件を付けました。

これを付けないとドアも一緒に消えてしまいます(笑)

_GimicHiddenObjの関数でギミックフラグがオンになったら作動するようにしました。

これで連動する扉が消えてくれます。

ギミックフラグがONの場合はずっとこの関数が動いてしまうのでフラグを消しましょう。

もし移動するたびに復活する仕掛けにも使えますから切っておくのがベストですね。

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

次回はモンスターをすべて倒したら扉が開く仕掛けを作りましょう。

モンスターの設定から始めないとだめですね。

それでは!