Ripple

Unity向けのオープンソースScriptableObjectフレームワーク。このパターンが普段答えられない「誰が変えたのか、誰が聞いているのか」という問いを中心に設計しました。

Unity · C# · エディター拡張 · 2024年 — 現在

GitHub
Ripple inspector during play: the Invoked by table lists callers, call counts and last values

考え方

共有変数、型付きイベント、ランタイムセットはアセットとして存在します。たとえばHPバーはプレイヤーへの参照を持たず、プレイヤーのHPアセットを読むだけ。配線はインスペクターで行い、シーンの読み込み順にも依存しません。

変数はトグル一つでセッションをまたいで保存でき、参照は定数とアセットを切り替えられるので、プロトタイプはシンプルに始めて後から育てられます。

// Gameplay code only holds references to assets.
[SerializeField] FloatVariableSO shotsFired;
[SerializeField] BoolVariableSO  playerVisible;
[SerializeField] VoidEventSO     onTeleport;

void Shoot()
{
    // Passing "this" fills the Invoked by table.
    shotsFired.SetCurrentValue(
        shotsFired.CurrentValue + 1, this);
    playerVisible.SetCurrentValue(false);
}

デバッグしやすさを前提に設計

このパターンへのよくある不満は、処理の流れが見えなくなること。イベントが発火しても、どこから呼ばれたのか分かりません。Rippleはその答えをインスペクターに直接表示します。プレイ中、すべてのアセットに呼び出し元、回数、値が並びます。

「Scan listeners」はその逆方向。シリアライズされたイベント呼び出し、ランタイムの購読者、すべてのシーンとプレハブのリスナーコンポーネントから、そのアセットに反応するものをすべて見つけます。

Scan Listeners on the Player_Shoot event finds the gun in the scene and in the player prefab
Scan listeners on Player_Shoot: the gun in the scene and in the player prefab

チーム全員のためのツール

Ripple Wizardはプロジェクト内のすべてのRippleアセットを種類ごとに一覧表示し、一か所で閲覧・編集できます。イベントロガーは発火したイベントを送信元とともに即座に表示するので、プレイテストのバグ報告がずっと追いやすくなります。

診断機能はすべてビルドから除外され、ランタイムはIL2CPPにも対応。出荷したゲームではツールのコストはゼロです。

Ripple Event Logger listing events raised during play and who raised them
Shroomerの戦闘中のイベントロガー

実案件での実績

Rippleは自分のゲームの土台として始まり、最近の作品であるRyze、Shroomer、This Side Upのすべてで使われています。

The Ripple Wizard listing every Ripple asset in the project by type
The Ripple Wizard

← ポートフォリオに戻る