メインコンテンツまでスキップ

5分で始める:ゼロから作る初めてのイベント駆動システム

TinyGiants
GES Creator & Unity Games & Tools Developer

「5分しかないんだけど、イベントシステムの動かし方だけ教えてくれない?」

了解。理論もアーキテクチャの深掘りも他のアプローチとの比較もなし。Unityプロジェクトでゼロから動くイベント駆動のインタラクションを作りたい、そしてそれを速くやりたい。いこう。

このガイドはUnityプロジェクトが開いている(2021.3 LTS以降)前提で、所要時間は約5分。終わるころには、ゲーム内で何かが起きたときに発火し、完全に別のGameObjectでレスポンスをトリガーするイベントが手に入る——両者の間に直接参照はゼロで。

イベント200個超え:なぜイベント管理は破綻するのか

TinyGiants
GES Creator & Unity Games & Tools Developer

新しいUnityプロジェクトを始める。イベントを10個作る。OnPlayerDeathOnScoreChangedOnLevelComplete。分かりやすい名前を付けて、フォルダに入れて、次に進む。快適。イベント構造全体が頭に入る。

半年後。イベントが200個ある。Projectウィンドウはもう、ScriptableObjectファイルの壁だ。OnPlayerHealthDepletedが必要。いやOnPlayerHPLowだったっけ?それともOnPlayerHealthZero?全部OnPlayerで始まる名前のリストをスクロールしながら目を凝らす。3分後、欲しいイベントが既にあるかすら分からないので諦めて新しいのを作る。

これがイベント駆動のUnityプロジェクトが最終的に行き着く場所だ。イベントパターンが間違っているからじゃない。スケールでのイベント管理ツーリングを誰も作っていないからだ。Unityにはアニメーションウィンドウ、Shader Graph、Timeline、Input Systemデバッガがある。イベントが使えるのは...Projectウィンドウ。

ゼロリフレクション、ゼロGC:「高性能」イベントシステムの本当の意味

TinyGiants
GES Creator & Unity Games & Tools Developer

Unity Asset Storeのイベントシステムプラグインはどれも説明文のどこかに「高性能」と書いている。「使いやすい」と「完全なドキュメント付き」の間くらいに。でも考えてみてほしい。1msも0.001msも人間の感覚では両方とも速い。でも片方はもう片方の1000倍遅い。プラグインが「高性能」と言うとき、実際に何を意味している?何と比べて?どうやって計測した?

以前は気にしなかった。ほとんどの人がそうだ。イベントを配線して、開発マシンで問題なく動いて、出荷する。でもモバイルプロジェクトで何百ものエンティティがそれぞれ複数のイベントをリスンしている案件に携わったとき、「高性能」はマーケティングのチェックボックスではなくなった。60 FPSとスライドショーの違いだった。

この記事は、イベントシステムにとって「高性能」が実際に何を意味すべきか、なぜほとんどの実装が不十分なのか、GESがExpression Treeコンパイルを通じてどうゼロに近いオーバーヘッドを実現するのかについて。実際の数字で、手を振るのではなく。

Unityジェネリクスシリアライゼーションの壁:型安全なイベントにボイラープレート税は不要

TinyGiants
GES Creator & Unity Games & Tools Developer

GameEvent<T>を作った。クリーンで、型安全で、エレガント。ヘルス更新用にGameEvent<float>フィールドを作って[SerializeField]を付けた。Inspectorに切り替える。フィールドがない。ただ...消えている。Unityがゼロ除算を頼まれたかのように、空白のパネルでこっちを見つめている。

これはUnity最古のアーキテクチャ的な頭痛の種だ。シリアライゼーションシステムはジェネリクスを理解しない。今までずっとそうだった。型安全でデータ駆動のイベントシステムを作ろうとしたすべての開発者が、この壁に正面からぶつかっている。

些細な不便じゃない。アーキテクチャ全体を蝕む種類の制約だ。型安全性を諦めるか、ボイラープレートの海に溺れるか、美しいジェネリック設計がInspectorに触れることはないと受け入れるか。何年もの間、コミュニティの答えは「具象クラスを手書きしろ」だった。でも考えてみてほしい。ボイラープレートが100%予測可能なら、なぜ人間が書いているんだ?

さよなら見えないスパゲッティ:あなたのイベントシステムがプロジェクトを壊している理由

TinyGiants
GES Creator & Unity Games & Tools Developer

メソッド名を1つだけ変えた。OnPlayerDiedOnPlayerDefeatedに。ゲームデザイナーから「表現をもう少しソフトにして」と頼まれたから。Playを押す。何も起きない。コンパイルエラーなし。警告なし。Inspectorで紐づけていた10個のシーンオブジェクトのUnityEventが、ただ...動かなくなった。無言で。そしてそのことに気づくのは、3日後にQAが報告してくれたとき。最悪の場合、プレイヤーが気づくことになる。

心当たりがあるなら、おめでとう。あなたは「見えないスパゲッティコード」に出会っている。IDEにも表示されない。コンパイラ警告も出ない。依存関係グラフにも出てこない。ただそこに潜んでいて、最悪のタイミングで壊れるのを待っている。

これはスキルの問題じゃない。アーキテクチャの問題だ。そして、ほとんどのUnity開発者が認めたがらないほどよくある話だ。