ふりかえり
前回は、プレイヤーが攻撃ボタンを押すと、続けて敵が自動で反撃するようにし、基本的なターン制バトルの仕組みを作りました。
Invokeで敵の攻撃にディレイ処理を追加!
今回は、敵の攻撃を「1秒遅らせて」実行することで、よりターン制バトルらしいテンポを演出してみます。
UnityでのInvokeについて
Unityでは、Invokeメソッドを使うことで、指定した関数を一定時間後に実行することができます。
基本の書き方は以下の通りです:
Invoke("関数名", 遅延時間(秒));
例えば、Invoke(“EnemyAttack”, 1.0f); と書けば、EnemyAttack() 関数が 1秒後に呼び出される という意味になります。
スクリプトの変更
今回はBattleManagerのPlayerAttack()メソッドを以下のように書き換えます:
public void PlayerAttack() { if (isPlayerTurn) { playerManager.PlayerAttack(enemyManager); isPlayerTurn = false; // プレイヤーのターン終了 Debug.Log(enemyManager.enemy.name + "のターン"); Invoke("EnemyAttack", 1.0f); // 1秒後に敵の攻撃を実行 } }
このようにすることで、プレイヤーの攻撃から1秒後に、敵が反撃するようになります。
実行結果の一例
実際にゲームを開始し、攻撃ボタンをクリックすると以下のようなログが確認できます:
- [22:55:49]:プレイヤーがスライムに攻撃
- [22:55:50]:スライムがプレイヤーに攻撃

1秒の遅延がしっかり反映されているのが分かりますね!
まとめ
今回は、Invokeを使って 敵の攻撃を1秒遅らせて実行するようにし、よりターン制らしい演出を加えることができました。
次回の予定
現在はスライムのHPが0になるとそのままゲームが終了してしまいます。
次回は、スライムを倒したら 次のスライムが出現するような仕組みを作っていきます!
お役立ち
Invokeとコルーチンの違い
項目 | Invoke | コルーチン(StartCoroutine) |
---|---|---|
基本の用途 | 単発の遅延実行 | 複数のタイミング処理やループ処理 |
書き方の簡単さ | 非常に簡単(1行) | 少し複雑(IEnumeratorが必要) |
引数の扱い | できない(引数なしの関数のみ) | 可能(引数付きで呼び出せる) |
停止・中断 | CancelInvoke()で停止 | StopCoroutine()で停止 |
精度 | ミリ秒単位の細かい制御は苦手 | より柔軟な時間制御が可能 |
複数タイミング | 不向き(単発処理向け) | 向いている(繰り返し処理に最適) |
使い分けの目安
Invokeを使うと良いケース
- シンプルに一定時間後に関数を1回呼びたいだけのとき 例:
Invoke("EnemyAttack", 1.0f);
コルーチンを使うと良いケース
- 一定時間ごとに処理を繰り返したいとき
- 非同期っぽい処理を段階的にしたいとき
- 複数の時間制御をしたいとき 例:1秒待ってから2秒処理して、3秒後に別の処理をしたい、など
StartCoroutine(EnemyAttackCoroutine()); IEnumerator EnemyAttackCoroutine() { yield return new WaitForSeconds(1f); // 攻撃処理 yield return new WaitForSeconds(2f); // 次の処理 }
まとめ
- 簡単な「1秒後にこれをやる」なら Invoke
- 時間をまたいで段階的な処理や繰り返し処理をしたいならコルーチン
どちらも便利ですが、複雑な処理にはコルーチンの方が柔軟に対応できます!
コメント