初心者必見!現場レベルの「ゲーム制作講座PDF」を無料プレゼント中!▶

UnityのC#デリゲート | イベントとコールバック

Unity 基礎操作・設定

私もUnityを始めた頃、「関数を変数みたいに渡す」という概念に一度つまずきました。

ボタンを押したら処理を実行したい。
敵が倒れたらUIを更新したい。
そういう「あとから実行する処理」をつなぐのが、デリゲートやイベントの役割です。
難しく見えますが、UnityEventから触れると理解が早いです。

この記事では、delegateとActionの概要、UnityEventとの使い分け、ボタンクリックや死亡通知の具体例まで解説します。
実務で出会う場面に絞って整理します。

  • デリゲートやActionという用語が抽象的で理解できない
  • ボタンを押してもOnClickの処理が動かない
  • UnityEventとActionのどちらを使えばいいか分からない

この記事でわかること

  • delegateとActionの基本
  • UnityEventとの使い分け
  • UIボタンのOnClick設定方法
  • 敵の死亡通知でActionを使う例
  • eventキーワードの意味
  • 初心者でも理解できる解説

\プログラミング未経験でも大丈夫!まずは1本作り切ろう/

初心者が最初に選ぶならコレ

Unity ノンフィールドRPG
+スレスパ風JRPG講座

★★★★★ (Unity6対応)

Unity6対応・スマホ化対応の最新カリキュラム。「何から始めればいいかわからない」という初心者でも、ステップごとに手を動かすだけでRPGが完成します。

講座を見てみる \ゼロからでもスマホ対応RPGが作れる!/

憧れのアクションゲームに挑戦

Unity 2Dアクションゲーム
の作り方講座(ロックマン風)

★★★★★ (スマホ化・広告実装)

初心者でもロックマン風の横スクロールACTが作れる講座。7ステージ+ラスボスという本格構成で、スマホ化・広告実装まで対応。「自分のゲームをリリースしたい」夢を叶えます。

講座を見てみる \初心者でも本格ACTが完成する!/

3Dゲーム開発の入口はここ

ゼルダ風3Dアクションゲーム
の作り方講座

★★★★★ (スマホ化対応)

「3Dゲームって難しそう…」と感じている初心者向けの講座。全16回でゼルダ風3Dアクションがスマホ対応で作れるようになります。3D開発の基礎がしっかり身につきます。

講座を見てみる \初心者でも全16回で3Dゲームが完成!/

デリゲートとは何か

デリゲート(delegate)は、メソッドを参照して保持できる型です。
変数に数値や文字列を入れるように、メソッドを「後で呼ぶ処理」として登録できます。

public class GameManager : MonoBehaviour
{
    public delegate void OnGameOverDelegate;
    public OnGameOverDelegate onGameOver;

    public void TriggerGameOver
    {
        Debug.Log("ゲームオーバー");
        onGameOver?.Invoke;
    }
}

onGameOver?.Invokeは、登録された処理があれば実行する、という意味です。
?はnullチェックの省略記法です。

Actionを使った短い書き方

毎回delegateを宣言するのは長いので、Actionを使うのが一般的です。
System名前空間の型なので、using System;を忘れないようにしましょう。

using System;
using UnityEngine;

public class ScoreManager : MonoBehaviour
{
    public Action<int> onScoreChanged;

    public void AddScore(int value)
    {
        onScoreChanged?.Invoke(value);
    }
}

Actionは引数なし、Action<int>はintを1つ受け取る、Action<int, string>は2つ受け取る、という形で使います。
戻り値がある処理にはFuncを使いますが、イベント通知ではActionが多いです。

用途
Action 引数なし・戻り値なしの処理 ゲームオーバー通知
Action<T> 引数1つの処理 スコア変更通知(新しい点数を渡す)
UnityEvent Inspectorから登録できるイベント UIボタンのOnClick

UnityEventとの使い分け

Unityには、Inspector上でドラッグ&ドロップで登録できるUnityEventもあります。
ボタンのOnClickはこれが代表例です。

using UnityEngine;
using UnityEngine.Events;

public class DoorSwitch : MonoBehaviour
{
    public UnityEvent onDoorOpened;

    public void OpenDoor
    {
        Debug.Log("ドアが開いた");
        onDoorOpened?.Invoke;
    }
}

使い分けの目安は次のとおりです。

  • UnityEvent:Inspectorで非プログラマも設定したい、ボタン連携、演出のつなぎ
  • Action/delegate:コードだけで完結、複雑な引数、パフォーマンスを気にする場面
管理人
管理人

UIボタンならUnityEvent、スクリプト同士の連携ならAction、と覚えておくと選びやすいです。
どちらも「後から実行する」という点は同じですよ。

