Unityゲームの作り方メモ

【Unity】2D脱出ゲームの作り方

Unity

ユニティーを使用した2D脱出ゲームの作り方です。ゲーム制作の参考にしていただければ嬉しいです。トグルボタンをクリックすると記事が表示されます。小さくて見ずらい画像はクリックで拡大できます。

3D脱出ゲームの作り方はこちらの記事です。

素材の準備

部屋の作成

UI→panelを作成します。名前はPanelparentにしました。

このPanelparentをスクリプトで移動させて画面を切り替えるようにしていきます。

Panelparentのrecttransformeをcenterにしておきます。

Panelparentのimageコンポーネントは使用しないので消去します。

CanvasのRenderModeをScreenSpace-Cameraに変更します。

renderCameraにMainCameraを設定します。

CanvasScalerのUIScaleModeをScaleWithScreenSizeにします。

RefarenceResolutionを画面サイズにします。

Panelparentの下にpanelを作成します。名前はroom0にしました。

recttransformeをcenterにしてimageコンポーネントを消去しておきます。

room0の下にpanelを作成します。名前はbackGroundにしました。

imageに背景を設定します。色が薄くなっているのでAを255にします。

作成する部屋の数だけroomを複製します。私は二部屋にしました。

room1を移動させました。X-1500

それぞれの背景を設定します。

部屋の移動

部屋を移動させるための左右の矢印ボタンを作成します。

Canvasの下にimageを作成します。

矢印の画像を設定します。

addComponentからbuttonコンポーネントを追加します。

空のオブジェクトを作成します名前はallowsにしました。

作成した矢印ボタンをallowsの子オブジェクトにしておきます。

C#スクリプトを作成します。名前はPanelChangerにしました。

作成したスクリプトをpanelparentにアタッチします。

矢印をクリックした時にpanelparentを指定の位置に移動させるコードを書きます。

using UnityEngine;

public class PanalChanger : MonoBehaviour
{
    public GameObject _LeftArrow;
    public GameObject _RightArrow;
    private void Start()
    {
        //開始時はPanel0なので右矢印だけ表示したい
        HideArrows();
        _RightArrow.SetActive(true);
    }
    public void HideArrows()
    {
        //矢印を一旦消すための関数
        _LeftArrow.SetActive(false);
        _RightArrow.SetActive(false);
    }
    public void OnLeftAllow() 
    {
        //panel0を表示
        HideArrows();
        _RightArrow.SetActive(true);
        this.transform.localPosition = new Vector2(0, 0);

    }
    public void OnRightAllow() 
    {
        //panel1を表示
        HideArrows();
        _LeftArrow.SetActive(true);
        this.transform.localPosition = new Vector2(-1500, 0);
    }
}

room1はx-1500の位置にあるので右矢印を押したときにpanelparentをx-1500の位置に移動させれば画面を切り替えることができます。

panelparentのinspector画面から矢印をアタッチします。

矢印のボタンを設定します。

矢印のボタンで部屋の切り替えができるようになりました。

アイテムボックスの作成

canvasにimageを作成します。名前はItemboxにしました。

inspector画面からアイテムボックスの画像を設定します。

itemboxの下にimageを作成します。名前はBox0にしました。

inspector画面から鍵の画像を設定して位置をアイテムボックスの一番左に寄せました。

これを非表示にしておいてアイテムを取得したら表示するようにします。

新しくC#スクリプトを作成します。名前はitemboxにしました。

作成したスクリプトをItemboxにアタッチします。

SetItemでアイテムを取得した時にアイテムボックスの画像をアクティブにするようにします。

CanUseItemでアクティブ状態(所持しているかどうか)を読み取ります。

UseItemでアイテムを使用(非アクティブ)します

using UnityEngine;

public class ItemBox : MonoBehaviour
{


    public GameObject[] Boxs;
    public static ItemBox instance;

    private void Awake()
    {
        instance = this;
    }
    private void Start()
    {

    }
    public void SetItem(Item.Type type)
    {
        int index = (int)type;
        Boxs[index].SetActive(true);
    }

    public bool CanUseItem(Item.Type type)
    {
        int index = (int)type;
        return Boxs[index].activeSelf;

    }

    public void UseItem(Item.Type type)
    {
        int index = (int)type;
        Boxs[index].SetActive(false);

    }
}

アイテムの作成

room0にimageを作成します。

名前はkeyにしました。inspector画面から鍵の画像を設定します。

addcomponentからボタン機能を追加します。

新しいC#スクリプトを作成します。名前はItemにしました。

作成したC#スクリプトをkeyにアタッチします。

アイテムの種類の設定とアイテムを拾ったら非表示にするようにします。

using System;

using UnityEngine;

public class Item : MonoBehaviour
{
    [Serializable]
    public enum Type
    {
        Key,
        Item1,
        Item2,
        Item3,

    }
    public Type type;


    public void OnThis()
    {

        ItemBox.instance.SetItem(type);
        gameObject.SetActive(false);
        Debug.Log(type + "をGET");
    }
}
  

鍵のinspector画面からボタンのOnClickを設定します。

ドアの作成

room1にimageを作成します名前はDoorにしました。

