はじめてのイベントプログラミング:解説のみ

ゲーム開発やアプリケーション制作を始めたばかりの皆さん、プログラミングを進めていく中で「イベント」という言葉を聞いたことがあるでしょうか?イベントは、ユーザーの操作やゲーム内の出来事に応じて特定の処理を実行するための重要な仕組みです。本資料では、初学者の方でも理解しやすいように、イベントの基本から活用方法までを丁寧に解説します。特に、コリジョンやトリガーを使った独自イベントの作り方についても触れていきますので、ぜひ最後までご覧ください。


イベントってなに?

イベントとは、ゲームやアプリで「何かが起こったときに、そのタイミングで特定の処理を実行する仕組み」のことです。

たとえば…

  • ボタンが押されたとき
  • キーボードのキーが押されたとき
  • 敵とぶつかったとき
  • タイマーで時間がきたとき

これらの「きっかけ」に応じて、自動的にプログラムが動いてくれます。


イベントを使わないとどうなるの?

最初はイベントを使わずにプログラムを書いても問題ないかもしれません。でも、機能をどんどん追加していくと、コードがごちゃごちゃになって大変になります。

例:スペースキーが押されたらライフを減らす

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        Debug.Log("ライフが減った");
    }
}

これで十分と思うかもしれませんが、機能を追加していくと…

機能追加の例

  • ライフが0になったらゲームオーバーにする
  • プレイヤーを消す
  • 爆発アニメーションを再生する
  • スコアを更新する
  • 背景を点滅させる

これらを全部一つのUpdateメソッドに書いていくと、コードがどんどん長くなってしまいます。


イベントを使ってみよう!

イベントを使うと、コードをきれいに整理できて、新しい機能を追加するのも簡単になります。

3.1 基本的なイベントの作り方

Unityでは、UnityEventというクラスを使ってイベントを作成できます。

例:イベントを作るスクリプト

using UnityEngine;
using UnityEngine.Events;

public class EventTrigger : MonoBehaviour
{
    public UnityEvent myEvent;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            myEvent.Invoke();
        }
    }
}
  • UnityEvent型のmyEventという変数を作ります。
  • Invoke()メソッドでイベントを発生させます。

3.2 イベントに反応する処理を登録しよう

イベントが発生したときに実行される処理をイベントハンドラと言います。これを登録する方法は2つあります。

3.2.1 インスペクターで登録する方法

  1. スクリプトをアタッチする EventTriggerスクリプトをゲームオブジェクトにアタッチします。
  2. インスペクターで設定する インスペクターを見ると、My Eventという項目があります。ここで+ボタンを押して、実行したいオブジェクトとメソッドを選びます。

メリット

  • コードを書かずに設定できる
  • 簡単に変更できる

3.2.2 コードで登録する方法

例:イベントハンドラをコードで登録する

using UnityEngine;

public class GameManager : MonoBehaviour
{
    public EventTrigger eventTrigger;

    void Start()
    {
        eventTrigger.myEvent.AddListener(OnPlayerDamaged);
    }

    void OnPlayerDamaged()
    {
        Debug.Log("プレイヤーがダメージを受けた!");
    }
}
  • AddListener()メソッドでイベントハンドラを追加します。

メリット

  • 実行中にイベントハンドラを追加・削除できる
  • より柔軟な設定が可能

3.3 引数つきのイベントを使おう

イベントに情報を渡したい場合、引数つきのイベントを使います。

例:ダメージ量を渡すイベント

using UnityEngine;
using UnityEngine.Events;

[System.Serializable]
public class DamageEvent : UnityEvent<int> { }

public class EventTrigger : MonoBehaviour
{
    public DamageEvent onDamaged;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            onDamaged.Invoke(10); // 10ダメージを与える
        }
    }
}

イベントハンドラ側のコード

using UnityEngine;

public class GameManager : MonoBehaviour
{
    public EventTrigger eventTrigger;

    void Start()
    {
        eventTrigger.onDamaged.AddListener(ApplyDamage);
    }

    void ApplyDamage(int damage)
    {
        Debug.Log($"プレイヤーが{damage}のダメージを受けた!");
    }
}
  • UnityEvent<int>のように、引数の型を指定します。
  • Invoke()するときに、引数を渡します。

4. コリジョンやトリガーを使った独自イベント

ゲーム開発では、オブジェクト同士の衝突(コリジョン)や、トリガー領域への侵入・退出を検知することがよくあります。これらを使って、独自のイベントを作成し、汎用的に活用する方法を紹介します。

4.1 コリジョンイベントの活用

コリジョンとは?

  • コリジョン(Collision)とは、物理的な衝突を検知する機能です。
  • Unityでは、OnCollisionEnterOnCollisionStayOnCollisionExitなどのメソッドでコリジョンイベントを扱います。

コリジョンを使った独自イベントの作成

例:プレイヤーが敵にぶつかったときにイベントを発生させる

CollisionEventTrigger.cs

using UnityEngine;
using UnityEngine.Events;

public class CollisionEventTrigger : MonoBehaviour
{
    public UnityEvent collisionEvent;