ボタンクリックのイベント例

UIボタンは、コードを書かなくてもInspectorから処理を登録できます。

ボタンイベントの設定手順
  • STEP1
    Buttonを配置する

    Canvas上にUI > Buttonを作成
  • STEP2
    OnClickに登録する

    ButtonのOnClickに、実行したいオブジェクトとメソッドをドラッグ
  • STEP3
    Playで確認する

    ボタンを押して、指定した処理が動くかテスト

コードから登録する場合は、次のように書きます。

using UnityEngine;
using UnityEngine.UI;

public class StartButton : MonoBehaviour
{
    void Start
    {
        Button btn = GetComponent<Button>;
        btn.onClick.AddListener(OnStartClicked);
    }

    void OnStartClicked
    {
        Debug.Log("ゲーム開始!");
    }
}

AddListenerでメソッドを登録し、RemoveListenerで解除できます。
シーン切り替え時に解除を忘れると、二重登録の原因になるので注意しましょう。

敵の死亡通知でActionを使う

敵が倒れたらスコア加算やSE再生をしたい場面では、Actionが向いています。

using System;
using UnityEngine;

public class Enemy : MonoBehaviour
{
    public Action onDeath;
    [SerializeField] private int hp = 30;

    public void TakeDamage(int amount)
    {
        hp -= amount;
        if (hp <= 0)
        {
            onDeath?.Invoke;
            Destroy(gameObject);
        }
    }
}

public class GameFlow : MonoBehaviour
{
    void Start
    {
        Enemy enemy = FindObjectOfType<Enemy>;
        enemy.onDeath += HandleEnemyDeath;
    }

    void HandleEnemyDeath
    {
        Debug.Log("敵撃破!スコア+100");
    }
}

+=で登録、-=で解除します。
複数の処理を1つのイベントに登録できるのも、デリゲートの便利な点です。

C#イベント(event)キーワード

外部から勝手にInvokeされないよう、eventキーワードを付ける書き方もあります。

public event Action onDeath;

// 外部から onDeath?.Invoke は呼べない
// 登録(+=)と解除(-=)だけ可能

公開APIとしてイベントを渡すときは、event付きのActionにしておくと安全です。
自分のクラス内からだけInvokeする、というルールを守りやすくなります。

ラムダ式で短く登録する

Actionには、メソッド名の代わりにラムダ式を渡す書き方もあります。

void Start
{
    ScoreManager score = GetComponent<ScoreManager>;
    score.onScoreChanged += (newScore) =>
    {
        Debug.Log("スコア更新: " + newScore);
    };
}

1行で済む処理ならラムダ式が便利です。
ただし、RemoveListenerや-=で解除するときは、同じ参照が必要になるため、長い処理は名前付きメソッドにしておく方が安全です。

管理人
管理人

最初はUnityEventのボタン連携から触って、慣れたらActionでスクリプト間連携、という順番がおすすめです。
いきなり全部理解する必要はありません。

よくあるつまずき

  • 登録忘れ → +=やAddListenerを書いたか確認
  • 二重登録 → Startが複数回走るとリスナーが増える。
    解除するか1回だけ登録する
  • privateメソッドをInspector登録 → UnityEventから呼ぶメソッドはpublicが必要
  • 破棄後の参照 → Destroyしたオブジェクトのイベントは解除する

「ボタンを押しても反応しない」ときは、OnClickのリストが空でないか、Time.timeScaleが0になっていないかも合わせて確認してください。

イベント設計では、「誰が通知するか(発火側)」と「誰が受け取るか(購読側)」を分けて考えると整理しやすくなります。
EnemyはonDeathを発火するだけ、GameFlowはHandleEnemyDeathでUI更新——この分担がデリゲートの基本的な使い方です。
Sceneをまたいで使う場合は、DontDestroyOnLoadしたGameManagerにイベントを集約するパターンもよく見ます。

管理人
管理人

デリゲートは「松竹梅の連携」みたいなもの。
ボタンが叩く、敵が倒れる、UIが更新される——順番に役割を分けてつないでいきましょう。

記事を読んで「作ってみたい!」と思ったら!初心者でも1本完成できる講座で実力をつけよう

知識を読むだけで終わらせるのはもったいない。実際に手を動かしてゲームを1本完成させることで、理解が一気に深まります。プログラミング未経験からでも取り組める講座で、ゲーム開発の第一歩を踏み出しましょう。

Unity ノンフィールドRPG+スレスパ風JRPG講座【Unity6対応!初心者でもデッキ構築×JRPGをスマホ向けに作れる!】

