【unity】3D脱出ゲーム作成_その3

3D脱出ゲーム

前回プレイヤーの主観カメラ設定まで完了しました。今回からゲームの中身であるギミック入りのオブジェクトを作成していきます。

ボタンを正しい回数押して開く箱

開くというより蓋が外れるギミックを作成します。まずは箱と蓋とナイフを用意して以下の様に配置します。箱を親オブジェクトにすると効率が良いです。位置は部屋の隅でプレイヤー目線より少し上にしました。ナイフについては自分で作ったものの造形が変だったので、後々使おうかと思ってる銃も含めてasset storeからダウンロードしました。→https://assetstore.unity.com/packages/3d/props/guns/light-weight-modern-weapons-pack-131527

蓋付きの箱:蓋の子として3Dオブジェクト>Legacy>TextMesh
蓋が外れた後:内側の凸はprobuilderで作成、中にナイフ

蓋にTextMeshで”DUDD”と書きました。これは蓋の下→上→下→下を押せば良いというヒントになります。UI>Canvasを設置(PlayerCanvasも今後設置するので名前はBoxCanvasとしておく)_子としてUI>Legacy>Buttonを上下に二つ付けて蓋の上部分と下部分にピッタリ付けます。Buttonの子テキストは削除して見た目にはボタンが付いてるか分からない様にします。

箱の外し方ですがシンプルに蓋に重力を付けて落とす様にします。内側の凸に蓋を押し出す仕掛けが付いており、正しく押すと作動するというイメージになります。蓋にRigidbodyコンポーネントを追加>UseGravityをオンにしましょう。また蓋のすり抜け防止の為、蓋とその接触部分(箱の内側と地面)のColliderの形状を調整して自然に落ちる様にしましょう。

以下スクリプトを作成し、箱にアタッチします。*今回は順不同の正誤判定になります。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;//UIのボタンを扱う

public class BoxManager : MonoBehaviour
{
    public GameObject BoxEnter;//蓋
    public GameObject ButtonUp;//上ボタン
    public GameObject ButtonDown;//下ボタン
    private int countU;//上ボタンが押された回数
    private int countD;//下ボタンが押された回数
    void Start()
    {
        countU = 0;
        countD = 0;
        BoxEnter.GetComponent<Rigidbody>().isKinematic = true;//重力無効
    }
    public void CountButtonUp()//上ボタンのButton>OnClickにアタッチ
    {
        countU++;
        Debug.Log("up" + countU);//上ボタンが押された回数をConsoleに表示
     if (countU == 1 && countD == 3)
        {
            BoxEnter.GetComponent<Rigidbody>().isKinematic = false;//重力有効
            ButtonUp.SetActive(false);
            ButtonDown.SetActive(false);
        }
        else if(countU > 1 || countD > 3)
        {
            Start();//最初の状態に戻す
        }
    }
    public void CountButtonDown()//上ボタンのButton>OnClickにアタッチ
    {
        countD++;
        Debug.Log("down" + countD);//下ボタンが押された回数をConsoleに表示             if (countU == 1 && countD == 3)
        {
            BoxEnter.GetComponent<Rigidbody>().isKinematic = false;//重力有効
            ButtonUp.SetActive(false);
            ButtonDown.SetActive(false);
        }
        else if(countU > 1 || countD > 3)
        {
            Start();//最初の状態に戻す
        }
    }
}

まずStartメソッドでRigidbody3Dコンポーネント>isKinematicをオンにします。これで重力の影響を受けずに止まった状態になりますので、上ボタン1回かつ(&&)下ボタン3回の条件が整ったらisKinematicをオフにします。上ボタン1回以上又は(||)下ボタン3回以上押されるとゲームが進まなくなるので、回数を0に戻します。

SetActiveは今後も多様するのですが、要はオブジェクトをシーン上で有効にするか無効にするかになります。蓋が外れて落ちた後ボタンだけ残っていても邪魔なのでSetActive(false)で無効にしました。Destroyではないので削除はされずにまた有効にできます。

後は上下のボタンオブジェクトのOnClick()に対応メソッドをアタッチすることで、ボタンを押して反応するようになります。今回はわざわざ複数メソッド作成しましたが、もう少しスッキリしたやり方もあるので今後紹介します。

ズームカメラに切り替え

箱のギミックは完成しましたが、その2で作成したプレーヤーカメラは部屋の中心で回転する仕様であったためボタンが押しにくいです。その為箱にアングルを合わせた新たなカメラを設置します。カメラは同一シーンで2つ以上操作できないので、先程のSetActiveを活用して切り替えます。

箱オブジェクトにEventTriger>PointerClickを追加して切り替えボタン⇄UIで戻るボタンを設置します(適当なマークを用意しました)。*オブジェクトにクリックイベントを追加する場合カメラにPhysicsRaycaster(クリック検知機能)を追加する必要があります。設定はいじらなくて大丈夫です。

BoxManagerクラスに以下を追加します。*変更のないメソッドは記載しません

public GameObject playerCamera;
public GameObject boxCamera;//BoxCanvasの子_箱用カメラ
public GameObject buttonBackBox;//箱用カメラの子_戻るボタン
public void BoxClicked()//PointerClickを追加してアタッチ
    {
        playerCamera.SetActive(false);
        boxCamera.SetActive(true);
    }
public void PushButtonBackBox()//OnClickにアタッチ
    {
        playerCamera.SetActive(true);
        boxCamera.SetActive(false);
    }

SetActiveは親→子に連動しますのでボタンのSetActiveは不要です。

以下完了デモになります。

ズームカメラに切り替え⇄戻す
ボタンを正しい回数押して開く箱

蓋が外れるギミックは満足のゆくものになるまでやや時間がかかるかもしれません。Rigidbodyを調整したりColliderの形状を変えたりしてみましょう。

次回以降で他にもいくつか箱にギミックを盛り込んでみようかと思います。

コメント

タイトルとURLをコピーしました