アニメーションとループ効果音の一元管理

絶対調味ロジック

本システムは、
アニメーション(Cmd_Normal_Anime)
ループ効果音(Sys_AudioTrigger)
セーブ/ロード復元(Sys_SaveManager)
データ保持(Sys_Flag_Manager)
の4つを連動させ、探索パートおよびノベルパート(巻き戻し再生式)の両方で動作させるための制御モジュールです。

換気扇の回転」アニメーションとループ効果音「回転音」をスイッチ(ボタン)でオンオフし、
その状態をセーブロード、他Sceneでの状態連動を目指しました。

スイッチ制御は探索パートのみ、他パート・セーブロードへ状態を引き継げれば成功です。

システム全体図・コンポーネント構成

データ管理・復元】 
[Sys_Flag_Manager]
(SAV_VENT_FAN_ON) 
    ↑
  (Get/Set)                       (AutoRestoreOnEnable = ON)
    │                         (AutoRestoreOnEnable = OFF)
【一元制御コントローラー】  ─────────────【呼び出しトリガー】
[Sys_AnimeGroupController]       │           ├─ 探索:Auto Restore (自動)
    │             (IsLoading)         └─ ノベル:OnEnableEvent (カット演出)
  (Play/Stop)             │
    │            [Sys_SaveManager]
    ↓
【実行出力コンポーネント】
    ├─ [Cmd_Normal_Anime] (アニメ)
    └─ [Sys_AudioTrigger] (ループSE)

関連スクリプトの最終役割・改修仕様

① Sys_Flag_Manager.cs
役割:ゲーム内の全フラグ(特に SAV_ 接頭辞付きのセーブ対象変数)を一元管理するマネージャー。
今回使用キー:SAV_VENT_FAN_ON (bool 型)
挙動:Sys_SaveManager のセーブ時に CollectSavVariables() で抽出され、ロード時に RestoreSavVariables() でメモリに復元されます。

② Sys_AnimeGroupController.cs(最終改修)
役割:アニメーション(Cmd_Normal_Anime)の再生/一時停止と、効果音(Sys_AudioTrigger)の再生/停止を直接統括するコントローラー。
主要追加・改修ポイント:

  1. Auto Restore On EnableautoRestoreOnEnable)トグルの新設:
    探索パートでの「自律復元(ON)」と、ノベルパートでの「演出イベント待機(OFF)」を切り替え可能に。
  2. RestoreStateRoutine() コルーチン:
    Sys_SaveManager.IsLoading が true の場合はロード完了(IsLoading = false)まで安全に待機してから最新フラグ状態を反映し、通常進行時(IsLoading = false)はトグルの条件に従って処理を実行。
  3. PlayFanFromCut():
    ノベルパートのカット演出用エントリーポイント。

③ Sys_AudioTrigger.cs
役割:個別の効果音(SE_Fan 等)の再生を行うコンポーネント。
主要仕様:Ignore Auto Play On Load(ignoreAutoPlayOnLoad)
チェックを入れると Sys_SaveManager のロード時一括再生から除外され、Sys_AnimeGroupController 側へ再生権限を一本化できます。

④ Sys_SaveManager.cs
役割:ゲーム全体のセーブ&ロードとシーン遷移を管理。
連携挙動:ロード開始時に IsLoading = true となり、復元処理完了後に IsLoading = false になる。
末尾で activeTriggers を全検索して一括再生を行うが、IgnoreAutoPlayOnLoad が true のオブジェクトはスキップする。

⑤ Cmd_OnEnableEvent.cs(汎用)
役割:カット(Cut001 等)がアクティブ化(OnEnable)された瞬間に UnityEvent を発火させる軽量スクリプト。

構築・セットアップ手順

【前提】コンポーネント用共通オブジェクトの設定

各シーン(または Location 親要素)に配置する際のベース設定。

■ インスペクター設定

1. SE_Fan(Sys_AudioTrigger コンポーネント)