Unity ノンフィールドRPGの作り方講座+Slay the Spire風デッキ構築JRPGの作り方講座

  • Unity6対応・スマホ化対応で最新環境のゲーム開発が学べる
  • Slay the Spire風のデッキ構築システム×JRPGの組み合わせを実装
  • 初心者でも迷わず進められる丁寧な解説構成
  • ノンフィールドRPGとデッキ構築JRPGの2つをまとめて学べるセット講座

Unity ノンフィールドRPGの作り方講座+Slay the Spire風デッキ構築JRPGの作り方講座は、プログラミング未経験の初心者でも取り組みやすい、ステップバイステップ形式の講座です。

Unity6対応・スマホ化対応の最新カリキュラムで、読んで「なるほど」と思った知識を、実際に動くゲームとして形にする体験ができます。

「何から始めればいいかわからない…」という初心者が最初に選ぶ一本として最適な講座です。

Unity6対応・スマホ化対応の最新カリキュラム
ゼロからでもRPGを完成させよう
→ スレスパ風デッキ構築JRPG講座を見てみる
初心者でもスマホ対応のRPGが作れる!まずは1本完成を目指そう!

Unity 2Dアクションゲームの作り方講座(ロックマン風)【全16回!初心者でもスマホ化・広告実装まで対応した本格横スクロールACTが作れる!】

Unity 2Dアクションゲームの作り方講座(ロックマン風)

  • ロックマン・マリオ・カービィのような横スクロールACTをゼロから開発
  • 7ステージ+ラスボスステージの本格的なゲーム設計を初心者でも実現
  • スマホ化・AdMob広告実装まで対応してリリースまで見据えた構成
  • 敵AI15体・多彩なマップギミック・武器システムを完全実装
  • 完全オリジナルゲームをアセット不使用で素材提供付きで制作

Unity 2Dアクションゲームの作り方講座(ロックマン風)は、ロックマン・スーパーマリオ・星のカービィのような2D横スクロールアクションゲームを、初心者でもゼロから開発できるようになる講座です。

全16回で当たり判定・物理挙動・敵AIの知識を実際のゲームコードとして実装する体験が詰め込まれています。スマホ化・広告実装まで対応しているため、「作って終わり」ではなくリリースまで見据えた実践スキルが身につきます。

「憧れのアクションゲームを自分の手で作ってみたい」という初心者に強くおすすめの一本です。

スマホ化・広告実装まで対応した本格横スクロールACT
初心者でもロックマン風2Dアクションをリリースまで作り上げよう
→ 2Dアクションゲームの作り方講座を見てみる
初心者でも本格ACTが完成する!広告収益まで視野に入れた実践スキルを手に入れよう!

ゼルダ風3Dアクションゲームの作り方講座【全16回!初心者でも3Dアクションがスマホ対応で作れる!】

ゼルダ風3Dアクションゲームの作り方講座

  • ゼルダの伝説・モンハン・原神のような3Dアクションをゼロから開発
  • 「3Dは難しそう」と感じている初心者でも取り組みやすい丁寧な解説構成
  • スマホ化対応で実機で動かせるゲームが完成
  • アセットを使った実践的なゲーム開発手法が身につく
  • 画像・動画・全ソースコード公開の充実したサポート

ゼルダ風3Dアクションゲームの作り方講座は、「3Dゲームは難しそう…」と感じている初心者こそおすすめの入門講座です。

全16回の丁寧な解説で、ゼルダの伝説・モンハン・原神のような本格的な3Dアクションゲームを確実に完成まで導きます。スマホ化対応で実機で動かせるため、初めて3Dゲームを作り上げた達成感がひときわ大きい講座です。

「3Dゲームを自分でも作れるか試してみたい」という初心者の最初の一歩として最適です。

初心者でも3Dアクションがスマホ対応で完成する
ゼルダ風3Dアクションゲームで3D開発の壁を一気に突破しよう
→ ゼルダ風3Dアクションゲームの作り方講座を見てみる
全16回でスマホで動くオリジナル3Dゲームを完成させよう!

まとめ

デリゲートとActionは、メソッドを後から実行するための仕組みです。
UnityEventはInspector連携向け、Actionはコード中心の連携向け、と使い分けると整理しやすくなります。

ボタンクリックや敵の死亡通知は、ゲーム制作で最初に出会うイベントの代表例です。
UIボタンのOnClickから試し、慣れたらActionでスクリプト間をつないでみましょう。
イベント設計を含めて学びたい方は、Unity入門の森の講座で、実践的なゲーム制作と一緒に身につけられます。
今日はButtonのOnClickに、Debug.Logを1つ登録するところから始めてみてください。

コメント

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