Networking with PUN2

概要

  • PUNを用いてキャラクターの位置, 向きを同期
  • キャラクターには複数の種類がいて操作?も異なる, UIは統一
  • キャラクター同士はインタラクションできる → 銃?とかで?

プレイアブルキャラクターを増やす

  1. PUNにサーバーに接続, 部屋に入室
  2. Player を動的にPhotonNetwotk.Instantiate()できるようにする
  3. プラットフォームに応じて適切なコンポーネントをInjectする
    • CharacterCameraController, CharacterMovementControllerの改良
    • 操作可能かどうかを指定して生成
    • Character等を操作するPlayerを分離する

複数種類キャラクターのInstantiate

→ CustomFactoryの記事参照

Player の操作と Character の動作

各プラットフォームで入力デバイスが異なる

  • Mobile: スワイプ & ジョイスティック & ボタン
  • PC: キーボード & マウス
  • VR: HMD & コントローラ

それぞれの操作の実装は InputSource() にあり, 入力は IInputProvider に抽象される.

InputProviderIObservable<Unit> を返し, 購読することで入力を受け取れる.

キャラクターは

  • カメラの操作(CharacterCameraController または OVRCameraRig)
  • モデルの移動等(CharacterMovementControllerまたは OVRPlayerController)

で実現. 初期化時(InitPlayer) にプラットフォームで条件分岐してコンポーネントをDesroyしている(微妙な実装: Zenjectでやるべき)

ロビー入室退室までの流れ

PUN2

  1. 接続
public class PunManager : MonoBehaviourPunCallbacks {
    void Start() {
        PhotonNetwork.ConnectUsingSettings();
    }
}
  1. 入室
public class PunManager : MonoBehaviourPunCallbacks {
		public override void OnConnectedToMaster() {
        Debug.Log("connected master");
        PhotonNetwork.JoinOrCreateRoom("room", new RoomOptions(), TypedLobby.Default);
    }
}
  1. Resources のプレハブを Instantiate
public class PunManager : MonoBehaviourPunCallbacks {
		public override void OnJoinedRoom() {
        var player = PhotonNetwork.Instantiate("Character", Vector3.zero, Quaternion.identity);
    }
}
  1. イベント同期

  2. 退室

管理者, 所有者(Owner), 生成者(Creator)

ネットワーク越しに状態(リスト)を共有したい

→ Instantiate時にカスタムデータを渡すことで同等のことを実現できそう

Instantiation