    void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Enemy"))
        {
            collisionEvent.Invoke();
        }
    }
}
  • collision.gameObject.CompareTag("Enemy")を使用して、タグが"Enemy"であるかを確認します。

イベントハンドラの登録

using UnityEngine;

public class GameManager : MonoBehaviour
{
    public CollisionEventTrigger collisionTrigger;

    void Start()
    {
        collisionTrigger.collisionEvent.AddListener(OnPlayerHitEnemy);
    }

    void OnPlayerHitEnemy()
    {
        Debug.Log("プレイヤーが敵と衝突した!");
        // ここでダメージ処理やエフェクト再生などを行う
    }
}

4.2 トリガーイベントの活用

トリガーとは?

  • トリガー(Trigger)とは、物理演算はせずに領域への侵入や退出を検知する機能です。
  • Unityでは、OnTriggerEnterOnTriggerStayOnTriggerExitなどのメソッドでトリガーイベントを扱います。

トリガーを使った独自イベントの作成

例:プレイヤーが特定のエリアに入ったときにイベントを発生させる

TriggerEventTrigger.cs

using UnityEngine;
using UnityEngine.Events;

public class TriggerEventTrigger : MonoBehaviour
{
    public UnityEvent triggerEvent;

    void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("Player"))
        {
            triggerEvent.Invoke();
        }
    }
}
  • other.gameObject.CompareTag("Player")を使用して、タグが"Player"であるかを確認します。

イベントハンドラの登録

using UnityEngine;

public class GameManager : MonoBehaviour
{
    public TriggerEventTrigger triggerEventTrigger;

    void Start()
    {
        triggerEventTrigger.triggerEvent.AddListener(OnPlayerEnterArea);
    }

    void OnPlayerEnterArea()
    {
        Debug.Log("プレイヤーがエリアに侵入した!");
        // ここでイベントの開始やカットシーンの再生などを行う
    }
}

4.3 独自イベントを作成してみよう

コリジョンやトリガーイベントを汎用的に使えるように、独自のイベントクラスを作成してみましょう。

CustomEventTrigger.cs

using UnityEngine;
using UnityEngine.Events;

public class CustomEventTrigger : MonoBehaviour
{
    [System.Serializable]
    public class CollisionEvent : UnityEvent<GameObject> { }

    public CollisionEvent onCollisionWithEnemy;

    void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Enemy"))
        {
            onCollisionWithEnemy.Invoke(collision.gameObject);
        }
    }
}
  • UnityEvent<T>を継承して、CollisionEventを作成します。
  • イベントハンドラに衝突した敵の情報を渡せます。

イベントハンドラ側のコード

using UnityEngine;

public class EnemyManager : MonoBehaviour
{
    public CustomEventTrigger customEventTrigger;

    void Start()
    {
        customEventTrigger.onCollisionWithEnemy.AddListener(HandleEnemyCollision);
    }

    void HandleEnemyCollision(GameObject enemy)
    {
        Debug.Log($"{enemy.name}と衝突しました!");
        // 敵ごとの処理を行うことができます
    }
}
  • イベントハンドラで衝突した敵のGameObjectを受け取り、個別の処理が可能になります。

イベントをもっと活用しよう

複数のオブジェクトでイベントを共有

  • 複数のプレイヤーや敵がいても、イベントを使って共通の処理を簡単に行えます。
  • 動的に生成されるオブジェクトでも、OnEnableStartでイベントハンドラを登録すればOKです。

例:敵キャラクターが倒されたときにスコアを加算する

using UnityEngine;

public class Enemy : MonoBehaviour
{
    public UnityEvent onDestroyed;

    void OnDestroy()
    {
        onDestroyed.Invoke();
    }
}

public class GameManager : MonoBehaviour
{
    public int score = 0;
    public GameObject enemyPrefab;

    void Start()
    {
        // 敵の生成処理でイベントハンドラを登録
        GameObject enemyObject = Instantiate(enemyPrefab);
        Enemy enemyScript = enemyObject.GetComponent<Enemy>();
        enemyScript.onDestroyed.AddListener(AddScore);
    }

    void AddScore()
    {
        score += 100;
        Debug.Log("スコアが加算されました。現在のスコア:" + score);
    }
}

まとめ

  • イベントを使うと、特定のタイミングで処理を実行できて、コードがスッキリします。
  • コリジョンやトリガーを使った独自イベントを作る際には、CompareTagを使ってタグを比較すると効率的です。
  • UnityEventを使って、簡単にイベントを作成できます。
  • イベントハンドラを登録する方法は、インスペクターとコードの2通りあります。
  • 引数つきのイベントを使うと、より多くの情報を渡せます。
  • イベントを使うことで、機能の追加や変更が簡単になり、ゲーム開発が楽しくなります!

最後に

初めてイベントを使うときは、ぜひCompareTagを使ってタグの比較を行ってみてください。効率的で安全なコードを書くことができ、ゲームのパフォーマンス向上にもつながります。イベントを上手に使って、魅力的なゲームやアプリを作ってみてくださいね!

Unity,イベント

Posted by hidepon