昨今ではマルチプレイゲームが楽しみの一つとなっています。Unityではリレー機能なんかを使ってマルチプレイゲームを作ることが可能ですが、対戦ゲームや複数人が参加するゲームとしてはサーバー・クライアント型の方が好まれることが少なくありません。ここではそういったサーバー・クライアント型でゲームを作るにはどうすればよいかを解説したいと思います。
ここで目指すもの
ここではマルチプレイゲームの初歩、基礎になるものを作成します。実際にゲーム性があるかどうかということに関してはあまり言及しません。あくまで通信的に接続されたり、カスタマイズのきっかけになる部分を作成したいと思います。ゲーム自体はみなさんの好きなものを作って行きましょう
ゲームとして作るもの
動くものとしてはボタンでサーバー・クライアントどちらかを明確に決定します。
- サーバー
- サーバーボタンを押すことで、自身がサーバーだと認識する
- ローカル接続のため、IP/Portなどはデフォルトを利用する
- クライアントが繋がって来たら接続される
- 特に何もしない
- クライアント
- クライアントボタンを押すことで、自身がクライアントだと認識する
- IP/Portはデフォルトを利用して接続
- キャラクター画像が表示される
- 上下左右キーで移動する
プロジェクト作成と下ごしらえ
サーバー・クライアント型の実装ですが、下記リンクで作成したものをそのまま拡張して利用します。下のプロジェクトはサーバーがなく、特定のクライアントがホストを兼任する形式です。一旦こちらのプロジェクトを作成してからサーバー・クライアント型に切替を行いましょう。
上記プロジェクトが完成したリポジトリはこちら。Gitが分かる方は対象のタグからクローンしてください。
サーバー対応
アプリケーションがサーバーとして自覚するための処理を実装します。これ以降はホストの機能が不要になるので、ホストで利用していたものをそのまま流用します。
NetworkManagerUIの修正
ホストボタンを押されたときの処理を変更します。StartServerに変更するだけです。
using UnityEngine;
using UnityEngine.UI;
using Unity.Netcode;
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.StartClient();
});
}
}
表示のみですが、Hostボタンの表示をServerに変えておくのもありですね。
実際に動かしてみる
実はローカルでのサーバークライアントの基本はこれだけになります。実際に接続されるか確認してみましょう。
サーバーを起動
アプリをビルドして、実行ファイルからゲームを起動します。起動が確認できたらServerボタンを押してあとは待つだけです。
ボタンを1回押した状態でクライアントが合流出来るようにそのままにします。
クライアントを実行する
今回はエディターでクライアントを実行してみましょう。Unityを実行してクライアントボタンを押すと、キャラクターが表示されると思います。サーバー用のアプリに正しく接続されていると、サーバー用のウインドにもクライアントのキャラクターが表示されます。
これがサーバー・クライアント型の基本形になります。
オンラインのマルチプレイゲームと違う部分について
実際にオンライン用のマルチプレイゲームとして作る場合、このままでは対応ができないものがあります
- IPとPort番号が不明
- 今回はローカル環境下での接続しかできません
- クライアント側は本来どのIP/Port番号に接続するかを知る必要がある
- どのクライアントなのかがわからない
- 現在は勝手に接続してPlayerPrefabが勝手に動くだけ
- 対戦や協力プレイを行う場合、各クライアント情報を共有する必要がある
このあたりの問題に関しては実際にサーバーを起動するためのホスティングサービスやマッチングを行うMatchmakerなどを利用する時に触れていきたいと思います。
コメント
コメント一覧 (1件)
[…] サーバー・クライアント型のマルチプレイゲームの作り方(ローカル編) […]