Networking with PUN2
概要
- PUNを用いてキャラクターの位置, 向きを同期
- キャラクターには複数の種類がいて操作?も異なる, UIは統一
- キャラクター同士はインタラクションできる → 銃?とかで?
プレイアブルキャラクターを増やす
- PUNにサーバーに接続, 部屋に入室
Playerを動的にPhotonNetwotk.Instantiate()できるようにする- プラットフォームに応じて適切なコンポーネントをInjectする
- CharacterCameraController, CharacterMovementControllerの改良
- 操作可能かどうかを指定して生成
- Character等を操作するPlayerを分離する
複数種類キャラクターのInstantiate
→ CustomFactoryの記事参照
Player の操作と Character の動作
各プラットフォームで入力デバイスが異なる
- Mobile: スワイプ & ジョイスティック & ボタン
- PC: キーボード & マウス
- VR: HMD & コントローラ
それぞれの操作の実装は InputSource() にあり, 入力は IInputProvider に抽象される.
InputProvider は IObservable<Unit> を返し, 購読することで入力を受け取れる.
キャラクターは
- カメラの操作(
CharacterCameraControllerまたはOVRCameraRig) - モデルの移動等(
CharacterMovementControllerまたはOVRPlayerController)
で実現. 初期化時(InitPlayer) にプラットフォームで条件分岐してコンポーネントをDesroyしている(微妙な実装: Zenjectでやるべき)
ロビー入室退室までの流れ
PUN2
- 接続
public class PunManager : MonoBehaviourPunCallbacks {
void Start() {
PhotonNetwork.ConnectUsingSettings();
}
}- 入室
public class PunManager : MonoBehaviourPunCallbacks {
public override void OnConnectedToMaster() {
Debug.Log("connected master");
PhotonNetwork.JoinOrCreateRoom("room", new RoomOptions(), TypedLobby.Default);
}
}- Resources のプレハブを Instantiate
public class PunManager : MonoBehaviourPunCallbacks {
public override void OnJoinedRoom() {
var player = PhotonNetwork.Instantiate("Character", Vector3.zero, Quaternion.identity);
}
}-
イベント同期
-
退室
管理者, 所有者(Owner), 生成者(Creator)

ネットワーク越しに状態(リスト)を共有したい
→ Instantiate時にカスタムデータを渡すことで同等のことを実現できそう