アイテム機能 with PUN2

概要

  • 生成, 破棄はRPC経由で MasterClient にやらせたい
    • NetworkSceneObject にするかは検討中
  • GameObject だけでなく, 全アイテムの情報も共有したい
    • → 生成された GameObject とアイテムデータの結びつけが必要
  • アイテムの拾得, 生成の同期をしたい

モデル

アイテム(IItem)

  • 使用できるアイテム
  • 名前, モデルPrefabへのパス
  • Instantiate時にデータを送るのでシリアライズ可能 IPunSerializable<T>

インベントリ(IInventory)

  • 複数のアイテムを格納するもの

アイテムスポナー(IRemoveSpawner<IItem, int>)

アイテム生成までの流れ

  • PhotonNetwork.InstantiateSceneObjeect()

Prefab

それぞれのアイテムのPrefab

アイテムPrefabにアタッチされているコンポーネント

  • CapsuleCollider半径以内に Player タグでトリガー
  • PhotonView
  • PhotonTransformView 位置の同期
  • Pickable 拾得可能

アイテム拾う

アイテム側: Pickable

  • 当たり判定の OnTriggerEnter など
  • PlayerItemPickedEvent を購読し, 拾われたら RequestDespawn() する
  • 当たり判定に入ると PlayerEnterItemPickableAreaEventを発火
  • 当たり判定から出ると PlayerExitItemPickableAreaEvent を発火

拾う側: ItemPicker

  • OnEnterItemPickableArea()_targetingItems にアイテムを追加
  • OnExitItemPickableArea()_targetingItems からアイテム削除
  • ActionButton が押された時 PickItem() する
    • _targetingItems の最初のアイテム(TODO: 一番近いアイテム)をインベントリに加える, その後 PlayerItemPickedEvent を発火

同期

方針

~~MasterClient にスポーンリクエストを送るのではなく, 手元で PhotonNetWork.Instantiate() して, IPunInstantiateMagicCallback.OnPhotonInstantiate() で手元のプールに登録?~~

MasterClient にスポーンリクエストを送り PhotonNetWork.Instantiate() してもらって, それ以外のクライアントは IPunInstantiateMagicCallback.OnPhotonInstantiate() で手元のプールに登録

  • PunItemSpawner がアイテムの生成, 破棄, 管理をする.
    • 非MonoBehaviourなので実際にRPCとかを実行するのは PunItemSpawnerImpl: MonoBehaviourPunCallbacks
    • PunItemSpawnerPunItemSpawnerImplIRequestDelegator を介してPubSub
  • 非MasterClientは拾う, 生成, 破棄のリクエストを PunRPC でMasterClient に送る.
  • MasterClient はリクエストが来たら PhotonNetwork.Instantiate() でネットワークオブジェクトを生成, このとき instantiateData にアイテム情報のシリアライズしたものをつける.
  • 各Clientは PickableIPunInstantiateMagicCallback.OnPhotonInstantiate() でアイテムデータを登録, GameObject名を IItem.Uid に(PunItemSpawner でアイテムを追跡したいので)