内容
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に移動させ、起動します。
- ターゲットフレームをしっかり指定しないと、とんでもないレートになってしまう。