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

3D脱出ゲーム

ブレーカーギミックの中身に着手していきます。まず部屋全体の主電源をON→ちょっとしたパズルを解いて次のギミックの電源ONという流れにしていきます。

ライトアップ

今まで部屋の中は暗かったのでライトアップさせようと思います。まず天井にドーナツ型のゲームオブジェクトを配置します。次に空オブジェクトをドーナツの中心に配置_Lightコンポーネントを設置。最後にLightのTypeをPointに変更_Rangeを広げていけば完成です。

上から見た天井
Rangeは15にしました。
Light点灯中
下から見ると蛍光灯の中から光っているように見えなくもない。

アイテムボックスから取得判定

後々整理しやすいのでゲームプレイ順も作った順にしたいと思います。箱ギミックでは最終的に鍵を入手しましたね。それがアイテムボックスに存在する場合は主電源をONにするようにします。せっかくなので主電源ON→ライトアップさせしましょう。それだけだと味気ないのでブレーカー側にも判定用にlampという豆電球を設置します。

以下新たなスクリプトでPowerBoxクラスを作成します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class PowerBox : MonoBehaviour
{
    public GameObject Breaker;
    public GameObject keyMove;//ブレーカーに差し込む鍵
    public GameObject lamp;
    public GameObject CeilingLight;//先程Lightをつけた空オブジェクト
    Image images;
    public Material[] PowerSet = new Material[2];//マテリアルセットの配列
    public AudioClip sound1;//カチ
    AudioSource audioSource;
    void Start()
    {
        audioSource = GetComponent<AudioSource>();
    }
    public void BreakerClick()//Breakerのクリックイベントに追加
    {
        GameObject[] items = GameObject.FindGameObjectsWithTag("ItemSlot");
        foreach (GameObject i in items)
        {//ItemSlotタグのオブジェクトを配列に格納し、foreachで順番に回す
            images = i.GetComponent<Image>();
            if (images.sprite.name.Contains("KeySprite"))//鍵画像の名前と一致
            {
                if (!CeilingLight.activeSelf)//ライトアップがまだの場合
                {
                     StartCoroutine(LightUp());
                }
           }
        }
    }
    private IEnumerator LightUp()
    {
        keyMove.SetActive(true);
        yield return new WaitForSeconds(1.0f);
        Breaker.transform.Rotate(-90, 0, 0);
        audioSource.PlayOneShot(sound1);
        yield return new WaitForSeconds(1.0f);
        CeilingLight.SetActive(true);//ライトアップ
        lamp.GetComponent<MeshRenderer>().material = PowerSet[1];
        //マテリアルを入れ替える
        keyMove.SetActive(false);
    }
}

まず準備としてその9で作成したアイテムスロットプレハブにItemSlotタグを設定しましょう。

Breakerをクリックしてアイテムスロット(ItemSlotタグ)を新規の配列に格納→foreachで配列内を順番に回していき(回しきるまで繰り返し)、imagesに抽出→その8でアセット化した時の鍵画像の名前と一致するものがあり、LightがまだついてなければLightUpコルーチンを作動という流れになります。activeSelfSetActive(true)の状態でtrueとなるフラグ管理の一種となります。

Lampについてはライトアップではなく、次に作成するギミックの事も考えマテリアル変更にしています。初期状態ではLight_LightUpコルーチンの中でLampに変更となります。

PowerSet[1]=Lamp

このゲームで登場するアイテムはたった3種類なのでやや大げさなやり方ですが、仮に数百種類あったとしても使える方法だと思います。以下デモ

5~6秒時点:鍵を入手せずにブレーカーをクリックしてます。

繰り返し処理

今回の繰り返しは配列であったためforeachを利用しましたが、繰り返し処理には以下のように様々な形式があります。

foreach(型 変数 in 配列){処理}

・for(最初; 条件式; 後処理) {処理}

・while(条件式){処理}

・do{処理}while(条件式);

いずれも処理中にbreak;で抜け出し、continue;で処理を一つ飛ばし(条件式セット)できます。

*配列処理ではLinqが便利らしいですが、今回はメリットを見出せなかったので使ってません。

コメント

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