Unity ゲーム開発アーキテクチャと同期

Unity での C# ゲーム開発における設計・状態管理・ネットワーク同期の実践メモ群。

アーキテクチャ方針

  • Clean Architecture for Unity (CAFU): UseCase が IObservable を返すパターン等。大規模開発に有効だが、仕様が前提から変わるプロトタイプにはハイコストという指摘もある。
  • 原則: データ先行で GameObject はそれに追従、GameObject は状態を保持しない、Repository の実装としての GameObject (XxxImpl)、オブジェクトマネージャー(ファクトリ)が実体とデータを持つ。
  • DI: Zenject を使用。動的な GameObject への注入は Factory 経由。
  • ディレクトリは Assets/Scenes/_Common(共通)+各シーン配下に Animation/Materials/Prefabs/Scripts(Model/UI)/Timelines を分ける。

状態管理・リアクティブ

  • UniRx(Rx の Unity 実装)でイベント駆動・UpdateAsObservable、PubSub 的なイベント管理。
  • ImtStateMachine(pure C# ステートマシン)、ScriptableObject によるデータ保持。
  • アニメーション終了待ちは UniTask でコルーチンを await。

ネットワーク同期 (Photon / PUN2)

  • PUN2 (Photon Unity Networking) でキャラクター位置・向きを同期。PhotonNetwork.Instantiate()IPunInstantiateMagicCallbackPunRPC を用いる。
  • アイテム生成/破棄は MasterClient に RPC リクエストし、PhotonNetwork.Instantiate() の instantiateData にシリアライズしたアイテム情報を載せ、各クライアントが OnPhotonInstantiate で手元プールに登録する設計。

関連