0Pricing
Lua Academy · レッスン

Luaのイベントシステム

テーブルにコールバックを格納した軽量なイベントディスパッチャーを構築します。

「Luaのイベントシステム」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。

なぜイベントシステムなのか

イベントシステムは、イベントを発生させるプロデューサーと、それに反応するコンシューマーを疎結合にします。Luaでは、コールバック関数のテーブルを使って簡単に構築できます。

シンプルなイベントディスパッチャー

ディスパッチャーは、イベント名をキーとしてリスナーのリストを保存します。

local EventEmitter = {}
EventEmitter.__index = EventEmitter

function EventEmitter.new()
  return setmetatable({_listeners = {}}, EventEmitter)
end

function EventEmitter:on(event, fn)
  self._listeners[event] = self._listeners[event] or {}
  table.insert(self._listeners[event], fn)
end

function EventEmitter:emit(event, ...)
  for _, fn in ipairs(self._listeners[event] or {}) do
    fn(...)
  end
end

ディスパッチャーの使用

:onでイベントを購読し、:emitでイベントを発火します。

local bus = EventEmitter.new()
bus:on("playerHit", function(player, damage)
  player.hp = player.hp - damage
  print(player.name, "took", damage, "damage")
end)
bus:emit("playerHit", {name="Alice", hp=100}, 15)

一度だけ呼び出すリスナー

:onceメソッドはコールバックをラップし、最初の呼び出し後に自身の登録を解除します。

function EventEmitter:once(event, fn)
  local wrapper
  wrapper = function(...)
    self:off(event, wrapper)
    fn(...)
  end
  self:on(event, wrapper)
end

リスナーの削除

:offメソッドは、参照を指定して特定のリスナーを削除します。

function EventEmitter:off(event, fn)
  local list = self._listeners[event]
  if not list then return end
  for i, f in ipairs(list) do
    if f == fn then table.remove(list, i); return end
  end
end

イベント用の優先度キュー

各リスナーに優先度フィールドを追加します。登録時にリストをソートし、優先度の高いハンドラーが先に実行されるようにします。

非同期イベントキュー

リスナーをすぐに呼び出す代わりに、イベントをキューに追加し、各フレームまたはティックで処理します。

local queue = {}
local function postEvent(event, data)
  queue[#queue+1] = {event=event, data=data}
end
local function processEvents()
  local current = queue
  queue = {}
  for _, e in ipairs(current) do
    bus:emit(e.event, e.data)
  end
end

emit中の変更を防ぐ

イベントを発火するときは、リスナーリストのコピーを反復処理します。これにより、発火中の追加や削除によるバグを防げます。

名前空間付きイベント

ドット区切りのイベント名("player.damaged"、"player.healed")を使い、システムごとにイベントを整理します。

弱参照リスナーテーブル

弱い値を持つリスナーテーブルを使うと、購読者オブジェクトがGCされ​​たときに、そのリスナーも自動的に削除されます。長時間動作するゲームでのメモリリークを防げます。

ゲームループとの統合

イベントシステムをゲームループに統合します。入力イベント → ロジックイベント → 描画イベントの順に、各フレームで処理します。

イベントシステムの質問

イベントシステムの主な利点は何ですか。

復習:イベントシステム

Luaのイベントシステムでは、名前付きリスナーリストのテーブルを使います。完全なディスパッチャーには、on、emit、off、onceを実装します。実運用のゲームでは、非同期キューと弱参照テーブルを使用します。

よくある質問

「Luaのイベントシステム」レッスンは無料ですか?

はい。「Luaのイベントシステム」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。

「Luaのイベントシステム」で何を学びますか?

テーブルにコールバックを格納した軽量なイベントディスパッチャーを構築します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Lua Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「Luaのイベントシステム」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLua Academyレッスンでコードを書いて実行できますか?

はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Luaのイベントシステム
  2. コンポーネントベースのスクリプト
  3. ステートマシンによるAIの振る舞い
  4. データ駆動型設定とホットリロード
← Lua Academyに戻る