tanaka's Programming Memo

プログラミングについてのメモ。

2D Game Kit:ゲームオーバーになったらタイトルへ戻す

f:id:am1tanaka:20180403235541p:plain

Unity公式からリリースされた(迷路探索系の)2Dゲームをコーディングなしで作れる2D Game Kitですが、ゲームオーバーになってもタイトル画面に戻すことができません。一度ゲームを始めたら、Ellenを強制的に出現させようとするためです。

「ゲームオーバーになったらタイトルに戻して、最初からプレイし直しにしたい!」

ということ、改造してみました。

目次

手順

やることは以下の通りです。

  • ゲーム以外のシーンに移行させるメソッドを追加します
  • ゲームオーバー後にタイトルシーンへ戻します
  • タイトル画面のSTARTイベントを再設定
  • ゲームオーバー画面の調整

ゲーム以外のシーンに移行させるメソッドの追加

SceneController.csをエディターで開いて、SceneControllerクラスに以下の2つのメソッドを追加します。

        public static void TransitionToOutOfGameScene(String sceneName)
        {
            Instance.StartCoroutine(Instance.TransitionToOutOfGame(sceneName));
        }

        protected IEnumerator TransitionToOutOfGame(string sceneName)
        {
            m_Transitioning = true;
            PersistentDataManager.SaveAllData();

            if (m_PlayerInput != null)
                m_PlayerInput.ReleaseControl(true);
            yield return StartCoroutine(ScreenFader.FadeSceneOut(ScreenFader.FadeType.Loading));
            PersistentDataManager.ClearPersisters();
            yield return SceneManager.LoadSceneAsync(sceneName);
            PersistentDataManager.LoadAllData();
            m_PlayerInput = null;
            yield return StartCoroutine(ScreenFader.FadeSceneIn());

            m_Transitioning = false;
        }

このメソッドは、既存のシーン切り替え用のメソッドTransition()からEllenの入力を再開したりする処理を削除して、シーンの切り替えをSceneManager.LoadSceneAsync()で行うように変更したものです。

ゲームオーバー後にタイトルシーンへ戻す

ミスした時、デフォルトの挙動ではLifeが残っているとチェックポイントに戻されて、Lifeが無くなるとゲームオーバーと表示された後にゾーンの最初からゲームが再開します。これを、Lifeが無くなった時はゲームオーバーと表示した後にタイトルシーンに切り替えるようにします。

ついでに、ゲームオーバーシーンではBGMを消す機能も付けました。この辺りは、ゲームオーバー用のジングルを流すなど改造してもよいですね。

  • PlayerCharacter.csをエディターで開きます
  • DieRespawnCoroutine()メソッドを探して、以下のように書き換えます
        IEnumerator DieRespawnCoroutine(bool resetHealth, bool useCheckPoint)
        {
            PlayerInput.Instance.ReleaseControl(true);
            if (!useCheckPoint)
            {
                BackgroundMusicPlayer.Instance.Mute(1f);
            }
            yield return new WaitForSeconds(1.0f); //wait one second before respawing
            yield return StartCoroutine(ScreenFader.FadeSceneOut(useCheckPoint ? ScreenFader.FadeType.Black : ScreenFader.FadeType.GameOver));
            if (!useCheckPoint)
            {
                yield return new WaitForSeconds(2f);
                yield return ScreenFader.FadeSceneIn();
                SceneController.TransitionToOutOfGameScene("Start");
            }
            else
            {
                Respawn(resetHealth, useCheckPoint);
                yield return new WaitForEndOfFrame();
                yield return StartCoroutine(ScreenFader.FadeSceneIn());
                PlayerInput.Instance.GainControl();
            }
        }

以上でPlayしてゲームオーバーになるとタイトルシーンへ遷移するようになります。しかし、STARTボタンをクリックしてもゲームが開始しません。これを直します。

タイトル画面のSTARTイベントを再設定

ゲームオーバーになってから表示されるタイトル画面で、STARTボタンのOn Clickイベントを見てみるとMissingになっています。

f:id:am1tanaka:20180304174229p:plain

SceneControllerオブジェクトのTransitionStartメソッドを呼び出すように設定されているのですが、ゲームシーンからタイトルシーンに戻ってくる時にMissingになってしまいます。これを解決するために、SceneControllerWrapper.csスクリプトが用意されています。これを同じシーン内のオブジェクトにアタッチしておけば、そのオブジェクトからSceneControllerのメソッドを呼び出すことができます。

  • HierarchyビューからStartMenuCanvasを選択します
  • InspectorビューからAdd Componentボタンをクリックして、SceneControllerWrapperを検索してアタッチします

f:id:am1tanaka:20180304174738p:plain

  • HierarchyビューのStartMenuCanvas -> MenuBackgroundを開いて、その中のStartButtonを選択します

f:id:am1tanaka:20180304174855p:plain

  • HierarchyビューのStartMenuCanvasをドラッグして、InspectorビューのOn Click()欄左下にドロップします

f:id:am1tanaka:20180304174941p:plain

  • ドロップした右上のコンボボックスがNo Functionに変わるのでクリックして、SceneControllerWrapper -> TransitionToScene (TransitionPoint)を選択します

f:id:am1tanaka:20180304175455p:plain

以上で、新しく表示される欄にTransitionStart (TransitionPoint)と表示されれば完了です。表示されなかった場合は、HierarchyビューからTransitionStartオブジェクトをこの欄にドラッグ&ドロップしてください。

f:id:am1tanaka:20180304175708p:plain

Playしたら、ゲームオーバーにして、再スタートしてみてください。今度はちゃんとゲームが最初から始まります。

ゲームオーバー画面の調整

処理はできましたが、ゲームオーバーの表示のあと、一度ゲーム画面が表示されてから読み込みが表示されて、不自然な感じがします。

f:id:am1tanaka:20180403232336g:plain

この辺りの遷移をいじるのは面倒なので、背景の黒塗りを消して不自然さを消すことで対応しました。

フェード画面はScreenFaderオブジェクトにまとめられています。ゲームオーバーの黒塗りパーツを無効にします。

  • HierarchyビューからScreenFader -> GameOverCanvasを開きます

f:id:am1tanaka:20180403233247p:plain

  • Imageをクリックして選択したら、[Shift]キーを押しながらBlackBarを選択します

f:id:am1tanaka:20180403233323p:plain

  • Inspectorビューの左上のチェックを外して無効にします

f:id:am1tanaka:20180403233407p:plain

以上で完了です。これなら不自然さはないように思いますがどうでしょう。

f:id:am1tanaka:20180403233556g:plain

まとめ

シーンを遷移させる処理を追加したり、ゲームオーバー時の処理を改造したり、イベントの呼び出しを変えることで、2D Game Kitでタイトルに戻すことができるようになりました。タイトル画面に戻せれば、スコアを実装してランキングに対応させることもできるので、タイムやスコアを競うゲームも作れるようになります。

また、タイトルに限らず、エンディングやイベントシーンへも移行できるので、表現の幅が広がると思います。ご活用いただければ幸いです。

参考URL