PhotonFusionを使って オンラインマルチプレイゲームを 作った話

23.2K Views

October 01, 22

スライド概要

unity1week online共有会 #9 にて使用した資料です

profile-image

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

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

PhotonFusionを使って オンラインマルチプレイゲームを 作った話 2022/10/01 unity1week online共有会 #9 by ニム式

2.

自己紹介 ● 名前 ニム式 ● サイト http://nimushiki.com ● twitter https://twitter.com/ni26mu ● 数年ぶりにゲーム作りに復帰 ● u1wは7回目 ● 猫3匹と同棲

3.

アジェンダ ● 投稿作品について ● PhotonFusionとは ● u1wでPhotonFusionを使うにあたって ● 実装例の紹介 ● ○ 作品とPhotonFusion ○ 共有モードについて ○ 全員で共有するデータの同期方法 ○ プレイヤーをスポーンする方法 まとめ

4.

こんな作品を創りました youtube動画リンク https://youtu.be/nqm1Vu-z3mw 提供元:ぱふもどきさん (狂気の)1週間ゲームジャム全ゲーム実況 https://youtu.be/AoNC330W_yA?t=11843

5.

こんな作品を創りました~どんなゲームか ● 全員で1つのワールドを開拓するオンラインマルチゲーム ● 資源の取得、納品でレベルアップ ● 資源を”ためて”拠点を発展させる

6.

アジェンダ ● 投稿作品について ● PhotonFusionとは ● u1wでPhotonFusionを使うにあたって ● 実装例の紹介 ● ○ 作品とPhotonFusion ○ 共有モードについて ○ 全員で共有するデータの同期方法 ○ プレイヤーをスポーンする方法 まとめ

7.

Photon Fusionとは ● ● ゲーム向けネットワークエンジン ○ 状態転送ネットコードSDK ○ PUN2の後継 様々な新機能 ○ ラグ対策の仕組み ○ 帯域節約の仕組み ○ 複数の接続方法に対応

8.

アジェンダ ● 投稿作品について ● PhotonFusionとは ● u1wでPhotonFusionを使うにあたって ● 実装例の紹介 ● ○ 作品とPhotonFusion ○ 共有モードについて ○ 全員で共有するデータの同期方法 ○ プレイヤーをスポーンする方法 まとめ

9.

u1wでPhotonFusionを使うにあたって ● SDKとWebGLの相性は良好 ○ ● ● SDKに由来するエラーはゼロ 慣れないうちはゼロから実装するのは大変 ○ 作りたいゲームに一番近い公式サンプルを最大限活用する ○ https://www.photonengine.com/ja-jp/samples ○ 個別のページは日本語アリ SDKは最新(Nightly)にする ○ FusionではNightlyが安定版 最重 要

10.

アジェンダ ● 投稿作品について ● PhotonFusionとは ● u1wでPhotonFusionを使うにあたって ● 実装例の紹介 ● ○ 作品とPhotonFusion ○ 共有モードについて ○ 全員で共有するデータの同期方法 ○ プレイヤーをスポーンする方法 まとめ

11.

作品とPhotonFusion~作品の要件 『移ろいゆく世界を体験してもらいたい』 ● 全員同じワールドに接続したい ● 誰もインしてない時は風化させたい ● 途中入場、退場を自由にしたい ○ クライアントホスト型だとイマイチ ○ サーバー型は導入コストが高い

12.

作品とPhotonFusion~共有モードの特徴 ● ● 中央集権ではなく、分散管理 ○ ルームに1人でもプレイヤーがいればルームは維持される ○ サーバー設置コストなし 一部使えないFusionの機能 ○ ラグ補正ヒットボックス

13.

作品とPhotonFusion~共有モードの特徴 権限の考慮 ● ● 状態権限がないと同期できない ○ メソッドの実行 …岩の採掘 ○ 値の共有…資源量の変更 共有モードでは状態権限が不確定 ○ オブジェクトをスポーンさせた人が持つ ○ サーバー、ホスト型では一括管理 PlayerBが権限を持つオブジェクト PlayerAが権限を持つオブジェクト PlayerAは通常操作不可

14.

作品とPhotonFusion~共有モードの特徴 権限問題の解決 ● ● 状態権限の移譲 ○ 破棄する処理が必要 ○ 頻繁に行うものではなさそう RPCメソッドを活用する ○ 今回はこちらを紹介 PlayerBが権限を持つオブジェクト PlayerAが権限を持つオブジェクト PlayerAはRPCで操作

15.