ボタンの機能を追加しておきます。

Sourceimageにドアの画像を設定します。

Doorを複製します名前はDoor(Open)にしました。

Door(Open)に開いたドアの画像を設定します。

DoorOpenのアクティブを切り替えることでドアを開閉できるようにします。

クリックでドアを開ける

新しくC#スクリプトを作成します。名前はObjectにしました。

このスクリプトをアタッチしたオブジェクトのアクティブを切り替えるコードを書いていきます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Object : MonoBehaviour
{
    public void OpenObject()
    {
        this.gameObject.SetActive(true);
    }

    public void CloseObject()
    {
        this.gameObject.SetActive(false);
    }
}

Door(Open)のアクティブを切り替えたいのでアタッチします。

DoorのボタンにOpenObject

Door(Open)のボタンにCloseObject

を設定します。

これでクリックするとだけでドアが開閉するようになります。

鍵を使用してドアを開ける

新しくC#スクリプトを作成します。名前はBlockObjectにしました。

using UnityEngine;
using UnityEngine.Events;

public class BlockObject : MonoBehaviour
{
    public Item.Type type = default;
    public UnityEvent ClearIvent = default;
    public void Onthis()
    {

        bool hasitem = ItemBox.instance.CanUseItem(type);
        if (hasitem == true)
        {
          
            ItemBox.instance.UseItem(type);
            ClearIvent.Invoke();
        }


    }
}

作成したスクリプトをDoorにアタッチします。

Typeで使用するアイテムを指定できます。

ClearIventにアイテムを使用した時の処理を設定します。

鍵を使用したらドアが開くようにするのでDoor(Open)のOpenobjectを設定します。

DoorのボタンにBlockObjectのOnthisを設定します。

これで鍵を所持している時にドアをクリックすると開くようになります。

脱出ゲーム用の文字をそろえるパスワードの作り方メモです。

文字を変更するパスワードギミックの作成

Panelを作成します。その子オブジェクトにimageを作成します。

imageにgridLayoutGroupを追加します。

imageの子オブジェクトにボタンを作成します。

Panelに前に作成したObjectスクリプトをアタッチします。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Object : MonoBehaviour
{
    public void OpenObject()
    {
        this.gameObject.SetActive(true);
    }

    public void CloseObject()
    {
        this.gameObject.SetActive(false);
    }
}

パスワード画面を閉じる用のボタンを作成して、CloseObjectを設定します。

パスワード画面を開くときはOpenObjectで開けます。

ボタンを押したら文字が変わるようにする

C#スクリプトを作成します。名前はstringpasswordにしました。

まずはボタンを押したら文字が変わるようにします。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class StringPassword : MonoBehaviour
{
    //ボタンに表示する文字
    public string chars;
    //ボタンのテキスト用の変数
    public Text[] texts;

    public void ChangeText() 
    {
        texts[0].text = chars[0].ToString();
    
    }
}

ボタンに表示する文字を入力して各ボタンのテキストを設定します。

全てのボタンにChangeTextを設定します。

確認するとどのボタンを押しても一番右の文字が変わるようになっています。

何個目のボタンが押されたか判定できるようにする

ボタン1だけではなく押したボタンの文字が変わるようにしていきます。


using UnityEngine;
using UnityEngine.UI;

public class StringPassword : MonoBehaviour
{
    //ボタンに表示する文字
    public string chars;
    //ボタンのテキスト用の変数
    public Text[] texts;
    //どのボタンが何番目の文字を表示しているか保存しておく
    public int[] nows; 

    public void ChangeText(int n) 
    {
        //nows
        nows[n] += 1;

        //nowsが文字数を超えたら0に戻す
        if (nows[n] >= chars.Length) 
        {
            nows[n] = 0;
        
        }

        //ボタンのテキストを変える
        texts[n].text = chars[nows[n]].ToString();
    
    }
}

StringPasswordのinspector画面からnowsをボタンの数だけ設定します。

全てのボタンに番号を設定します。

これで各ボタンのテキストを別々に変更することができます。

答えを設定する

foreachを使って入力内容を取得します。

   //答え
    public string Answer;


    public void CheckAnswer() 
    {
        //配列の各要素を取得して文字列を作る
        string answer = "";
        foreach (Text text in texts)
        {
            answer+= text.text;
        }

        //文字列が答えと一致したら
        if (answer == Answer)
        {
            //クリア後の処理
            Debug.Log("正解");
        }
    
    }

StringPasswordのinspector画面から答えを設定します。

全てのボタンにCheckAnswerを設定すると文字が一致した瞬間クリアになります。

脱出ゲームのアセット

脱出ゲームを開発したい方にお勧めのアセット、「2D Escape Engine」をご紹介します。このアセットは、Unityで脱出ゲームを作成するためのスターターキットで、すぐに使用できる2D脱出ゲームのフレームワークを提供します。パズルやロックの解除メカニズムが含まれており、カスタマイズも容易です。初心者でも扱いやすく、手軽に独自の脱出ゲームを製作できるようになっています。Unityのバージョン2020.3.4以降で使用可能です。興味のある方はぜひチェックしてみてください。