isGameUp 変数を切り替えるメソッドが作成済ですので、DefenseBase スクリプトが
適切なタイミングで呼び出し命令をしてくれれば問題ありません。
先ほど、DefenseBase スクリプトの Start メソッドがなくなって、代わりに public 修飾子のメソッドが完成しています。
このメソッドを呼び出さないと、
GameManager スクリプトの情報が DefenseBase スクリプトに届かず、また、今まで自動で処理されていた Start メソッドの役割を果たせなくなります。
そのため、GameManager スクリプトに DefenseBase スクリプトの情報を代入する変数を用意して、該当の public 修飾子のメソッドを呼び出す処理を追記します。
呼び出すタイミングは、Start メソッド内がよいでしょう。なぜなら、
新しく DefenseBase に作り直したメソッドの処理自体が以前は Start メソッド内で処理されていたものだからです。
同じタイミングで実行することができれば、
メソッド自体は Start メソッドではありませんが、同じように処理をすることが可能です。
呼び出す際には、
GameManager スクリプト自身の情報を引数として渡すようにしてください。こうすることによって、DefenseBase スクリプトに GameManager の情報を送ることができます。
DefenseBase スクリプトを持つゲームオブジェクトは常にヒエラルキーにあるゲームオブジェクトですので、
SerializeField 属性をつけて DefenseBase 型の変数を宣言すれば
インスペクターよりドラッグアンドドロップすることで、
DefenseBase 用の変数に情報を代入することが出来ます。
それではまずは、自分で考えたロジックを書いてみてください。
GameManager.cs
<= クリックすると開きます
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameManager : MonoBehaviour
{
[Header("ゲーム終了判定値")]
public bool isGameUp;
////* ここから追加 *////
[SerializeField]
private DefenseBase defenseBase;
////* ここまで *////
void Start()
{
// ゲーム終了の判定を、「ゲームが終了していない」状態にする
SwitchGameUp(false);
////* ここから追加 *////
// DefenseBase スクリプトに用意した、DefenseBase の設定を行うための SetUpDefenseBase メソッドを呼び出す。引数として GameManager の情報を渡す
defenseBase.SetUpDefenseBase(this);
////* ここまで *////
}
/// <summary>
/// ゲーム終了状態の切り替え
/// </summary>
/// <param name="isSwitch"></param>
public void SwitchGameUp(bool isSwitch) {
// isGameUp の値を引数の値に切り替える
isGameUp = isSwitch;
// TODO ゲーム終了時には画面に残っているエネミーをすべて破壊する
}
}
スクリプトを修正したらセーブします。GameManager ゲームオブジェクトのインスペクターを確認します。
新しく SerializeField 属性で宣言した変数が表示されていれば問題ありません。
GameManager ゲームオブジェクト インスペクター画像