アイテム機能 with PUN2
概要
- 生成, 破棄はRPC経由で
MasterClientにやらせたい- →
NetworkSceneObjectにするかは検討中
- →
GameObjectだけでなく, 全アイテムの情報も共有したい- → 生成された
GameObjectとアイテムデータの結びつけが必要
- → 生成された
- アイテムの拾得, 生成の同期をしたい
モデル
アイテム(IItem)
- 使用できるアイテム
- 名前, モデルPrefabへのパス
- Instantiate時にデータを送るのでシリアライズ可能
IPunSerializable<T>
インベントリ(IInventory)
- 複数のアイテムを格納するもの
アイテムスポナー(IRemoveSpawner<IItem, int>)
アイテム生成までの流れ
PhotonNetwork.InstantiateSceneObjeect()
Prefab
それぞれのアイテムのPrefab
アイテムPrefabにアタッチされているコンポーネント
CapsuleCollider半径以内にPlayerタグでトリガーPhotonViewPhotonTransformView位置の同期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 PunItemSpawnerとPunItemSpawnerImplはIRequestDelegatorを介してPubSub
- 非MonoBehaviourなので実際にRPCとかを実行するのは
- 非MasterClientは拾う, 生成, 破棄のリクエストを
PunRPCでMasterClient に送る. - MasterClient はリクエストが来たら
PhotonNetwork.Instantiate()でネットワークオブジェクトを生成, このとき instantiateData にアイテム情報のシリアライズしたものをつける. - 各Clientは
PickableのIPunInstantiateMagicCallback.OnPhotonInstantiate()でアイテムデータを登録, GameObject名をIItem.Uidに(PunItemSpawnerでアイテムを追跡したいので)