ブレーカーギミックの中身に着手していきます。まず部屋全体の主電源をON→ちょっとしたパズルを解いて次のギミックの電源ONという流れにしていきます。
ライトアップ
今まで部屋の中は暗かったのでライトアップさせようと思います。まず天井にドーナツ型のゲームオブジェクトを配置します。次に空オブジェクトをドーナツの中心に配置_Lightコンポーネントを設置。最後にLightのTypeをPointに変更_Rangeを広げていけば完成です。
アイテムボックスから取得判定
後々整理しやすいのでゲームプレイ順も作った順にしたいと思います。箱ギミックでは最終的に鍵を入手しましたね。それがアイテムボックスに存在する場合は主電源を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コルーチンを作動という流れになります。activeSelfはSetActive(true)の状態でtrueとなるフラグ管理の一種となります。
Lampについてはライトアップではなく、次に作成するギミックの事も考えマテリアル変更にしています。初期状態ではLight_LightUpコルーチンの中でLampに変更となります。
このゲームで登場するアイテムはたった3種類なのでやや大げさなやり方ですが、仮に数百種類あったとしても使える方法だと思います。以下デモ
繰り返し処理
今回の繰り返しは配列であったためforeachを利用しましたが、繰り返し処理には以下のように様々な形式があります。
・foreach(型 変数 in 配列){処理}
・for(最初; 条件式; 後処理) {処理}
・while(条件式){処理}
・do{処理}while(条件式);
いずれも処理中にbreak;で抜け出し、continue;で処理を一つ飛ばし(条件式セット)できます。
*配列処理ではLinqが便利らしいですが、今回はメリットを見出せなかったので使ってません。
コメント