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
endemit中の変更を防ぐ
イベントを発火するときは、リスナーリストのコピーを反復処理します。これにより、発火中の追加や削除によるバグを防げます。
名前空間付きイベント
ドット区切りのイベント名("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フィードバックを取得できます。ローカル設定は不要です。