MLAPIを使ってみる

Unity

基本的には以下のMLAPIのQuick Startに従って話を進めます。

Installation
Installer To get started with the MLAPI. You need to install the library. The easiest way is to use the Editor installer. Simply download the MLAPI_Installer Un...
Releases · Unity-Technologies/com.unity.multiplayer.mlapi
A game networking framework built for the Unity Engine to abstract game networking concepts. - Unity-Technologies/com.unity.multiplayer.mlapi

GitHubのMLAPI.unitypackageをダウンロードし、ダブルクリックしてUnityのプロジェクトにImportします。

同期するオブジェクトはCube等何でもいいですが、UnityChan使った方がそれっぽいのでオススメ。

ダウンロード - UNITY-CHAN!

ネットワーク管理するObjectを作る

空のGameObjectにNetworkingManager的な名前を付けて、以下の2つのScriptをアタッチします。
・NetworkingManager
・Unet Transport

そしてNetworkingManagerの下の赤線の箇所に上からそれぞれ
・PlayerとなるPrefab(同期したいPrefab、今回はUnityChan)
・NetworkingManagerGameObject
を設定します。

同期したいObjectにScriptをつける

同期したいObjectには最低限NetworkdeObjectスクリプトを付与します。
その上でプレイヤー等の位置も同期するような場合はNetworkedTransformを付与します。
さらにAnimatorも同期したい場合はNetworkedAnimatorを付与します。

Player等にNetworkedTransformを付与し忘れると、Objectが初期位置にスポーンしますが、その後の移動等が同期されないため、Playerが移動してもネットワーク先では初期位置から動いてないように見えます。

NetworkedAnimatorを使う場合はAnimatorに対象のAnimatorを指定してください。
以下の例ではUnityChanを使用したので、UnityChanObjectを指定しています。

PlayerControllerで排他処理

Prefab化したPlayerを動かす際に何も処理を行わないと、ネットワーク上の自キャラと他人の操作するキャラの区別がつかないため、同時に動いてしまいます。

なのでIsOwnerでなければ処理を行わないようにします。
基本的にUpdate系のメソッドで早期リターンすればOKです。

void FixedUpdate () // or Update()
{
    if (!this.IsOwner) return;

    // 動く処理
}

HostかClientかServerか

本質的にはStartServer()かStartClient()しかないと考えた方がいいです。
StartHost()はStartServer()+StartClient()と思いましょう。
別サーバーを立てずに起動中のPCがサーバーとして動きます。

とりあえずテストするだけであればUIに適当なボタンを2つ用意し、
StartHost()とStartClient()を割り当てれば機能します。

    public void OnClickStartHost()
    {
        MLAPI.NetworkingManager.Singleton.StartHost();
    }

    public void OnClickStartClient()
    {
        MLAPI.NetworkingManager.Singleton.StartClient();
    }

接続するサーバー情報はUnet Transport Scriptに書いてあります。
デフォルトではループバックアドレス(127.0.0.1)が割り当てられていますので、自動的に起動中のPCがサーバーになります。

仮にサーバーを独立して建てる場合はBuild SettingでLinux等の適切なターゲットとServer Buildを選べばOKと思われる(試してない)。
その場合、適当なObjectで実行時にStartServer()させればいいはず。

public class Server : MonoBehaviour
{
    void Start()
    {
        MLAPI.NetworkingManager.Singleton.StartServer();
    }
}

なおStartではなく止める場合はStopHost()等を使います。

Exe実行時

ここまででとりあえずローカルサーバとして機能します。
適当なフォルダにBuildしてそれぞれ実行するとこんな感じ。

Unity
スポンサーリンク
Once and Only

コメント