【Unity】Fusionことはじめ雑記

GW中旬、電車で移動中にTwitterを閲覧。
そんな時に、気になるツイートを発見!


色々調べてみると、photonのFusionというもので手軽にオンライン化ができるらしい。
www.photonengine.com
以前からオンライン周りに興味はあったものの、
そもそもどこから始めたらよいか分からない状態だった。

私にも扱える…かもしれない。GWに模索した時の雑記。
インターネット関連何も分からないのでお手柔らかに見てください。。。

一日目

回ってきたツイートを頼りに、元のGitHubにあげられているものをダウンロードし、
自身の環境でビルドして、動かしてみる。
github.com

複数タブで開くと…オンライン化できている!!!すごい!!!
そして動画を見つつどのScriptで何が行われているか読み進めていった。
youtu.be

ここで一つ大きな間違いをしている。
リファレンスを読まずに進めている。

なんとなく読んでいるので、理解が進むはずがなかった。

二日目

とりあえず公式のリファレンスに行き、SharedModeのチュートリアルを進めていった。
(この時点ではHostModeとSharedModeの違いは分かっていない)
doc.photonengine.com

が、どこかで読み間違えたのかエラーを吐いてしまった。
まだFusionに慣れていないため、エラー文が直せず四苦八苦。

三日目

この日は外に出かける予定があったため、移動中に動画を見て基礎を深めていった。
第二回の公演で、HostModeとSharedModeの違いについて語られていた。
youtu.be

ざっくりと説明すると、HostModeはFusionで新しく追加されたもので、
入力権限と処理権限が分けられていたり、クライアント側である程度予測してくれる

一方、二日目に闇雲に触っていたSharedModeは、
PUN2というもので使われていた仕組みに似たものらしい。

元のPUN2については、将来的に機能の追加を行わないそうだ。
Photon Engine - Asset Store

また、この公演をされているo8queさんのZennの記事を読んだ。
zenn.dev

記事を読んでHostModeを触ってみたくなったため、
そのチュートリアルから触り始めることにした。

四日目

HostModeのチュートリアルを1~3まで行った。

1 - はじめる | Photon Engine
2 - シーンをセットアップする | Photon Engine
3 - 予測 | Photon Engine

UnityRoomにあげて、自分の本当に処理できているか確認しながら行った。

結果があっているかどうかについては、
以下のサイトのGifを見つつ出来ているかどうかの確認を行った。
kingmo.jp

五日目

HostModeのチュートリアルを4~6まで行った。

4 - 物理 | Photon Engine
5 - プロパティの変更 | Photon Engine
6 - リモートプロシージャコール | Photon Engine

メモを取りつつ進めている。

六日目

サンプルゲームである「Asteroids」を解読する作業を行った。
doc.photonengine.com

開いてみるとFusionUnitySceneManagerUtilsScriptが存在しない。

公式リファレンスにも載っていない情報だったため、Discordで検索してみると、
既に同じ症状で悩んでいるユーザーがいた。
要約すると、2023/4/17にそのうち直す…とあるが、いまだに治っていない。
クラス名と関数名から推測するに、Sceneの文字列をIndexに直しているだけだったので、
適切なIndex番号(1)を代入して対処。

ここまでで分かっていること

NetworkRunnerを介してやりとりを行う

このNetworkRunnerがないと始まらない。
使用頻度が高そうなものをまとめると以下のような感じ。

Unity fusion
Object Object.Instantiate() NetworkObject NetworkRunner.Spawn()
void Object.Destroy()
※厳密にはGameObjectだけではない
void NetworkRunner.Despawn()
bool Physics.Raycast() bool NetworkRunner.LagCompensation.Raycast()
void SceneManager.LoadScene() void NetworkRunner.SetActiveScene()

INetworkRunnerCallbacksを継承すると
NetworkRunnerからのコールバックを受け取れる

入力に関してはOnInput()、接続したときはOnConnectedToServer()、
他にも切断した時やRunnerがシャットダウンした時~…など様々。
doc-api.photonengine.com

同期させるGameObjectには
NetworkObjectコンポーネントを付ける

必ず必要。
Prefabを作る際は Fusion->Rebuild Prefab Table を押す。

同期させたいコンポーネントには
SimulationBehaviourを継承させたScriptを作る

自身のNetworkObjectやRunnerを持っている。
入力権限・状態権限を持っているかどうかのbool型を持っている。
更新処理はFixedUpdateNetwork()を使う。 doc-api.photonengine.com

値の同期や更新を行いたい場合は
NetworkBehaviourを継承させたScriptを作る

SimulationBehaviourを継承している。
場合によってStart()の代わりにSpawned()を使う。
GetInput()で入力を取得できる。
[Networked]属性を付けた値は同期される。
doc-api.photonengine.com

おわり

かなり日記みたいになってしまった…。
が、ぜんっぜん分からない状態からある程度分かる状態にはなった。
今後もサンプルを読んだり実際に触ってみたりして理解を深めていきたいと思います。

参考にしたサイト

【シンプルスターさんのサンプル・公演】
GitHub - simplestargame/SimpleChatPhoton
GitHub - simplestargame/PhotonFusionSeminar03: Photon Fusion Seminar 03 Sample Project
Photon Fusion セミナー 第3回 オフラインのUnityゲームをFusionでオンライン化してみた - YouTube

【o8queさんの記事・公演】
Photon Fusion 始めました
Photon Fusion セミナー 第2回 Fusionでゲーム作ってみた ~Fusionをはじめる時に知っておきたいアレコレ~ - YouTube

【サンプル参考】
【Unity】Photon Fusion 100 チュートリアルやってみたキャプチャーまとめ | くものす

【公式】
グローバル クロスプラットフォーム リアルタイムゲーム開発 | Photon Engine
Photon Fusion: Photon Fusion API Documentation