質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

887閲覧

ゲームオーバーのシーン表示を遅らせる

haruhu

総合スコア11

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/04/24 05:30

シューティングゲームにて自機の体力がなくなったら、エフェクトを出してからゲームオーバーシーンを表示したいと考えています。ネットで調べたらInvokeを使えばいいと書いてあったのでコードの[OnTriggerEnter2D]の箇所に追加してみました。実行してみるとゲームオーバーシーンには移るのですが、想定した「3秒待ってから移る」という動作が行われません。どこがおかしいのか、どうしたら想定通りに動くのかについて詳しく教えていただきたいです。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using UnityEngine.SceneManagement; 6 7public class Player : MonoBehaviour 8{ 9 public float m_speed; // 移動の速さ 10 public shot m_shotPrefab; // 弾のプレハブ 11 public Explosion m_explosionPrefab; // 爆発エフェクトのプレハブ 12 public plabaku m_plabakuPrefab; // 爆発エフェクトのプレハブ 13 public float m_shotSpeed; // 弾の移動の速さ 14 public float m_shotAngleRange; // 複数の弾を発射する時の角度 15 public float m_shotTimer; // 弾の発射タイミングを管理するタイマー 16 public int m_shotCount; // 弾の発射数 17 public float m_shotInterval; // 弾の発射間隔(秒) 18 public int m_hpMax; // HP の最大値 19 public int m_hp; // HP 20 // プレイヤーのインスタンスを管理する static 変数 21 public static Player m_instance; 22 public float m_magnetDistance; // 宝石を引きつける距離 23 public int m_nextExpBase; // 次のレベルまでに必要な経験値の基本値 24 public int m_nextExpInterval; // 次のレベルまでに必要な経験値の増加値 25 public int m_level; // レベル 26 public int m_exp; // 経験値 27 public int m_prevNeedExp; // 前のレベルに必要だった経験値 28 public int m_needExp; // 次のレベルに必要な経験値 29 public AudioClip m_levelUpClip; // レベルアップした時に再生する SE 30 public AudioClip m_damageClip; // ダメージを受けた時に再生する SE 31 public int m_levelMax; // レベルの最大値 32 public int m_shotCountFrom; // 弾の発射数(レベルが最小値の時) 33 public int m_shotCountTo; // 弾の発射数(レベルが最大値の時) 34 public float m_shotIntervalFrom; // 弾の発射間隔(秒)(レベルが最小値の時) 35 public float m_shotIntervalTo; // 弾の発射間隔(秒)(レベルが最大値の時) 36 public float m_magnetDistanceFrom; // 宝石を引きつける距離(レベルが最小値の時) 37 public float m_magnetDistanceTo; // 宝石を引きつける距離(レベルが最大値の時) 38 39 // ゲーム開始時に呼び出される関数 40 private void Awake() 41 { 42 // 他のクラスからプレイヤーを参照できるように 43 // static 変数にインスタンス情報を格納する 44 m_instance = this; 45 m_hp = m_hpMax; // HP 46 m_level = 1; // レベル 47 m_needExp = GetNeedExp(1); // 次のレベルに必要な経験値 48 49 // レベルアップした時の SE を再生する 50 var audioSource = FindObjectOfType<AudioSource>(); 51 audioSource.PlayOneShot(m_levelUpClip); 52 53 m_shotCount = m_shotCountFrom; // 弾の発射数 54 m_shotInterval = m_shotIntervalFrom; // 弾の発射間隔(秒) 55 m_magnetDistance = m_magnetDistanceFrom; // 宝石を引きつける距離 56 } 57 58 59 private void Update() 60 { 61 // 矢印キーの入力情報を取得する 62 var h = Input.GetAxis("Horizontal"); 63 var v = Input.GetAxis("Vertical"); 64 65 // 矢印キーが押されている方向にプレイヤーを移動する 66 var velocity = new Vector3(h, v) * m_speed; 67 transform.localPosition += velocity; 68 69 // プレイヤーが画面外に出ないように位置を制限する 70 transform.localPosition = Utils.ClampPosition(transform.localPosition); 71 72 // プレイヤーのスクリーン座標を計算する 73 var screenPos = Camera.main.WorldToScreenPoint(transform.position); 74 75 // プレイヤーから見たマウスカーソルの方向を計算する 76 var direction = Input.mousePosition - screenPos; 77 78 // マウスカーソルが存在する方向の角度を取得する 79 var angle = Utils.GetAngle(Vector3.zero, direction); 80 81 // プレイヤーがマウスカーソルの方向を見るようにする 82 var angles = transform.localEulerAngles; 83 angles.z = angle - 90; 84 transform.localEulerAngles = angles; 85 86 // 弾の発射タイミングを管理するタイマーを更新する 87 m_shotTimer += Time.deltaTime; 88 89 // まだ弾の発射タイミングではない場合は、ここで処理を終える 90 if (m_shotTimer < m_shotInterval) return; 91 92 // 弾の発射タイミングを管理するタイマーをリセットする 93 m_shotTimer = 0; 94 95 // 弾を発射する 96 ShootNWay(angle, m_shotAngleRange, m_shotSpeed, m_shotCount); 97 } 98 99 // 弾を発射する関数 100 private void ShootNWay( 101 float angleBase, float angleRange, float speed, int count) 102 { 103 var pos = transform.localPosition; // プレイヤーの位置 104 var rot = transform.localRotation; // プレイヤーの向き 105 106 // 弾を複数発射する場合 107 if (1 < count) 108 { 109 // 発射する回数分ループする 110 for (int i = 0; i < count; ++i) 111 { 112 // 弾の発射角度を計算する 113 var angle = angleBase + 114 angleRange * ((float)i / (count - 1) - 0.5f); 115 116 // 発射する弾を生成する 117 var shot = Instantiate(m_shotPrefab, pos, rot); 118 119 // 弾を発射する方向と速さを設定する 120 shot.Init(angle, speed); 121 } 122 } 123 124 // 弾を 1 つだけ発射する場合 125 else if (count == 1) 126 { 127 // 発射する弾を生成する 128 var shot = Instantiate(m_shotPrefab, pos, rot); 129 130 // 弾を発射する方向と速さを設定する 131 shot.Init(angleBase, speed); 132 } 133 } 134 135 // ダメージを受ける関数 136 // 敵とぶつかった時に呼び出される 137 public void Damage(int damage) 138 { 139 // ダメージを受けた時の SE を再生する 140 var audioSource = FindObjectOfType<AudioSource>(); 141 audioSource.PlayOneShot(m_damageClip); 142 143 // HP を減らす 144 m_hp -= damage; 145 146 // HP がまだある場合、ここで処理を終える 147 if (0 < m_hp) return; 148 149 // プレイヤーが死亡したので非表示にする 150 // 本来であれば、ここでゲームオーバー演出を再生したりする 151 gameObject.SetActive(false); 152 } 153 154 public void OnTriggerEnter2D(Collider2D collision) 155 { 156 if (collision.name.Contains("Enemy")) 157 { 158 // 敵と当たった場所に爆発エフェクトを生成する 159 Instantiate(m_explosionPrefab, collision.transform.localPosition, Quaternion.identity); 160 } 161 162 if (0 >= m_hp) 163 { 164 Instantiate(m_plabakuPrefab, collision.transform.localPosition, Quaternion.identity); 165 166 //追加したところ 167 Invoke("GameOver", 3f); 168 169 SceneManager.LoadScene("GameOver"); // (ポイント)GameOverはシーンの名前と一言一句全て同じであること 170 } 171 } 172 173 // 経験値を増やす関数 174 // 宝石を取得した時に呼び出される 175 public void AddExp(int exp) 176 { 177 // 経験値を増やす 178 m_exp += exp; 179 180 // まだレベルアップに必要な経験値に足りていない場合、ここで処理を終える 181 if (m_exp < m_needExp) return; 182 183 // レベルアップする 184 m_level++; 185 186 // 今回のレベルアップに必要だった経験値を記憶しておく 187 // (経験値ゲージの表示に使用するため) 188 m_prevNeedExp = m_needExp; 189 190 // 次のレベルアップに必要な経験値を計算する 191 m_needExp = GetNeedExp(m_level); 192 193 // レベルアップした時にボムを発動する 194 // ボムの発射数や速さは決め打ちで定義しているため 195 // 必要であれば public 変数にして、 196 // Unity エディタ上で設定できるように変更してください 197 var angleBase = 0; 198 var angleRange = 360; 199 var count = 28; 200 ShootNWay(angleBase, angleRange, 0.15f, count); 201 ShootNWay(angleBase, angleRange, 0.2f, count); 202 ShootNWay(angleBase, angleRange, 0.25f, count); 203 204 // レベルアップしたので、各種パラメータを更新する 205 var t = (float)(m_level - 1) / (m_levelMax - 1); 206 m_shotCount = Mathf.RoundToInt( 207 Mathf.Lerp(m_shotCountFrom, m_shotCountTo, t)); // 弾の発射数 208 m_shotInterval = Mathf.Lerp( 209 m_shotIntervalFrom, m_shotIntervalTo, t); // 弾の発射間隔(秒) 210 m_magnetDistance = Mathf.Lerp( 211 m_magnetDistanceFrom, m_magnetDistanceTo, t); // 宝石を引きつける距離 212 } 213 214 // 指定されたレベルに必要な経験値を計算する関数 215 private int GetNeedExp(int level) 216 { 217 /* 218 * 例えば、m_nextExpBase が 16、m_nextExpInterval が 18 の場合、 219 * 220 * レベル 1:16 + 18 * 0 = 16 221 * レベル 2:16 + 18 * 1 = 34 222 * レベル 3:16 + 18 * 4 = 88 223 * レベル 4:16 + 18 * 9 = 178 224 * 225 * このような計算式になり、レベルが上がるほど必要な経験値が増えていく 226 */ 227 return m_nextExpBase + 228 m_nextExpInterval * ((level - 1) * (level - 1)); 229 } 230}

unityのバージョンは2018.4.20f1です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

invokeは、その場で処理が3秒止まるのではなく、3秒後に指定した関数を呼び出すものなので、
このように使います。

c#

1 public void OnTriggerEnter2D(Collider2D collision) 2 { 3 if (collision.name.Contains("Enemy")) 4 { 5 // 敵と当たった場所に爆発エフェクトを生成する 6 Instantiate(m_explosionPrefab, collision.transform.localPosition, Quaternion.identity); 7 } 8 9 if (0 >= m_hp) 10 { 11 Instantiate(m_plabakuPrefab, collision.transform.localPosition, Quaternion.identity); 12 13 //追加したところ 14 Invoke("GameOver", 3f); 15 } 16 } 17 18 void GameOver() 19 { 20 SceneManager.LoadScene("GameOver"); 21 }

投稿2020/04/24 07:13

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

haruhu

2020/04/25 13:54

回答ありがとうございます。長い時間手こずっていたので本当に助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問