Game Server Hosting(Multiplay)を利用することで、自身でサーバーを用意しなくても、サーバークライアント型でマルチプレイゲームを導入することができます。ここではサーバーの登録方法をご紹介したいと思います。
事前準備
ホスティングサービスを利用する前には、ローカル環境でサーバークライアント型の動作確認が行えるものを作れていることが望ましいです。
動作するサーバー・クライアント型のプロジェクト
こちらのリンクを参考に、サーバー・クライアントで動くプロジェクトを用意してください。
クレジットカード
Game Server Hostingの機能を使うには、クレジットカードが必要になります。登録から一定期間内であれば、ある程度のクレジットが利用可能なのですぐにお金が必要になるわけではありませんが、基本的には有料のサービスであることに注意してください。
サービスを利用している途中で、支払い方法の登録を促されるタイミングがありますので、利用できるクレジットカードを登録してください。
どこで要求されるか忘れてしまったので、各自然るべきタイミングで登録してください
サーバーを自動で起動させるための処理を追加
お気づきかもしれませんが、サーバーを起動する際、誰かがボタンを押してくれるわけではありません。そのため今までとは大きくことなる実装が必要になります。
引数を利用したサーバーの判定処理
起動したアプリケーションがサーバーなのかどうかはアプリを起動する際の引数を利用して判別を行います。サーバー起動用にServerStartupスクリプトを作成します。Startメソッドで引数を利用してサーバーかどうかを判断するための処理を書きたいと思います。isServerが真の場合、サーバーだと見なし起動します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.Netcode;
using Unity.Netcode.Transports.UTP;
public class ServerStartup : MonoBehaviour
{
private void Start()
{
bool isServer = false;
ushort serverPort = 7777;
string externalServerIP = "0.0.0.0";
var args = System.Environment.GetCommandLineArgs();
for (int i = 0; i < args.Length; i++)
{
if (args[i] == "-dedicatedServer")
{
isServer = true;
}
else if (args[i] == "-port" && i + 1 < args.Length)
{
serverPort = ushort.Parse(args[i + 1]);
}
else if (args[i] == "-ip" && i + 1 < args.Length)
{
externalServerIP = args[i + 1];
}
}
if (isServer)
{
StartServer(externalServerIP, serverPort);
}
}
private void StartServer(string ip, ushort port)
{
QualitySettings.vSyncCount = 0;
Application.targetFrameRate = 60;
NetworkManager.Singleton.GetComponent<UnityTransport>().SetConnectionData(ip, port);
NetworkManager.Singleton.StartServer();
}
}
簡単な説明をすると、System.Enviroment.GetCommandLineArgsを使うことで、アプリを起動したときの引数を受け取ることができます。引数は文字列の配列で渡され、いろいろなオプションを利用することができます。
- -dedicatedServer
- サーバーかどうかを判断するために使います
- -port
- 起動するサーバーのポート番号
- 実際の番号は次の引数に入ります
- -ip
- サーバーにアクセスするためのIPアドレス
- 実際のIPは次の引数に入ります
サーバーかどうかだけは-dedicatedServerがあるかどうかだけですが、後々のために他のオプションも指定出来るようにしています。ちなみにこのコードだけでは当然ですがサーバー起動してないのであしからず。
スクリプトが作成できたら空のゲームオブジェクトを作成して、ServerStartupスクリプトを貼り付けましょう
ローカルで機能するか試す
いきなりHostingサービスにアップロードして試すのはさすがに怖い。ということで現時点でサーバー・クライアントで動くか確認してみます。ここではWindowsでの開発を想定します。
- Windows用にexeファイルをビルドで作成
- Build Settingsを開く
- Buildボタンでビルドを実行。アプリケーションを出力するフォルダを指定してください。
- 出力されたアプリを、コマンドラインから起動する
- コマンドラインツールを起動して、下記コマンドを利用して動かします
- コマンドラインで起動したらボタンなどは押さずにそのまま放置!
> [ここはビルドしたアプリケーション名].exe -dedicatedServer
- サーバー用のアプリが起動したら、Unityエディタでクライアントを起動
- 再生して「Client」ボタンを押してください
クライアントを起動して、今まで通りクライアントとサーバーのアプリにキャラが表示され、クライアントの動きで同期されたら成功です。
画面的に変わりないですが、サーバーがコマンドラインで動いているのを確認できればOKです
サーバー用のアプリをビルド
では、ホスティングサービスにアップロードするためのビルドを行いたいと思います。これまではWindowsでの確認用のためにWindows(Standalone)を利用していました。実際のサーバー用アプリは、別のものを使います。
- プラットフォームを変更
- Build Settingsを開く
- Dedicated Serverに変更
- Target Platform:Linux
- 設定を行ったら「Switch Platform」で切り替えを行う
- アプリケーションを作成
- Buildボタンでビルド
- 生成先のフォルダはできれば新しいフォルダを指定がオススメです。
- 下記フォルダのような構成になればOK(アプリ名はserverで作成してます)
これらのファイルはそのままHosingサービスにアップロード行います。
Hosting サービスに設定を行う
Servicesのリンク
- Project Settingsからプロジェクトのリンク
- Servicesを選択
- 既存もしくは新規にプロジェクトをリンク
- 注意:Unityに利用されるユーザーでのログインを行ってください
- 既存のプロジェクトがない場合はCreate a new Unity Project IDから作成を行ってください
- ダッシュボードへ移動
- Project Settings>Servicesページにリンク後表示されるMembersのDashboardからリダイレクトを行う
- 必要があれば、サインインを行う
- 下図のような画面が表示されたら成功です
Game Server Hostingを有効にする
ホスティングサービスを利用するためには、対象のプロジェクトに必要なサービスを起動する必要があります。
- 製品を選択
- 先程のページ左側の製品を選択
- (ショートカットが開通している場合は追加したいサービスをすぐに追加してもOK)
- Game Server Hostingを起動
- MULTIPLAYERの中にGAMING SERVICES Game Server Hosting(Multiplay)がありますので、そちらの「起動」ボタンを選択。
有効になるまでは若干時間がかかります。しばらくお待ち下さい
Game Server Hostingの設定
有効化されたらサーバーの設定を行います。
Integrate game serverボタンを押します
- Select engine
- Unityを選択してNext
- Link Unity project
- ローカルで、アプリケーション側のサービス連携を行う指示があります。
- これはすでにやっているのでNext
- Install package
- Unityのプロジェクトに必要なパッケージを教えてくれます
- com.unity.services.multiplay
- 前回のプロジェクトですでに導入済み
- 新規にプロジェクトを作成する場合はパッケージを導入してください
- Finish
- Unityのプロジェクトに必要なパッケージを教えてくれます
- Details
- Build name:ビルドされたアプリの名前。今回は「TestBuild」とします。
- Operating system:Linux
- Upload method:Direct file upload
- Upload files
- アップロードするファイルを指定
- ビルドしたサーバー用のファイルをドラッグアンドドロップでDrag file(s)に入れる
- browseから指定してもOK
- Upload xxx Filesボタンが押せるようになると、クリックしてアップロード。しばし待つ
- 自分の場合は191ぐらいでした。バージョンによって変わると思うので同じじゃなくてもあまり気にしないように。目安としてください。
- Nextが押せるようになったらNext
- アップロードするファイルを指定
- Create version
- 初回の場合は次のような表示になると思います
- Build name:上記で入力したビルド名(TestBuild)
- Version:Version 1
- Finish
ビルド設定を作ります。
- Details
- Build configuration name:BuildConf01
- Build:TestBuild
- Game server executable:server.x86_64
- ビルドで作成したファイル
- 大本の実行ファイルは拡張子x86_64です
- Query type:SQP
- Launch parameters:起動オプションを追加します。下のコマンドを入力してください
- サーバーとして起動させるオプションを追加:-dedicatedServer
- 実際に動くサーバーでは、グラフィックは不要なのでカット:-nographics
- Next
- Configuration variables
- 追加する変数はないのでそのままFinish
-dedicatedServer -nographics -port $$port$$ -queryport $$query_port$$ -logFile $$log_dir$$/Engine.log
フリートはサーバーの起動状況などを指定することができます。ここミスると常にサーバーが起動してしまうので注意してください。
- Details
- Fleet name:フリートの名前。Fleet01
- Operating system:Linux
- Build configuration(s):作成済みのBuildConf01を選択
- Next
- Scaling settings
- Region:Asia(日本が対象なら)
- Min available servers:0
- Max servers:2
- Cloud server density
- デフォルト設定で!
- Servers per machineは2にしてもいいかも
ここまで作成したものがちゃんと動くかを確かめます。
- Set up
- Fleet:Fleet01(作成したものから設定)
- Region:Asia(日本なら)
- Build configuration:BuildConf01(作成したものから設定)
- Next
- Run test
- 「Run test」ボタンを押してしばし待つ
- 10分弱ぐらい起動にかかります
- Finishが押せるようになったら押して終了!!
テスト割り当てが完了すると、左側のサーバータブを選択してみてください。StatusがAllocatedになっているサーバーが1つあれば、期待通りのサーバーが立ち上がっている状態になります。大体1時間ぐらい経ったら勝手に終了します。
確認用にサーバーを立ち上げたい時はテスト割り当てから行うことができます。このあとのクライアント接続確認を行う時に利用してください
クライアントの接続確認
あとはエディターなどでクライアント接続を行って、サーバー・クライアント型のゲームが作れたか確認を行いましょう。
ソースコード修正
今回は固定でサーバーに接続する処理を実装します。
- IPとポート番号を確認する
- サーバータブなどから、起動しているサーバーのIPとPort番号を確認してください。
- 起動しているかどうかはStatusがAllocatedかOnline
- 下図だと
- IP:34.126.160.14
- Port:9000
プログラムの変更点はクライアント接続用のボタン内、StartClientする前にIP/Portを指定する箇所です。
using UnityEngine;
using UnityEngine.UI;
using Unity.Netcode;
using System;
using Unity.Netcode.Transports.UTP;
public class NetworkManagerUI : MonoBehaviour
{
[SerializeField] private Button hostButton;
[SerializeField] private Button clientButton;
private void Awake()
{
hostButton.onClick.AddListener(() =>
{
NetworkManager.Singleton.StartServer();
});
clientButton.onClick.AddListener(() =>
{
NetworkManager.Singleton.GetComponent<UnityTransport>().SetConnectionData("34.126.160.14", 9000);
NetworkManager.Singleton.StartClient();
});
}
}
動かして確認
Unityエディタなどで起動して、Clientボタンを押して今まで通りにキャラクターが表示されるのを確認しましょう。画面的には変わりないです。ローカルでできてたことがオンラインで出来るようになっただけ!
Windows版のアプリを作って多重起動っぽくして共有されるのを確認するのもいいですね。
うまく動かないパターン
クライアントボタンを押してもうまく行かない時は、下記項目を確認してみてください。
- サーバーが停止している
- 今回は手動でサーバーを動かす必要があるため、割り当てをダッシュボードから行います。
すべてのStatusがAvailableの場合、サーバーに接続が行えません - ServerIDのリンクを選択>右上のStart serverボタンを押して起動
- サーバーが動いている間にクライアントを起動して確認してください。
- 今回は手動でサーバーを動かす必要があるため、割り当てをダッシュボードから行います。
- Start serverがうまく行かない場合
- たまにエラーが発生します。Oopsじゃねーよ!
- 別のサーバーを起動するか、テスト割り当てを再度行って試してみてください
- IP/Portが間違っている
- 再起動などを行うと、IPが変更されることがあります。
- Start serverだけなら変更されない
- 普通にタイプミスもあるのでとりあえず確認!
コメント
コメント一覧 (1件)
[…] UnityのGame Server Hostingにサーバーを登録する方法 Game Server […]