LoginSignup
0
0

MLAPIを使ったマルチプレイを作ってみた

Last updated at Posted at 2023-05-07

はじめに

  • 初めて書く記事ですので、色々不備があるかもしれません。そこはご了承ください。
  • 後にPUN2等の通信技術についても触れていく予定です。この記事では比較等はありません。
  • あくまで実装するだけなので詳しい解説は特にないです

参考記事

導入方法

プロジェクトの作成

ここは普通にプロジェクトを作成していきます。
僕はわかりやすいように2Dで作成しました。

MLAPIのパッケージを出力する

GitHubのリンクからパッケージをダウンロードしていきます。
今回は後ろの方にあるv12.1.7を使用します。

  • MLAPI.unitypackageのみダウンロードする
    image.png
  • Assets > Import Package > Custom Package を選択
    image.png
  • ファイル選択にて、先程ダウンロード下MLAPIのunitypackageを開く。
    image.png
  • パッケージのアセットをすべてImportする(すべてにチェックマークがついていたらOK)

これでプロジェクトにMLAPIがインポートされました。

テストで動くものを作る

動きがわかれば特になんでもいいです。
僕は左右にしか動けないプレイヤーのプレハブを作りました。

NetworkManagerの作成

  • ヒエラルキーに空のオブジェクトを作り、名前をNewworkManagerにする
  • Hierarchy > NetworkManager > Add Component からNetworkManagerコンポーネントとUnet Transportを追加する
    NetworkManagerはnetworkで、
    Unet Transportはunetで検索すればすぐ見つかる
  • Hierarchy > NetworkManager > NetworkingManagerのNetwork TransportにNetworkManager自身を設定
    画像のようになればOK
    image.png

プレイヤーをネットワークオブジェクトとして設定

  • Hierarchy > Player(prefab)にNewworkObjectコンポーネントを追加する
    (networkで検索すればすぐ見つかる)
  • NewworkManagerのNetworkedPrefabにプレイヤーを設定する。その差異Default Player Prefabをチェックする。
    画像のようになればOK
    image.png
  • Hierarchy > Player(prefab)に
    • NetworkedTransform
      を追加する
      (networkで検索すればすぐ見つかる)
  • コンポーネントを追加したプレイヤーのPrefabをApplyする
    ApplyAllを押せばOK

ホスト、クライアントが参加できるようにボタンを作成

  • ヒエラルキーにUI用キャンバスを作成
  • 作成したキャンバスにボタンを追加する
  • わかりやすいようにオブジェクト名と表示テキストをStartHostに変更
  • 同じようにStartClientボタンを作成する。
    位置はどこでもいいが今回は左上にした

スクリプトの作成

  • 「プレイヤー操作スクリプト」「ホスト、クライアント参加用スクリプト」を作成する。名前はわかりやすいようにする。
    僕はPlayerControllerとStartManagerにしたが、もっといい名前はあると思う
  • StartManagerに次のコードを追加する
StartManager.cs
    public void OnClickStartHost()
    {
        Debug.Log("Start Host");
        MLAPI.NetworkingManager.Singleton.StartHost();
    }

    public void OnClickStartClient()
    {
        Debug.Log("Start Client");
        MLAPI.NetworkingManager.Singleton.StartClient();
    }
  • 先程作ったスクリプトをStartHostボタンにドラッグ&ドロップする
    StartHostボタンのコンポーネント内にスクリプトがあればOK
  • OnClick()のオブジェクトにStartHostボタンを設定し、Functionに StartManager > OnClickStartHost() を設定
    画像のようになればOK
    image.png
  • 同様にStartClientも設定する
  • PlayerControllerの基底クラスをMLAPI.NetworkedBehaviourに変更する。
  • 自分自身だけ更新処理を行わせるように、FixedUpdateの処理をIsOwnerのときだけ処理するようにIf文で条件を作る
PlayerController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MLAPI.NetworkedBehaviour
{
    // Start is called before the first frame update
    public float force = 0.2f;
    private new Rigidbody2D rigidbody2D;
    void Start()
    {
        rigidbody2D = GetComponent<Rigidbody2D>();
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        if(!(this.IsOwner))
        {
            return;
        }
        Vector2 vector2 = new Vector2();
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            vector2.x = -force;
        }
        else if(Input.GetKey(KeyCode.RightArrow))
        {
            vector2.x = force;
        }

        rigidbody2D.AddForce(vector2);
    }
}

Playerに設定するのも忘れずに

ビルド

  • ヒエラルキーにいるPlayerは起動時に複製されるため、削除する
  • 検証しやすくするため、Project Settings > Player > Resolution and Presentation > Fullscreen Mode をWindowedに変更
    画像の様になればOK
    image.png
  • Project Settings > Player > Other Settings > Api Compatibility Level を.Net 4.xに変更
    画像の様になればOK
    image.png
    これが終わったらビルド先のフォルダを作って選択肢、ビルドを開始する

動作確認

  • ビルドして出てきたexeファイルを2つ実行する。
    • 1つ目のウィンドウはホストで実行させる
    • 2つ目のウィンドウはクライアントで実行させる
      2つプレイヤーが出てきて、動きが同期されていたら成功
      image.png
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0