🐥

Unityにおけるイベント駆動プログラミングの小技

2025/02/20に公開

Unityにおけるイベント駆動プログラミングの小技

Unityでゲームやアプリケーションを制作する際、コードの柔軟性と保守性を向上させるための重要な手法のひとつに「イベント駆動プログラミング」があります。この記事では、UnityのイベントシステムおよびC#のデリゲート・イベントを活用した実践的な小技を解説し、UIやAI制御、カスタムイベントの応用例、さらにはパフォーマンス向上のためのテクニックについて紹介します。

Unity初心者でも最短5日で3D FPSが完成!今すぐ始める入門チュートリアルはこちら

https://zenn.dev/ryuryu_game/books/fd28de9d8e963a/viewer/0570af

イベント駆動プログラミングの基礎

イベント駆動プログラミングとは、ユーザー操作やシステム内での各種変化といった「イベント」をトリガーとして、あらかじめ登録しておいた処理(イベントハンドラ)を実行する手法です。
この仕組みはC#におけるデリゲートイベントで実現され、メソッド参照を安全かつ効率的に管理できるため、Observerパターンとしても利用されます。

例えば、ユーザーがボタンをクリックした際に、特定の処理を呼び出すことでUIの変化を実現することができます。
Unityは独自のイベントシステムを持ち、キーボードやマウス、タッチ入力などのユーザー入力を自動的に検知して、各オブジェクトにイベントを伝播します。
このため、UIボタンのButton.onClickイベントなどは、イベントハンドラとして登録された処理を呼び出し、シンプルかつ効率的に機能を実現できるのです。

より詳しい内容については、公式マニュアルなどを参考にしてください。
https://docs.unity3d.com/ja/2022.3/Manual/EventSystem.html

Unityにおけるイベント駆動の実践例

Unityでは、以下のようなシーンにおいてイベント駆動の実装が有効です。

UI制御の事例

UIボタンに対してButton.onClickにメソッドを登録することで、ユーザー操作に応じた即時反応を実現できます。
たとえば、ゲーム内のジャンプボタンをクリックすると、キャラクターがジャンプする処理を呼び出すことが可能です。
UI側とゲームロジック側を疎結合にすることで、機能の追加や変更が容易になります。

using UnityEngine;
using UnityEngine.UI;

public class JumpController : MonoBehaviour {
  [SerializeField] Button jumpButton;

  void Start() {
    jumpButton.onClick.AddListener(Jump);
  }

  void Jump() {
    // キャラクターのジャンプ処理
    Debug.Log("ジャンプ実行!");
  }
}

こちらも合わせて確認してください。
https://qiita.com/Cova8bitdot/items/632782ad5264baf6a366

カスタムイベントの活用

ゲームの規模が大きくなると、各コンポーネント間の依存度を下げることが重要です。
独自のグローバルなイベント管理クラスを用いることで、イベントの発行と受信を疎結合に保つことができます。
たとえば、プレイヤーのHPが0になったときにOnPlayerDeathイベントを発行し、UIやサウンド、スコア管理など各処理がそれを購読する実装が考えられます。

using System;
using UnityEngine;

public class EventManager : MonoBehaviour {
  public static event Action OnPlayerDeath = delegate { };

  void Update() {
    if (Input.GetKeyDown(KeyCode.Space)) {
      // ダミー条件としてスペースキー押下でプレイヤー死亡イベントを発行
      OnPlayerDeath.Invoke();
    }
  }
}

public class PlayerDeathHandler : MonoBehaviour {
  void OnEnable() {
    EventManager.OnPlayerDeath += HandlePlayerDeath;
  }
  void OnDisable() {
    EventManager.OnPlayerDeath -= HandlePlayerDeath;
  }
  void HandlePlayerDeath() {
    Debug.Log("プレイヤー死亡:各モジュールが連動して処理開始");
  }
}

こちらの実装例も参考に。
https://anogame.net/unity-static-event-basic/

AI制御への応用

