Skip to content

Game events ja

Tom_XV edited this page Sep 23, 2026 · 3 revisions

English | 日本語

実験的な機能です。 中核 1.2.0(フレームワーク 1.2.0)で入ったものです。

中核(DragNWash.ModFramework)にある GameEvents では、ゲームの出来事をフレームワークが 1 回だけ受け取って、Mod ごとに別々に渡します。どこかの処理が例外を投げても、ログに残って Mods 画面のその Mod の下に出るだけで、ほかの Mod の処理はそのまま動きます。

直接つながない理由

SceneManager.sceneLoaded に直接つないだ処理が例外を投げると、あとから登録した Mod の処理がみんな止まってしまい、しかもどの Mod のせいなのか分かりません。フレームワークの第一原則が防ぎたいのはまさにこれなので、GUIDE のルール 9 で、こうした出来事は GameEvents から受け取ってくださいとお願いしています。

使い方

private void Awake()
{
    GameEvents.OnSceneLoaded(MyMod.Guid, (scene, mode) => ApplyTo(scene));
    GameEvents.OnGameStarted(MyMod.Guid, () => Log("タイトル画面が出ました。"));
    GameEvents.OnQuitting(MyMod.Guid, SaveMyState);
}

private void OnDestroy() => GameEvents.Remove(MyMod.Guid);
メンバー 内容
void OnSceneLoaded(string ownerGuid, Action<Scene, LoadSceneMode> handler) シーンが読み込まれるたびに
void OnSceneUnloaded(string ownerGuid, Action<Scene> handler) シーンが解放されるたびに
void OnGameStarted(string ownerGuid, Action handler) タイトル画面が最初に出て、ゲームの仕組みがそろった時点で 1 回。そのあとで登録した処理はすぐに呼ばれる
void OnQuitting(string ownerGuid, Action handler) ゲームの終了時
bool IsGameStarted タイトル画面が一度出ていれば true
void Remove(string ownerGuid) その Mod が登録した処理をすべて外す

処理が失敗したとき

  • 例外は Mod の GUID と出来事の名前つきでログに出て、Mods 画面ではその Mod の下に表示されます。ゲームのメンバーが見つからないときの GameHooks.Unavailable と同じ出方です。
  • 同じ出来事に対するほかの Mod の処理は、そのまま動きます。
  • 3 回続けて失敗した処理は、そのセッションの間オフになります。1 回成功すれば数え直しです。
  • 100 ms より時間のかかった処理はデバッグログに書かれるので、シーンの読み込みが遅いときに、どの Mod のせいかをたどれます。

毎フレームの出来事はありません

これはわざとです。毎フレームの処理には MonoBehaviour の Update が向いています。フレームワーク全体で Update を用意すると、すべての Mod のフレーム処理が一か所に集まってしまい、遅い Mod が 1 つあるだけで全員が巻き添えになります。

Clone this wiki locally