37.8K Views
May 13, 22
スライド概要
Photon PUN2はFusionへ進化! 導入手順紹介と機能比較 2022/05/13 yokohama.unity #10 ~今年もユルクヤッテル~ by ニム式
自己紹介 ● ● ● 名前 ニム式 サイト http://nimushiki.com twitter https://twitter.com/ni26mu ● ● 都内勤務のWEB寄りエンジニア 数年ぶりにゲーム作りに復帰
華麗に復帰! だが1週間の壁に阻まれ 敗北… (今週中には出したい)
前置き ● ● 自分はオンラインゲーム(Fusion)初挑戦 現状WebGLでは動かない ○ Ver1.1.1より正式対応!
アジェンダ ● ● ● ● Photon Fusionとは 簡単な導入説明 PUN2との比較 まとめ
アジェンダ ● ● ● ● Photon Fusionとは 簡単な導入説明 PUN2との比較 まとめ
Photon Fusionとは ● 端的に言って、PUN2の後継 ○ ● 状態転送ネットコードSDK 新機能 ○ ○ ティックベースシミュレーションによる予測、 補完、補償 ネットワークトポロジー(接続方法) 複数に対応
ティックベースシミュレーション ● ティック ○ ● スナップショット ○ ● 実時間とは切り離された、Photon Fusionが持つ内部時間単位 各ティック毎に”唯一の世界の状態”を保存したデータ 各クライアントはスナップショットを基準にゲームを進行 ○ =ティックベースシミュレーション
難しそう… ● ● 勝手にやってくれるので大丈夫 こちらは何を同期するかを指定(実装)すればOK ○ Time.DeltaTime は Runner.DeltaTime で実装する必要がある
予測、補完、補償の例 ● 物理挙動 ○ ● NetworkRigidbodyコンポーネントをつけるだけ その他 ○ ○ ラグ補償付きのヒットボックス 通信が悪い状態でのスムーズなレンダリング
ネットワークトポロジー(接続方法) ● 4種類の接続方法から選べる ○ ○ ○ ○ サーバー型 ■ サーバー/クライアントの構成 プレイヤーホスト型 ■ P2Pの構成 共有モード ■ 上記2つの中間のような構成 ■ Photonサーバーがホストの役割をするイメージ ローカルモード ■ オフラインモード ■ 専用ロジック不要
トポロジーの設定
●
接続処理時に指定するだけ
await _runner.StartGame(new StartGameArgs()
{
GameMode = mode,
SessionName = "TestRoom",
Scene = SceneManager.GetActiveScene().buildIndex,
SceneObjectProvider = gameObject.AddComponent<NetworkSceneManagerBase>()
});
●
modeに入れるもの
○
○
○
○
○
GameMode.Host ホストとして動作
GameMode.Client クライアントとして接続
GameMode.Single ローカルで動作(ホストと同じような動作)
GameMode.Shared 共有モードで接続
GameMode.Server サーバーに接続
アジェンダ ● ● ● ● Photon Fusionとは 簡単な導入説明 PUN2との比較 まとめ
簡単な導入① ● 公式チュートリアル(日本語)通りに進めればOK ○ ● アカウントを作成 ○ ● 公式サイト右上のサインインより Unityプロジェクトを作成 ○ ● https://doc.photonengine.com/ja-jp/fusion/current/fusion-100/overview Unity 2020.3.x LTS以降が対象 SDKをダウンロード ○ ○ https://doc.photonengine.com/ja-JP/Fusion/current/getting-started/sdk-download いつもどおりプロジェクトにインポート
簡単な導入② ● PhotonダッシュボードでAppIDを作成、コピー UnityからPhotonのサービスに接続するための識別子 ○ ● UnityEditorで設定 Fusion → Fusion Hub → Fusion Setupを開く Fusion App IdにAppIDをペースト ○ ○ ● 完了
アジェンダ ● ● ● ● Photon Fusionとは 簡単な導入説明 PUN2との比較 まとめ
PUN2との比較 同期手段 PUN2 Fusion 入力 NetworkInput オブジェクト同期 高頻度 PhotonStream オブジェクト同期 [Networked] 低頻度 不定期 カスタムプロパティ RPC
個別の機能の違い ● 同期方法 ○ ○ ○ ○ ● 入力 高頻度 オブジェクトの位置やアニメーション 低頻度 プレイヤーステータスやルーム情報 不定期 入力やゲームの進行 その他
PUN2との比較 入力 PUN2 入力 Fusion プロパティに取得 INetworkInputを継承した構造体で保存 PhotonStream.SendNext(Object) NetworkInput.Set(INetworkInput) PhotonStream.ReceiveNext() NetworkInput.GetInput(INetworkInput) 必要 (とはいえifで分岐するだけ) 不要 同期方法 自他の判別
PUN2との比較 同期方法 高頻度 PUN2 名称 同期方法 その他 Fusion オブジェクト同期 オブジェクト同期 IPunObservableを実装 NetworkBehaviourを継承 SendNext,ReceiveNextメソッドで同期 したいものを送受信する プロパティに[Networked]をつける
PUN2との比較 同期方法 低頻度 PUN2 名称 カスタムプロパティ Fusion オブジェクト(プロパティ)の同期 SetCustomProperties 同期方法 プロパティに[Networked]をつけるだけ CustomProperties[key] その他 Hashtable(Dictionary)しか扱えない 型はわりと何でも OK
PUN2との比較 同期方法 不定期 RPC
PUN2
設定
メソッドに[PunRPC]属性をつける
Fusion
メソッドに[Rpc] 属性をつける
PhotonView.RPCメソッドで呼ぶ
実行方法
通常通りメソッドを呼ぶ
メソッド名を文字列で指定 する
[PunRPC]
その他
void ChatMessage(string a, string b){ }
[Rpc(RpcSources.InputAuthority, RpcTargets.All)]
ーーー
public void RPC_SendMessage(string message){ }
ーーー
PhotonView photonView = PhotonView.Get(this);
photonView.RPC("ChatMessage", RpcTarget.All,
"jup", "and jup.");
RPC_SendMessage("Hello world!");
PUN2との比較 その他 ● PUN2は公式からレガシー指定 ○ ● 今後の機能追加はナシ 料金体系はほぼ同じ ○ 無料枠は20 CCU、500 メッセージ/s
まとめ ● ● 物理挙動、ヒットボックスの件は今後検証、公開 PUN2に比べ実装はかなり楽に ○ ● ● 物理挙動やプロパティの同期、RPCの仕様はありがたい PUN2はレガシーに。新機能はFusion! これから始めるのであればFusionがオススメ
ご清聴ありがとうございました