全員で共有するデータの同期方法~RPCとは ● Remote Procedure Callの略。遠隔手続き呼び出し ○ ● ● ネットワーク上のプログラムでは基礎となる方法 Fusionにおける特徴 ○ パケットロスが少ない ○ 権限問題を解決できる ○ ただしゲーム内時間に対して正確ではない RPC呼び出し回数は制限があるので注意 ○ 1ルームにつき 500回/秒

16.

全員で共有するデータの同期方法~RPCの実装 ● 通常のメソッドに[RPC]をつける ● オプションで権限を設定 ● 通常のメソッドと同じように呼び出す 呼び出すために 必要な権限 実行するために 必要な権限 [Rpc(RpcSources.All, RpcTargets.All)] public void RPC_ChangeData(){} 任意 必須。仕様。 任意。管理のため

17.

全員で共有するデータの同期方法~使用例 ● プレイヤーが通過すると草が枯れるようにしたい ● 処理の流れ ○ ブロックとプレイヤーの Colliderが接触 ○ OnTriggerEnterが呼ばれる ○ RPCを実行する ○ 同期される

18.
[beta]
全員で共有するデータの同期方法~RPCの実装例
●

glassNum
○

●

[Networked]
○

●

●

草の耐久値
glassNumを同期させる

OnTriggerEnter
○

Unityおなじみのもの

○

RPCを呼び出す

RPC_ChangeGlass
○

呼び出しごとに glassNumを減算

○

glassNumが0になったら非表示

[Networked] public int glassNum { get; set; }
private void OnTriggerEnter(Collider other){
if(glassNum > 0) RPC_ChangeGlass();
}
[Rpc(RpcSources.All, RpcTargets.All)]
public void RPC_ChangeGlass(){
glassNum -= 1;
if(glassNum <= 0) GlassObj.SetActive(false);
}

19.

プレイヤーをスポーンする実装 基本の流れ 1. クライアントの起動 ● 2. ローカル用シーン ローカル用シーンを読み込む PhotonServerへ接続処理を行う ● NetworkRunner.StartGame() 3. オンライン用シーンを読み込み 4. プレイヤーをスポーン オンライン用シーン プレイヤー

20.

プレイヤーをスポーンする実装 PhotonFusionが用意したタイミング 1. OnPlayerJoin ● 2. プレイヤーがジョインした時に呼ばれるコールバック Spawned ● Spawnedを実装したオブジェクトがスポーンした時に実行されるコールバック ● unityのAwakeのようなもの

21.

プレイヤーをスポーンする実装①~OnPlayerJoined ● 実装方法は2種 ○ NetworkBehaviourを継承しINetworkRunnerCallbacksを実装 ○ OnPlayerJoinedを実装しRunner.AddCallbacksで登録する ● NetworkRunner.StartGameを実行するシーンと同じシーンに配置 ● プレイヤーがジョインするのを待ちうける

22.

プレイヤーをスポーンする実装②~Spawned ● 実装方法は2種 ○ SimulationBehaviourを継承、ISpawnedを実装(Spawnedメソッド) ○ NetworkBehaviourを継承、Spawnedをoverride ● 事前にNetworkRunnerを配置 ● Spawnedを実装したオブジェクトをスポーンさせる ● クライアントホスト型では使えない ○ クライアントは Spawnedを実行する権限がない

23.

量産オブジェクトを作る ● 見た目のバリエーションが欲しい ● 機能は同じでよい ● 同期用コンポーネントが増えがち

24.

量産オブジェクトを作る ● ● 共通して必要なもの ○ NetworkObject(Fusionの同期用) ○ NetworkTransform(Fusionの同期用) ○ BoxCollider ○ 独自スクリプト(インタラクション用) RequireComponentがおすすめ ○ クラス名の前にアトリビュートをつける ○ [RequireComponent(typeof(NetworkObject))]

25.

まとめ ● u1wでオンラインマルチも現実的 ● 共有モードについて ● ○ ゲームによっては最適解 ○ 同期処理は権限に要注意 RPCは便利だけど使いすぎに注意 ○ 呼び出し回数制限あり

26.

Photon Fusionとは 参考記事 Photon Fusion for Unityの導入手順とPUN2との機能比較 https://qiita.com/nimushiki/items/d6fe4f0cbe0437677fa8 Photon Fusion for Unityの新機能 描画補間、ラグ補償、同期範囲設定 https://qiita.com/nimushiki/items/c82763817a8c7c4f2278 その他 https://qiita.com/tags/photonfusion

27.

UnityとExitGamesの共同開発サンプル BR200 ● 200人参加可能なバトルロワイヤルゲーム ● UnityのGame Server HostingとMatchmakerも併用 ● UnityアセットストアにてDL可 https://assetstore.unity.com/packages/templates/packs/br200-battle-royale-m ultiplayer-with-photon-fusion-226753

28.

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