【Unity】Fusionことはじめ雑記
GW中旬、電車で移動中にTwitterを閲覧。
そんな時に、気になるツイートを発見!
シンプルなオンラインゲーム開発基盤です github にて無料公開しました!
— シンプルスター@Unityゲーム制作 (@lpcwstr) 2023年5月2日
プレイヤーが移動し、テキストを送信すると、プレイヤーの頭上に表示されます。
いろいろなリアルタイム通信ゲームに派生できると思います。 https://t.co/ANoac4YQWJ… #gamedev #ゲーム開発 #unity
色々調べてみると、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