Unityオンラインゲーム備忘録



0. Git管理の開始

よほどのことがない限り、プロジェクトはgit管理をした方が良いです。何かミスがあってもHDDごと吹っ飛ばない限りやり直せます。全部もう一回作ったり投げたりするよりはマシです。

  • Source Tree
    Source Treeはメチャ楽なgit操作ツール
    です。脳の3%ぐらいしか使わなくても扱えます。新しくgit管理する場合タブの+を押さないといけないのはやや分かりづらいです。

.gitignore例
Unity専用の.gitignoreです。これなしでgitを使うと、Unityで自動生成されるmetaファイルなど、追跡する必要のないキャッシュファイルをいちいち保存することになり、1コミットが重くなります。

https://github.com/github/gitignore/blob/main/Unity.gitignore


1. ParrelSyncのimport

ParrelSync
複数エディターでマルチプレイのテストが可能になるめちゃすごプラグイン
。Unityはデフォルトでエディターを2つ開けないので、これを使わないとテストプレイのたびにコピペで別プロジェクトとして立ち上げたり、他のPCを用意したり、エディターとビルドでテストすることになり非常に面倒でおじゃるまる。

ParrelSync: https://github.com/VeriorPies/ParrelSync/releases 
ParrelSync APIs: https://github.com/VeriorPies/ParrelSync/wiki/List-of-APIs 


2. UDP通信を書く

なぜUDP通信を書くのか、何故なら無料だから。
とは言っても以下で自分が公開してるスクリプトをコピペ保存してテキトーなシングルトンとしてアタッチすればOK
https://github.com/AtomicHeadd/UnityScripts/blob/main/Multiplayer.cs

ここまでで位置同期ができるようになったのでマルチプレイゲームの最低限の機能は完了です。


3. ロビーサーバー作成

なぜFirebaseを使うのか、何故なら無料だから。
サーバー側はPythonで書きます。Pythonが書けるとhuggingfaceから今流行りの大規模機械学習モデルが簡単に動かせたり良いことがいっぱいです。
firebaseのpythonライブラリにはサードパーティーのpyrebase4を使います。複雑なクエリは使えなそうですが、最低限直感的で使いやすいとは思います。

pyrebase4 (公式github)
https://github.com/nhorvath/Pyrebase4 

FireBase側の設定です

  • firebase→プロジェクト作成→Realtime Database→作成

  • ルールはデフォルトでread, write不可なので両方trueにしておく

  • 概要からアプリを追加→Webを選択。configは今はどうでもいいのでてきとうに選んで概要に戻る

  • 概要にアプリが追加されているので設定を開く

  • そこにPyrebase4で使うapikeyなどがあるので、以下チートシートを参考に基本的なデータの検索・更新あたりを試しておく

  • これを使ったロビーサーバーの例は以下。cloneして.envファイルを上の手順で作ってください

ロビーサーバーの例:
https://github.com/AtomicHeadd/GameLobby_pyrebase4

(参考) Pyrebase4チートシート: 


4. ロビーサーバーデプロイ

ロビーサーバーのデプロイにはRenderを使います。何故なら無料だから
(今までherokuを使っていましたが無料プランがなくなったので別のサービスに乗り換えました)。
無料でデプロイできるサービスは今後も変わっていくと思うのでその都度最適なサービスにデプロイするようにしましょう。

githubで管理していれば以下の記事で簡単にデプロイできそうです。.envファイルを含める必要があるのでprivate repositryでデプロイしましょう。

見た感じデプロイ時のコマンド変更が分かりやすかったり、pushに応じて自動デプロイする機能が備わっているのでかなり使いやすいサービスだと感じます。


5. STUN組み込み

オンラインゲームのP2P通信に当たって、通信相手のIPアドレスを知る必要がありますが、相手側の画面で見えているのは相手の内部IPアドレスで、外部IPアドレスは一度通信してみるまで決定しません (詳しくはNAT越え、NATパンチスルー、NAT traversalなどで検索してみてください。ちなみに対応するべき通信技術の正式名称はNAPTです)。

なので外部IPアドレスを教えてくれるサーバーに一度通信することで自分のIPアドレスを知り、それを相手に送ります(自分のおでこの文字を読んでもらうみたいな感じです)。

STUNには海外の方が作ってくれたC#のSTUNクライアントを使います。こちらのプラグインはThe Code Project Open License (CPOL)で公開されていて、こちらのソースコードを含むゲームの商用利用は可能なようです。

ダウンロードしたStun.zipのSTUN_Client_app>STUN_Client_app>dep>LumiSoft.Net.dllをUnityのpluginフォルダなどに入れておきます。

このSTUNプラグインを使ってひとまず自分のグローバルIPを取得するとこまでできました。


6. ポーリングによるロビーサーバーとの通信

  • HTTP通信にはCoroutineなどの非同期処理が必要です

  • 部屋に入ってから人数が集まるまでは、部屋の情報を繰り返し取得するポーリングという処理が必要となります。

  • サーバーとの通信結果はJSONなので、JSONをdict<string, string>に変更できるプラグインを入れます。

まずJsonSerializerをダウンロードします
https://github.com/JamesNK/Newtonsoft.Json/releases

適当なバージョンを選び、その中のBin>net40からNewtonsoft.Json.dllをUnityに入れます。

(現在書きかけです。ただ人によってはもう最後まで作れる状態だと思います)


この記事が気に入ったらサポートをしてみませんか?