Play On Enable:OFF(チェックなし)(フライング再生防止)
Ignore Auto Play On Load:ON(チェックあり)(Sys_SaveManager のロード時一括強制再生から除外)
Loop:ON(チェックあり)
Se Key:Fan_SE(または Audio Clip をアタッチ)

2. Fan_ControllerSys_AnimeGroupController コンポーネント)

Anime Objects:制御対象の Cmd_Normal_Anime を割り当て。
Audio Trigger:SE_Fan(上記 Sys_AudioTrigger)を割り当て。
Save Key:SAV_VENT_FAN_ON(SAV_任意文字列)
Default Active:true(または任意の初期デフォルト状態)

探索パートの実装手順

探索パートでは 「部屋表示時の状態自動復元」「プレイヤーによるスイッチ(UIボタン)操作」 を構築。

■ ヒエラルキー構造

▼ EXPLORATION_CANVAS
  ▼ FRONT (Location親オブジェクト)
     ├─ Fan_Controller      [★ Sys_AnimeGroupController (Auto Restore = ON)]
     ├─ SE_Fan              [★ Sys_AudioTrigger]
     ├─ OnEnableEvent       [★ Cmd_OnEnableEvent]
     └─ UI_Canvas
          └─ Search_Fan_Btn [★ Button / Sys_AudioTrigger (操作音)]

■ 設定ステップ

1. AnimeGroupController のモード設定(アニメ制御)
Auto Restore On Enable:ON(チェックあり)
(効果:部屋がアクティブ化された時、および探索中にロードされた際、1フレーム遅延して自動で最新のフラグ状態を画面・音声に反映します。)

2. AudioTrigger の設定(ループ効果音)
Play On Enable:OFF
Ignore Auto Play On Load:ON(ロード時のクリック音暴発防止)

3. OnEnableEvent の設定(On Enable () イベント)
・Front(Location親オブジェクト) の下に空の GameObject(名前:OnEnableEvent)を作成。
・Cmd_OnEnableEvent スクリプトをアタッチ。
・On Enable () イベントに以下を登録:

呼び出すオブジェクト関数 (Function)
Fan_Controller
(AnimeGroupController)
Sys_AnimeGroupController.PlayFanFromCut

4. Button の設定(On Click () イベント)

呼び出すオブジェクト関数 (Function)役割
Fan_Controller
(AnimeGroupController)
Sys_AnimeGroupController.ToggleStateフラグ反転&ファン/アニメのON/OFF切替
Search_Fan_Btn
(ボタン自身)
Sys_AudioTrigger.Playスイッチを押した時の「カチッ」音再生

ノベルパートの実装手順

ノベルパートでは 「指定カットでの演出開始」「遡り再生(巻き戻しロード)時の自動復元」 を構築。

■ ヒエラルキー構造

▼ NOVEL_CANVAS
  ├─ Fan_Controller         [★ Sys_AnimeGroupController (Auto Restore = OFF)]
  ├─ SE_Fan                 [★ Sys_AudioTrigger]
  ▼ CUT_OBJECTs
     ├─ Cut_000
     ├─ Cut_001 (換気扇演出開始カット)
     │    └─ OnEnableEvent    [★ Cmd_OnEnableEvent]
     └─ Cut_002...

■ 設定ステップ

1. AnimeGroupController のモード設定(アニメ制御)

Auto Restore On Enable:OFF(チェックなし)
(効果:OnEnable 時に自動再生されるのを防ぎ、演出指定カットのイベントまで発火を待機します)

2. 演出発生カット の設定(例:Cut_001)
・Cut_001 の下に空の GameObject(名前:OnEnableEvent)を作成。
・Cmd_OnEnableEvent スクリプトをアタッチ。
・On Enable () イベントに以下を登録:

呼び出すオブジェクト関数 (Function)
Fan_Controller
(AnimeGroupController)
Sys_AnimeGroupController.PlayFanFromCut

