Restarterの調整
Roll a Ballの改造編のスクリプトではゲームのクリア条件を達成した後に、5秒間のゲーム画面遷移待ち時間が設定してある。
この5秒間の間にRestarterスクリプトのアタッチされたオブジェクトに接触すると、ゲームのシーンがスタート状態に戻ってしまう。
PlayerController.csのステージクリア判定の部分に以下のコードを組み込む。
また、Restarter.csがアタッチされたオブジェクトには Tag Enemy を設定しておく。
失敗例
MonoBehaviourスクリプトのenabledをOFFにする
状況
スクリプトのUpdateメソッドは機能しなくなる。アニメーションが止まる。
スクリプトのOnCollisionEnterは有効のまま。衝突でRestarterが機能してシーンが最初に戻る。
理由
公式リファレンス MonoBehaviour を見ると、enabledで有効無効が切り替わるメソッドは
Start()
Update()
FixedUpdate()
LateUpdate()
OnGUI()
OnDisable()
OnEnable()
で、これらのメソッドがスクリプトにある場合にはEditorのスクリプトコンポーネントにチェックボックスが現れてEditorからenabledが設定できるようになる。
GameObject[] g = GameObject.FindGameObjectsWithTag("Enemy");
foreach (var obj in g)
{
obj.GetComponent<Restarter>().enabled = false;
obj.GetComponent<WaveAnim>().enabled = false;
}
対処1
PlayerController.csのステージクリア判定の部分に以下のコードを組み込む。
また、Restarter.csがアタッチされたオブジェクトには Tag Enemy を設定しておく。
以下のスクリプトはRestarterコンポーネントを削除する。
OnCollisionEnterは機能しなくなる。
Enemyはシーンに残ったまま。アニメーションも継続。
衝突してもシーンは最初に戻らない。
GameObject[] g = GameObject.FindGameObjectsWithTag("Enemy");
foreach (var obj in g)
{
Destroy(obj.GetComponent<Restarter>());
}
対処2
PlayerController.csのステージクリア判定の部分に以下のコードを組み込む。
また、Restarter.csがアタッチされたオブジェクトには Tag Enemy を設定しておく。
以下のスクリプトはEnemyオブジェクトを削除する。
Enemyがシーンから消える。
GameObject[] g = GameObject.FindGameObjectsWithTag("Enemy");
foreach (var obj in g)
{
Destroy(obj);
}
対処3
PlayerController.csのステージクリア判定の部分に以下のコードを組み込む。
また、Restarter.csがアタッチされたオブジェクトには Tag Enemy を設定しておく。
フラグを設定する。このコードはエラーになるが、Restarter.csを修正するとエラーは消える。
Restarter.active = false;
Restarter.csを修正する。
スタティックなメンバー変数(クラス変数) active を追記する。クラス変数はClass全体で共有される。
OnCollisionEnterメソッドを activeがfalseになると処理されない様にif文を追加する。
変数activeがfalseになれば全てのEnemyオブジェクトでOnCollisionEnterの中が処理されなくなり、リスタートが実行されなくなる。
public static bool active = true;
private void OnCollisionEnter(Collision collision)
{
if(active) {
リスタート処理
}
}