MLAPIを使ってみる

Unity

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

https://mlapi.network/wiki/installation/
Releases · Unity-Technologies/com.unity.netcode.gameobjects
NetcodeforGameObjectsisahigh-levelnetcodeSDKthatprovidesnetworkingcapabilitiestoGameObject/MonoBehaviourworkflowswithinUnityandsitsontopofunderlyingtransportlay...

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してそれぞれ実行するとこんな感じ。

コメント

  1. […] MLAPI を使ってみる | Once and Only […]