前提・実現したいこと
Unityで2Dシューティングゲームを作っています。
こちらのチュートリアルを改造しており、グラフィック以外はほぼ同様のシューティングゲームです。
元のスクリプトでは、StartCoroutine("DelayTitle");の箇所にそのまま
GameOverメソッドを呼び出す処理が入っており、その状態だと衝突直後にタイトル表示に移ってしまいます。
プレイヤーがやられた図を見せたいので、衝突→2秒後にタイトル画面へ遷移するようにしたいです。
発生している問題・エラーメッセージ
こちらを参考に、コルーチンを利用して実装しようとしたのですが、
yield return new WaitForSeconds(2.0f);
↑この1行から先がうまく処理されず、タイトル画面へ遷移ができません。
(コルーチン宣言内の前後のDebug.logにて確認しています)
GameOverメソッドはManager.cs内にあり、ぶつかると呼び出すようになっています。
該当のソースコード
Player.cs
C#
1using UnityEngine; 2using System.Collections; 3 4namespace CompletedAssets 5{ 6 public class Player : MonoBehaviour 7 { 8 9 //割愛 10 11 // ぶつかった瞬間に呼び出される 12 void OnTriggerEnter2D (Collider2D c) 13 { 14 // レイヤー名を取得 15 string layerName = LayerMask.LayerToName (c.gameObject.layer); 16 17 // レイヤー名がBullet (Enemy)の時は弾を削除 18 if (layerName == "Bullet (Enemy)") { 19 // 弾の削除 20 Destroy (c.gameObject); 21 } 22 23 // レイヤー名がBullet (Enemy)またはEnemyの場合は爆発 24 if (layerName == "Bullet (Enemy)" || layerName == "Enemy") { 25 26 // 3秒後にタイトル表示 27 StartCoroutine("DelayTitle"); 28 29 // 爆発する 30 spaceship.Explosion (); 31 32 // Explosionを削除 33 Destroy (gameObject); 34 35 36 37 } 38 } 39 40 IEnumerator DelayTitle() 41 { 42 // crushはconsoleに表示あり 43 Debug.Log("crush"); 44 yield return new WaitForSeconds(2.0f); 45 // 2secondsはconsoleに表示されない 46 Debug.Log("2seconds"); 47 48 // Managerコンポーネントをシーン内から探して取得し、GameOverメソッドを呼び出す 49 FindObjectOfType<Manager> ().GameOver (); 50 } 51 } 52}
Manager.cs
C#
1using UnityEngine; 2 3namespace CompletedAssets 4{ 5 public class Manager : MonoBehaviour 6 { 7 // Playerプレハブ 8 public GameObject player; 9 10 // タイトル 11 private GameObject title; 12 13 14 void Start () 15 { 16 // Titleゲームオブジェクトを検索し取得する 17 title = GameObject.Find ("Title"); 18 } 19 20 void Update () 21 { 22 // ゲーム中ではなく、Xキーが押されたらtrueを返す。 23 if (IsPlaying () == false && Input.GetKeyDown (KeyCode.X)) { 24 GameStart (); 25 } 26 } 27 28 void GameStart () 29 { 30 // ゲームスタート時に、タイトルを非表示にしてプレイヤーを作成する 31 title.SetActive (false); 32 Instantiate (player, player.transform.position, player.transform.rotation); 33 } 34 35 public void GameOver () 36 { 37 FindObjectOfType<Score> ().Save (); 38 39 // ゲームオーバー時に、タイトルを表示する 40 title.SetActive (true); 41 } 42 43 44 45 public bool IsPlaying () 46 { 47 // ゲーム中かどうかはタイトルの表示/非表示で判断する 48 return title.activeSelf == false; 49 } 50 } 51}
試したこと
Invokeやカウントアップも試してみたのですがやり方が悪いのか呼び出されなかったりで解決できませんでした。
補足情報(FW/ツールのバージョンなど)
Unity Version 2017.4.29f1 Personal

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/22 07:20
2019/07/22 08:05
2019/07/23 02:55
2019/07/23 04:09
2019/07/23 04:22