11歩目 Invokeで敵の攻撃をディレイ処理! Unityで1日1ステップ!ノンフィールドRPG開発日記

1日1歩開発日記

ふりかえり

前回は、プレイヤーが攻撃ボタンを押すと、続けて敵が自動で反撃するようにし、基本的なターン制バトルの仕組みを作りました。

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
  • 時間をまたいで段階的な処理や繰り返し処理をしたいならコルーチン

どちらも便利ですが、複雑な処理にはコルーチンの方が柔軟に対応できます

コメント

タイトルとURLをコピーしました