Photon PUN2はFusionへ進化! 導入手順紹介と機能比較

タグ

スライド概要

profile-image

復活のニム式📘

@ni26mu

作者について:

都内勤務のWeb寄りエンジニア 趣味でゲームを作成

スライド一覧
シェア
埋め込む»CMSなどでJSが使えない場合

公開日

2022-05-13 19:03:00

各ページのテキスト

1. Photon PUN2はFusionへ進化! 導入手順紹介と機能比較 2022/05/13 yokohama.unity #10 ~今年もユルクヤッテル~ by ニム式

2. 自己紹介 ● 名前 ニム式 ● サイト http://nimushiki.com ● twitter https://twitter.com/ni26mu ● 都内勤務のWEB寄りエンジニア ● 数年ぶりにゲーム作りに復帰

3. 華麗に復帰! だが1週間の壁に阻まれ 敗北… (今週中には出したい)

4. 前置き ● 自分はオンラインゲーム(Fusion)初挑戦 ● 現状WebGLでは動かない

5. アジェンダ ● ● ● ● Photon Fusionとは 簡単な導入説明 PUN2との比較 まとめ

6. アジェンダ ● ● ● ● Photon Fusionとは 簡単な導入説明 PUN2との比較 まとめ

7. Photon Fusionとは ● 端的に言って、PUN2の後継 ○ 状態転送ネットコードSDK ● 新機能 ○ ティックベースシミュレーションによる 予測、補完、補償 ○ ネットワークトポロジー(接続方法) 複数に対応

8. ティックベースシミュレーション ● ティック ○ 実時間とは切り離された、Photon Fusionが持つ内部時間単位 ● スナップショット ○ 各ティック毎に”唯一の世界の状態”を保存したデータ ● 各クライアントはスナップショットを基準にゲームを進行 ○ =ティックベースシミュレーション

9. 難しそう… ● 勝手にやってくれるので大丈夫 ● こちらは何を同期するかを指定(実装)すればOK ○ Time.DeltaTime は Runner.DeltaTime で実装する必要がある

10. 予測、補完、補償の例 ● 物理挙動 ○ NetworkRigidbodyコンポーネントをつけるだけ ● その他 ○ ラグ補償付きのヒットボックス ○ 通信が悪い状態でのスムーズなレンダリング

11. ネットワークトポロジー(接続方法) ● 4種類の接続方法から選べる ○ サーバー型 ■ サーバー/クライアントの構成 ○ プレイヤーホスト型 ■ P2Pの構成 ○ 共有モード ■ 上記2つの中間のような構成 ■ Photonサーバーがホストの役割をするイメージ ○ ローカルモード ■ オフラインモード ■ 専用ロジック不要

12. [beta]

トポロジーの設定
● 接続処理時に指定するだけ
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 サーバーに接続

13. アジェンダ ● ● ● ● Photon Fusionとは 簡単な導入説明 PUN2との比較 まとめ

14. 簡単な導入① ● 公式チュートリアル(日本語)通りに進めればOK ○ https://doc.photonengine.com/ja-jp/fusion/current/fusion-100/overview ● アカウントを作成 ○ 公式サイト右上のサインインより ● Unityプロジェクトを作成 ○ Unity 2020.3.x LTS以降が対象 ● SDKをダウンロード ○ https://doc.photonengine.com/ja-JP/Fusion/current/getting-started/sdk-download ○ いつもどおりプロジェクトにインポート

15. 簡単な導入② ● PhotonダッシュボードでAppIDを作成、コピー ○ UnityからPhotonのサービスに接続するための識別子 ● UnityEditorで設定 ○ Fusion → Fusion Hub → Fusion Setupを開く ○ Fusion App IdにAppIDをペースト ● 完了

16. アジェンダ ● ● ● ● Photon Fusionとは 簡単な導入説明 PUN2との比較 まとめ

17. PUN2との比較 同期手段 PUN2 Fusion 入力 NetworkInput オブジェクト同期 高頻度 PhotonStream オブジェクト同期 [Networked] 低頻度 不定期 カスタムプロパティ RPC

18. 個別の機能の違い ● 同期方法 ○ ○ ○ ○ 入力 高頻度 オブジェクトの位置やアニメーション 低頻度 プレイヤーステータスやルーム情報 不定期 入力やゲームの進行 ● その他

19. PUN2との比較 入力 PUN2 入力 同期方法 自他の判別 Fusion プロパティに取得 INetworkInputを継承した構造体で保存 PhotonStream.SendNext(Object) NetworkInput.Set(INetworkInput) PhotonStream.ReceiveNext() NetworkInput.GetInput(INetworkInput) 必要 (とはいえifで分岐するだけ) 不要

20. PUN2との比較 同期方法 高頻度 PUN2 名称 同期方法 その他 Fusion オブジェクト同期 オブジェクト同期 IPunObservableを実装 NetworkBehaviourを継承 SendNext,ReceiveNextメソッドで同 期したいものを送受信する プロパティに[Networked]をつける

21. PUN2との比較 同期方法 低頻度 PUN2 名称 カスタムプロパティ SetCustomProperties 同期方法 その他 CustomProperties[key] Hashtable(Dictionary)しか扱え ない Fusion オブジェクト(プロパティ)の同期 プロパティに[Networked]をつけるだけ 型はわりと何でもOK

22. [beta]

PUN2との比較

同期方法 不定期 RPC
PUN2

設定

メソッドに[PunRPC]属性をつける
PhotonView.RPCメソッドで呼ぶ

実行方法

メソッド名を文字列で指定する

Fusion
メソッドに[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!");

23. PUN2との比較 その他 ● PUN2は公式からレガシー指定 ○ 今後の機能追加はナシ ● 料金体系はほぼ同じ ○ 無料枠は20 CCU、500 メッセージ/s

24. まとめ ● 物理挙動、ヒットボックスの件は今後検証、公開 ● PUN2に比べ実装はかなり楽に ○ 物理挙動やプロパティの同期、RPCの仕様はありがたい ● PUN2はレガシーに。新機能はFusion! ● これから始めるのであればFusionがオススメ

25. ご清聴ありがとうございました