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) {


リスタート処理


        }

    }