ゲームAIでは、状態遷移をイベントで制御する方法が効果的です。
例えば、敵キャラがプレイヤーを発見したときにイベントを発行し、AIの状態を切り替える設計を採用することで、無駄な更新処理を削減し、パフォーマンスを向上させることができます。
各状態で定期的に状態を確認するのではなく、必要なタイミングでのみイベント通知を受け取ることで、効率的な実装が実現可能です。

詳しくは以下もチェックしてください。
https://elekibear.com/post/20211230_01

パフォーマンス向上のためのテクニック

イベント駆動型実装は効率的ですが、正しく管理しなければメモリリークや不必要なオーバーヘッドを招くこともあります。
以下に主要なポイントをまとめます。

イベントの購読管理

  • リスナーの登録はOnEnableで行い、解除はOnDisableまたはOnDestroyで確実に行う
  • 静的イベントに登録した場合、オブジェクトが破棄されても解除を忘れるとメモリリークにつながる

より詳細な情報は、以下のURLも参照してください。
https://unity3d.college/2017/05/05/using-static-unity-events/

Updateの代替としてのイベント

  • 複数オブジェクトが頻繁に状態をチェックする代わりに、1つのマネージャーから定期的にイベントを発行する設計が有効
  • イベントの発行コストは非常に小さいため、無駄なポーリング処理を削減できる

こちらもご確認ください。
https://www.reddit.com/r/Unity3D/comments/oglmvh/performance_update_vs_c_events_on_high_number_of/

UnityEventとC#イベントの違い

  • UnityEventはエディタ上での設定が可能な点が魅力ですが、パフォーマンス面ではC#の純粋なデリゲートやActionの方が優れている
  • 特に高頻度で発行するイベントの場合、GCAllocを抑えるためにもC#イベントを推奨する

詳細は下記リンクにて。
https://illogika-studio.gitbooks.io/unity-best-practices/content/performance-benchmarks/cost-of-delegates-funcs-actions-etc.html

まとめ

Unityにおけるイベント駆動プログラミングは、UI操作、カスタムイベント、AIの状態遷移など多様なシーンで非常に有効です。
コードの疎結合化と保守性の向上、さらにはパフォーマンスの最適化にも寄与するため、開発現場での活用が強く推奨されます。
今回紹介した実例やテクニックを取り入れ、ぜひ自分のプロジェクトに応用してみてください。

また、さらに詳細な解説記事や実装例を探す際は、下記のリンクも参考にしてください。
https://unity.com/ja/how-to/create-modular-and-maintainable-code-observer-pattern

以上の内容を踏まえ、ぜひイベント駆動プログラミングを取り入れた効率的な開発手法を実践してみましょう。

この記事を読んでもっと実践したいと感じたあなたへ

Unity開発を効率よく進めるためには、実践的なスキルと仲間との交流が欠かせません。
そんな方におすすめのステップが、下記の3つです。

1. 有料教材「どこでもUnity教室」でゲーム制作を短期マスター

  • 5日でシンプルなFPS完成:初心者向けに要点を押さえたカリキュラム
  • C#や最新のInputSystem、FPS実装まで網羅:つまずきやすいポイントを先回りで解説
  • 購入特典:Discord招待+サンプルプロジェクトDLで、疑問や実装例を即確認

Unity初心者でも最短5日で3D FPSが完成!今すぐ始める入門チュートリアルはこちら

https://zenn.dev/ryuryu_game/books/fd28de9d8e963a/viewer/0570af

2. 無料コミュニティで、疑問をすぐに解消&モチベーションUP

  • 初心者~中級者までOK:学習進度に合わせて質問や情報共有
  • 質問サポートが充実:わからないことを仲間や講師に即相談
  • 学習仲間と切磋琢磨:一緒に学ぶから続けやすい

Discordサーバー参加はこちら

https://discord.gg/5FwuKCacNy

3. 実績豊富な“ゲーム開発所RYURYU”があなたをトータルサポート

  • コナラ総販売200件超:さまざまなUnity開発の依頼を対応
  • VR/AR/AIなど最新技術にも精通:幅広いノウハウを活かして開発支援
  • ゲームクリエイター甲子園や東京ゲームショウなど出展実績多数

ご相談・お問い合わせはこちら

https://coconala.com/users/1772507

Discussion