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
になっています。
SceneController
オブジェクトのTransitionStart
メソッドを呼び出すように設定されているのですが、ゲームシーンからタイトルシーンに戻ってくる時にMissing
になってしまいます。これを解決するために、SceneControllerWrapper.cs
スクリプトが用意されています。これを同じシーン内のオブジェクトにアタッチしておけば、そのオブジェクトからSceneController
のメソッドを呼び出すことができます。
- HierarchyビューからStartMenuCanvasを選択します
- InspectorビューからAdd Componentボタンをクリックして、
SceneControllerWrapper
を検索してアタッチします
- HierarchyビューのStartMenuCanvas -> MenuBackgroundを開いて、その中のStartButtonを選択します
- HierarchyビューのStartMenuCanvasをドラッグして、InspectorビューのOn Click()欄左下にドロップします
- ドロップした右上のコンボボックスがNo Functionに変わるのでクリックして、SceneControllerWrapper -> TransitionToScene (TransitionPoint)を選択します
以上で、新しく表示される欄にTransitionStart (TransitionPoint)と表示されれば完了です。表示されなかった場合は、HierarchyビューからTransitionStartオブジェクトをこの欄にドラッグ&ドロップしてください。
Playしたら、ゲームオーバーにして、再スタートしてみてください。今度はちゃんとゲームが最初から始まります。
ゲームオーバー画面の調整
処理はできましたが、ゲームオーバーの表示のあと、一度ゲーム画面が表示されてから読み込みが表示されて、不自然な感じがします。
この辺りの遷移をいじるのは面倒なので、背景の黒塗りを消して不自然さを消すことで対応しました。
フェード画面はScreenFader
オブジェクトにまとめられています。ゲームオーバーの黒塗りパーツを無効にします。
- HierarchyビューからScreenFader -> GameOverCanvasを開きます
- Imageをクリックして選択したら、[Shift]キーを押しながらBlackBarを選択します
- Inspectorビューの左上のチェックを外して無効にします
以上で完了です。これなら不自然さはないように思いますがどうでしょう。
まとめ
シーンを遷移させる処理を追加したり、ゲームオーバー時の処理を改造したり、イベントの呼び出しを変えることで、2D Game Kitでタイトルに戻すことができるようになりました。タイトル画面に戻せれば、スコアを実装してランキングに対応させることもできるので、タイムやスコアを競うゲームも作れるようになります。
また、タイトルに限らず、エンディングやイベントシーンへも移行できるので、表現の幅が広がると思います。ご活用いただければ幸いです。