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

3D脱出ゲーム

落とし球ゲームB面

モグラ撃ちゲームで高得点を取ったら、ゲーム躯体がアップデートされるようにしたいと思います。複製したゴール(タグ:Lastcleararea)とスイッチの絵を用意しましょう。その後その19で更新したroom2のBallManagerクラスとMoveBallクラスに以下追加します。

紫の球の上部分が外れてスイッチが現れたという設定です。
//BallManagerクラス_追加のみ記載
public GameObject RealClear, switch;
void Start()
{
 if(GunGameManager.HighScore >= 80)
 {
  RealClear.SetActive(true);
  Clear.SetActive(false);
  GameObject[] boxes = GameObject.FindGameObjectsWithTag("Obstacle");
  foreach (GameObject i in boxes)
  {
   i.transform.DOLocalMoveX(1.0f, 0.5f).SetLoops(-1, LoopType.Yoyo);
  }
 GameObject[] balls = GameObject.FindGameObjectsWithTag("ObstacleBall");
  foreach (GameObject i in balls)
  {
   i.transform.DOLocalMoveY(-1.0f, 0.5f).SetLoops(-1, LoopType.Yoyo);
  }
 }
}
public void PushRetryButton()
{
 if (MoveBall.FinalFlag == 1){ switch.SetActive(true);}
}
//MoveBallクラス_追加のみ記載
public AudioClip flagSet;//カチッ
public static int FinalFlag;
public static bool Clear;
void OnTriggerEnter2D(Collider2D inv)//侵入
{
 if (inv.gameObject.tag == "Lastcleararea")
 {
  FinalFlag++;
  if (FinalFlag == 1)
  {
   audioSource.PlayOneShot(flagSet);
  }
  if (FinalFlag == 2)
  {
   Clear = true;
   SceneManager.LoadScene("room1");
  }
 }
}

今回もDOTweenを活用しています。モグラ撃ちゲームで80点以上を記録したら障害がヨーヨーの様に動く様になります。前回はclearareaにボールが入ったら拳銃というアイテムを入手しましたが、今回は1回目でスイッチON 2回目で最終ギミックフラグON+シーン遷移を行なってます。

扉を粉々に吹き飛ばす

脱出ゲームなので最終的にはこの部屋から外に出る必要があります。鍵やスイッチはもうやったのでシンプルに扉を爆破して壊したいと思います。その1で作った部屋の出口はまだ空いてますので3DPlaneを配置→probuilderのcuttoolで切り分けます。複数のオブジェクト(coliderとrigidbody追加)になるので空の親オブジェクトを設置し、新規スクリプトを設定しましょう。

切り分け前
切り分け後
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class DoorManager : MonoBehaviour
{
Component[] rigid;//コンポーネントリスト
public AudioClip countDown, bakuhatu;
[SerializeField] GameObject explosionPrefab;
AudioSource audioSource;
public GameObject GoalMark;
void Start()
{
audioSource = gameObject.GetComponent<AudioSource>();
if (MoveBall.Clear){StartCoroutine(bombObject()); }
}
IEnumerator bombObject()
{
 audioSource.PlayOneShot(countDown);
 yield return new WaitForSeconds(10.0f);
 audioSource.PlayOneShot(bakuhatu);
 GameObject exp = Instantiate(explosionPrefab, transform.position,   Quaternion.identity) as GameObject;//爆発開始_プレハブをオブジェクト化
 var random = new System.Random();//UnityEngine.Randomという選択肢もあるらしい
 var min = -5;
 var max = -3;
 rigid = GetComponentsInChildren<Rigidbody>();//子の指定のコンポーネントを取得
 foreach (Rigidbody r in rigid)//回す
 {
  r.isKinematic = false;
  r.transform.SetParent(null);//親子関係を解除
  Vector3 pos = r.transform.position;//軸指定なければ"var pos = new Vector3()"の一行で可
  pos.x = random.Next(min, max);//random.Next(以上, 未満!);
  r.transform.position = pos;
  r.AddForce(pos, ForceMode.Impulse);//ベクトル力を加える
  r.AddTorque(pos, ForceMode.Impulse);//回転力を加える
 }
 yield return new WaitForSeconds(0.5f);
 Destroy(exp);//爆発終了_オブジェクト化したプレハブを削除
 yield return new WaitForSeconds(2.0f);
 GoalMark.SetActive(true);
}
public void PushGoalMark(){ SceneManager.LoadScene("goal"); }
}

流れとしてはroom1に戻った後スタートメソッドで最終ギミックフラグを検知→切り分け後のオブジェクトのrigidbodyをコンポーネントリスト化+爆発エフェクト→力を加えて爆散させるといった具合です。力を加えるのはrandom.Nextメソッドの乱数生成により弾き出した値なので毎回違うアクションになります。爆発エフェクトは以下を使用しましたのでお好みをexplosionPrefabに割り当てて下さい。

以下デモ

room2で何度かチャレンジしたので長尺になりました。

その他

壁と床それから箱と机にcoliderが付いてないと扉の破片が突き抜けてしまうので調整しましょう。

青マーカー部分は次回クリア処理で触れる事にします。

コメント

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