【Unity】3D脱出ゲームの模様変更ギミックの実装方法

3D脱出ゲームのタップすると模様が変わるギミックの実装方法についてです。

模様の変更にはゲームオブジェクトのマテリアルを変更することで対応します。

まずは完成イメージ。

3DモデルはBlenderで作成、模様のテキスチャは画像編集ソフトで作成しマテリアルとして貼り付けています。

4つの四角形をタップすると模様が変わり、丸ボタンで正解判定を行います。

次にヒエラルキービューワーでオブジェクトの位置関係を確認します。

箱のカバーの子に5つのボタンを配置しています。

こうしておくと正解時にカバーを消すことでボタンも一緒に消えます。

スクリプトの説明に入ります。

using System.Linq;
using UnityEngine;
using UnityEngine.Events;

public class MaterialGimmick : MonoBehaviour
{
    //現在の入力を保存するための配列
    private int[] input = new int[4] { 0, 0, 0, 0 };
    //左から順番に正解を示す添字
    [SerializeField] int[] correct = new int[4];
    //表示する4種類のマテリアル
    [SerializeField] Material[] mat = new Material[4];
    //マテリアルを変更するゲームオブジェクト
    [SerializeField] GameObject[] gameobjs = new GameObject[4];
    //正解時のイベント
    [SerializeField] UnityEvent someevent = new UnityEvent();

    public void onClickButton(int i)
    {
        //マテリアルのインデックス
        var idx = input[i];

        //インデックスを+1する
        if (idx == 3)
        {
            idx = 0;
        }
        else
        {
            idx++;
        }

        input[i] = idx;

        ////現在のマテリアルを取得
        Material[] tmp = gameobjs[i].GetComponent<Renderer>().materials;
        //0番目のマテリアルを新しいマテリアルに変更
        tmp[0] = mat[idx];
        //ゲームオブジェクトに反映させる
        gameobjs[i].GetComponent<Renderer>().materials = tmp;

        //これは動かない
        //gameobjs[i].GetComponent<Renderer>().materials[0] = mat[idx];

    }

    public void onClickOK()
    {
        if (input.SequenceEqual(correct))
        {
            Debug.Log("ok");
            someevent.Invoke();
        }
        else
        {
            Debug.Log("ng");
        }
    }
}

四角ボタンと丸ボタンを押した時の2種類の関数を実装しています。

四角ボタンは4つありますので、引数で0〜3を指定して判別します。

次にスクリプトの設定画面。

正解の順番、マテリアル、ボタンオブジェクト、正解時のイベントをセットします。

4つの四角いボタンには、コライダーをセットしEventTriggerで関数を指定し、引数には0,12,3のボタン番号を指定します。

なお、EventTriggerを使う場合には、カメラ側の設定も必要になります。

詳しくは以下の記事にて説明しています。

【Unity】EventTriggerが動作しない時にチェックするべき4項目

丸ボタンの設定です。

Udemy

Udemyで3D脱出ゲームの作り方を解説しています。

本記事のギミックは含まれていませんが、カメラやアイテムの取得など基本的な操作方法を学ぶコースになっています。

https://www.udemy.com/course/unity-3d-escape-game/learn/lecture/28687266#overview

ABOUTこの記事をかいた人

個人アプリ開発者。Python、Swift、Unityのことを発信します。月間2.5万PVブログ運営。 Twitter:@yamagablog