はじめに
- 初めて書く記事ですので、色々不備があるかもしれません。そこはご了承ください。
- 後にPUN2等の通信技術についても触れていく予定です。この記事では比較等はありません。
- あくまで実装するだけなので詳しい解説は特にないです
参考記事
導入方法
プロジェクトの作成
ここは普通にプロジェクトを作成していきます。
僕はわかりやすいように2Dで作成しました。
MLAPIのパッケージを出力する
GitHubのリンクからパッケージをダウンロードしていきます。
今回は後ろの方にあるv12.1.7を使用します。
- MLAPI.unitypackageのみダウンロードする
- Assets > Import Package > Custom Package を選択
- ファイル選択にて、先程ダウンロード下MLAPIのunitypackageを開く。
- パッケージのアセットをすべてImportする(すべてにチェックマークがついていたらOK)
これでプロジェクトにMLAPIがインポートされました。
テストで動くものを作る
動きがわかれば特になんでもいいです。
僕は左右にしか動けないプレイヤーのプレハブを作りました。
NetworkManagerの作成
- ヒエラルキーに空のオブジェクトを作り、名前をNewworkManagerにする
- Hierarchy > NetworkManager > Add Component からNetworkManagerコンポーネントとUnet Transportを追加する
NetworkManagerはnetworkで、
Unet Transportはunetで検索すればすぐ見つかる - Hierarchy > NetworkManager > NetworkingManagerのNetwork TransportにNetworkManager自身を設定
画像のようになればOK
プレイヤーをネットワークオブジェクトとして設定
- Hierarchy > Player(prefab)にNewworkObjectコンポーネントを追加する
(networkで検索すればすぐ見つかる) - NewworkManagerのNetworkedPrefabにプレイヤーを設定する。その差異Default Player Prefabをチェックする。
画像のようになればOK
- Hierarchy > Player(prefab)に
- NetworkedTransform
を追加する
(networkで検索すればすぐ見つかる)
- NetworkedTransform
- コンポーネントを追加したプレイヤーの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
- 同様に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
- Project Settings > Player > Other Settings > Api Compatibility Level を.Net 4.xに変更
画像の様になればOK
これが終わったらビルド先のフォルダを作って選択肢、ビルドを開始する