演出・ロード復元の動作メカニズム:
通常進行時:
ノベルが進んで Cut_001 がアクティブになった瞬間に Cmd_OnEnableEvent が発火。
PlayFanFromCut() が呼ばれ、演出通りに再生開始されます。
ロード(遡り再生)時:
IsLoading中はRestoreStateRoutine()内のwhile (Sys_SaveManager.IsLoading) で足止めされ、
ロード完了直後に自動的に最新状態へ復元されます。

最終ルールと注意点

ノベルパートで Sys_Flag_Controller を使用しないこと
・Sys_Flag_Controller はオブジェクト自体の SetActive(true/false) を行うコンポーネント。
・アニメや音の制御に使用すると、オブジェクト消去に伴う OnDisable のタイミングズレやロード復元時の不整合を引き起こすため、本ギミックでは Sys_Flag_Controller は一切配置しない

操作音(ワンショットSE)の Ignore Auto Play On Load も必ず ON にすること
スイッチボタン等につける「カチッ」という操作音(Sys_AudioTrigger)の Ignore Auto Play On Load が OFF だと、ロード完了時に「カチッ」とボタン音が暴発する。

Auto Restore On Enable トグルの設定ミスに注意すること
探索パートで OFF になっている場合:ロード後に自動復元されず無音になる。
ノベルパートで ON になっている場合:演出カットに到達する前の初期化時点で音がフライング再生される。

ニューゲーム時の初期値は Default Active に任せること
Sys_Flag_Manager にまだ SAV_VENT_FAN_ON キーが存在しない場合、
Sys_AnimeGroupController の Default Active の値(true)が評価されるため、初期化用のスクリプトを別途配置する必要はありません。

トラブルシューティング・チェックリスト

今後、新しいギミックや別シーンへ横展開する際、意図通りに動作しない場合は以下を確認すべし。

チェック項目正常な設定異常時の影響
SE_Fan
Ignore Auto Play On Load
ON(チェックあり)OFFだと
ロード完了時に SaveManager から勝手に再生される
Search_Fan_Btn(操作音)
Ignore Auto Play On Load
ON(チェックあり)OFFだと
ロード直後に「カチッ」とボタン音が暴発する
探索パート
Auto Restore On Enable
ON(チェックあり)OFFだと
探索パートでロードした際に復元されず無音になる
ノベルパート
Auto Restore On Enable
OFF(チェックなし)ONだと
演出カットに到達する前の初期化時にフライング再生される
Sys_Flag_Controller不要(設置しない)アタッチすると GameObject ごと消えて不整合の原因になる

実機での挙動

ただ単に「換気扇」の「回転アニメーション」と「ループ効果音」のオンオフをするだけならば、
まったく問題ありませんでした。

ノベルパート1・探索パート・ノベルパート2・…、とあるなかで、
探索パートのみスイッチを設置しています。

探索パートのみの単なるスイッチでも良かったのですが、
オフにしたのに、他パートでカラカラと回っていたらおかしい
回転音が煩わしい場合は、ここで切っておく必要があるギミック
といった思考になり、特にやらなくてもいいシステム作りに奔走してしまいました…

換気扇オンオフ状態を

  • 他パート(Scene)で維持させること
  • 探索パート含む、他パートでのロード後に維持させること

やはりセーブロードに適応させるところで、かなり時間を取られる羽目に…
効果音のオンオフが、けっこう厄介で、鳴ったり鳴らなかったりの繰り返しを経ました。

他にやらなければならないことが多々あるのに、
現実逃避行動で新システムを実装してしまうあたりがなんともいえませんね(´・ω・`)

とはいえ、アニメーションと効果音の一元管理は、いつか役に立てそうなので良しとしましょう。

ちなみに、探索前のノベル1でも、スイッチのオンオフ状態は適用させるようにしました。
時系列的に強制オンでも良いのですが、回転音をシステム的にオフにする裏技という位置付けにしておきました。

コメント