2021/8/2エンジニア

    [Unity]MLAPIを用いて簡単なオンラインマルチプレイを実装してみた

    執筆: M.M

    はじめに

    昨今のスマホゲームやPCゲームにおいてオンラインマルチプレイができるゲームはとても人気です。そんな中、Unityを使ってオンラインマルチプレイができるゲームを開発したいと思う方もいるかと思います。作り方等で調べてみると、オンラインを開発するためのプラグインの種類として、PhotonCloud、MonobitEngine、StrixCroud、MagicOnion等様々あり、どれを使って開発したらいいか悩むかと思います。

    そこで本記事では、2020年12月に公式ネットワークソリューションになったMLAPIを利用してオンラインマルチプレイを実装する方法を紹介していきます。

    ファイルを用意しよう

    今回必要なファイルは2種類です。

    ・Unity2019

    ・VisualStudio2017

    実装してみよう

    まずはUnityプロジェクトにMLAPIのパッケージをインポートするところから始めます。

    「Window」→「Package Manager」を選択してパッケージマネージャーのウィンドウを開きます。

    開いたウィンドウの左上の+ボタンを押下し、「Add package from git URL」をクリックしてURLからパッケージをインポートするようにします。

    選択したら、入力する項目が追加されるので「com.unity.multiplayer.mlapi」と入力してAddボタンを押下してください。

    一定時間経つと、下図のようにMLAPIの項目が追加されていることが確認できます。これでインポートが完了しました。

    次はMLAPIを用いてマルチゲームを実装してみます。

    動かしたいオブジェクトをプレハブに設定します。私の場合は、Herarchyから作成できるCubeを使用しました。プレハブを作成したらMLAPIに必要なコンポーネントをアタッチしていきます。

    アタッチするコンポーネントは「NetworkObject」と「NetworkTransform」です。どちらもパラメータはデフォルトで問題ありません。

    次にそのプレハブに独自のスクリプトをアタッチしていきます。CubeController.csを作成し、アタッチしてください。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using MLAPI;

    public class CubeController : MLAPI.NetworkBehaviour
    {
        void FixedUpdate()
        {
            if (!this.IsOwner) return;
            // 左に移動
            if (Input.GetKey(KeyCode.LeftArrow))
            {
                this.transform.Translate(-0.1f, 0.0f, 0.0f);
            }
            // 右に移動
            if (Input.GetKey(KeyCode.RightArrow))
            {
                this.transform.Translate(0.1f, 0.0f, 0.0f);
            }
            // 上に移動
            if (Input.GetKey(KeyCode.UpArrow))
            {
                this.transform.Translate(0.0f, 0.1f, 0.0f);
            }
            // 下に移動
            if (Input.GetKey(KeyCode.DownArrow))
            {
                this.transform.Translate(0.0f, -0.1f, 0.0f);
            }
        }
    }

    次にHierarchyで空のオブジェクトを配置し、「NetworkManager」をアタッチします。

    アタッチした後「NetwokPrefabs」に上記プレハブをアタッチして「DefaultPlayerPrefabs」にチェックをつけてくさださい。

    また、Network Transport をどうするかを選ぶところがあるので、今回は UnetTransport としましょう。すると、自動的に Unet Transport コンポーネントがアタッチされ、設定されます。

    Unet Transportのパラメーターはデフォルトのままにします。

    最後にMLAPI_GUI.csを作成し、上記空のオブジェクトにアタッチしてください。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using MLAPI;

    public class MLAPI_GUI : MonoBehaviour
    {
        void OnGUI()
        {
            if (GUI.Button(new Rect(20, 20, 100,50),”StartHost”))
            {
                NetworkManager.Singleton.StartHost();
            };
            if (GUI.Button(new Rect(20, 70, 100, 50), “StartClient”))
            {
                NetworkManager.Singleton.StartClient();
            };
        }
    }

    これで準備は完了です。マルチプレイできるか確認しますので、StandaloneでBuildを行ってください。

    起動

    UnityEditorとStancalone共に起動し、それぞれHostとClient別々で入室してみましょう。

    同期がとれていたら無事オンラインマルチプレイの実装が完了です。

    まとめ

    今回はMLAPIを用いてオンラインマルチプレイを実装してみました。MLAPIが公式ネットワークソリューションになったとはいえども、バージョンから察するに(2021/5/19時点でのバージョンは0.1.0)まだまだ改変していくかと思われます。他にもMLAPI.Relayを使用してサーバ経由でのオンラインマルチプレイもできるとのことですので、開発に合わせて使い分けることができるのは大きなメリットになりそうです。日本語のドキュメントもまだ少ないので、今後に期待したいですね。

    関連記事