内容
MLAPIを利用してUnityでマルチプレイヤーゲームの実装方法について解説します。
※ 本記事は, Unity JapanのUnityでマルチプレイヤーゲームを作ろう! - Unityステーションを基にしています。
サンプルプログラム: https://drive.google.com/file/d/1x0gHaJfH8d3QlguP58_9L16Pjlqposr4/view
MLAPIのインポート方法
Github MLAPIからダウンロードし、プロジェクトにインポートします。
https://github.com/Unity-Technologies/com.unity.multiplayer.mlapi
Sceneの設定
- 「NetworkManager」という名前の空のObjectを追加します。
-
NetworkManagerオブジェクトに次の2つのコンポーネントを追加します。-
NetworkingManagerコンポーネント -
Unet Transportコンポーネント
-
-
NetworkingManagerコンポーネントのNetwork TransportプロパティにNetworkManagerオブジェクトをドラッグ&ドロップします。
ネットワークに対応したいオブジェクトの設定
- オブジェクトに
NetworkedObjectコンポーネントを追加します。 - Inspectorの
OverrideからApply Allを選択し、適用します。 - ObjectのPrefabを
Projectから選択し、NetworkManagerオブジェクトのNetworkingManagerコンポーネントのNetworkedPrefabsにドラッグ&ドロップで設定します。プレイヤーが操作するオブジェクトの場合、隣のDefault Player Prefabにチェックマークを入れます。 - Prefabを
Projectから選択し、Networed Transformコンポーネント,Networked AnimatorコンポーネントをPrefabに追加します。
Networked Animatorコンポーネントの下のチェックマークでは、Animatorがもつパラメータの中でどれをネットワーク上で同期させるかを決定します。
ボタンの設定
- 画面上にHost Button, Client Buttonを追加します。
- Script
UICallback.csを作成し、次のコードを書きます。 - 各メソッドをButtonの
On Clickイベントに設定します。
using System.Collections;
using System.Collections.Generic;
using Unity.Engine;
public class UICallback : MonoBehaviour
{
public void OnClickHost()
{
MLAPI.NetworkingManager.Singleton.StartHost();
}
public voice OnClickClient()
{
MLAPI.NetworkingManager.Singleton.StartClient();
}
}
もし、接続先のアドレスを変えたい場合はNetworkManagerオブジェクトのUnet TransportコンポーネントのConnect Addressを変更します。デフォルトでは、ローカルアドレスになっています。
ここで、同期対象のオブジェクトがシーンに配置されている場合、NetworkManagerにより生成されるため、削除する。
自分が動かすオブジェクトのみ動かす
現時点では、オブジェクトを操作した時、HostのオブジェクトもClientのオブジェクトも動作してしまいます。そこで、オブジェクトを動かすスクリプトを変更します。ここでは、便宜的にそのスクリプトをMoveController.csとします。
- オブジェクトの
MoveController.csの継承するクラスをMLAPI.NetworkedBehaviourに変更する。 - 動かしている部分のコードを
if(this.IsOwner)で囲うことにより、Ownerの場合のみ動作します。
こうすると、自分が操作しているオブジェクトのみ動くようになります。
もし、サーバーで動かしたい場合はConnect AddressとPortをスクリプトで取得し、変更する必要がある。
その他
-
ネットワーク上で同期したい変数があるときは、
[MLAPI.NetworkedVar.SyncedVar]を宣言時に書く。 -
ネットワーク越しに、関数を呼び出したい時、サーバーからクライアントに呼び出して欲しい場合は
MLAPI.Messaging.ClientRPC, クライアントからサーバーに呼び出して欲しい場合はMLAPI.Messaging.ServerRPCを宣言時に書く。呼び出すときは、this.InvokeClientRpc(関数名, Client ID)で呼び出す。 -
マッチングの機能はないので、自分で実装する必要がある。
サーバーで動かしたい時
- Built Settingsで
PC, Mac & Linux Standaloneを選択し、Target PlatformをLinuxに設定します。 -
Server Buildにチェックマークを入れ、Buildします。 - 出力されたバイナリファイルをLinux Serverに移動させ、起動します。
- ターゲットフレームをしっかり指定しないと、とんでもないレートになってしまう。