Unity Mirror 入門 (4) - NetworkBehaviour
Unity Mirrorの「NetworkBehaviour」の使い方をまとめました。
・Unity2019.4.18f1 LTS
・Mirror 44.0.2
前回
1. NetworkBehaviour
「NetworkBehaviour」は、サーバー・クライアント間で同期するオブジェクトが継承するクラスです。
機能は、次のとおりです。
・同期変数
・コマンド
・クライアントRPC呼び出し
・サーバー専用とクライアント専用のメソッド
・通信イベント
2. NetworkBehaviourのプロパティ
「NetworkBehaviour」のプロパティは、次のとおりです。
・isServer : サーバー上で実行されているかどうか。
・isClient : クライアント上で実行されているかどうか。
・isLocalPlayer : ローカルプレイヤーかどうか
・hasAuthority : クライアントがオブジェクトに対する権限を持っているかどうか。
・netId : ネットワークID。
・netIdentity : ネットワークID。
・connectionToServer : サーバーへのネットワークコネクション。
・connectionToClient : クライアントへのネットワークコネクション。
3. 同期変数
NetworkBehaviourのプロパティに[SyncVar]タグを付加することで、サーバーからクライアントに自動的に同期される変数として指定できます。
[SyncVar]をサポートしているデータ型は、次のとおりです。
・C#の基本型 (byte, int, char, uint, UInt64, float, string, など)
・Unityの型 (Vector3, Quaternion, Rect, Plane, Vector3Int, など)
・URI
・NetworkIdentity
・NetworkIdentityを持つGameObject (詳細)
・サポートしているデータ型のみの構造体
・サポートしているデータ型のみのクラス
・サポートしているデータ型のみのScriptableObject
・サポートしているデータ型のみのArray
・サポートしているデータ型のみのArraySegment
同期する「リスト」や「辞書」は、以下のクラスを利用します。
・SyncList : リスト
・SyncDict : 辞書
4. コマンド
NetworkBehaviourの「Cmd」ではじまるメソッドに[Command]タグを付加することで、クライアントから呼ばれた時、サーバー上で実行されるメソッドとして指定できます。
コマンド送信できるのは、ローカルプレーヤーのみで、クライアントがサーバー上のコードを操作する唯一の方法になります。
[Command]
void CmdMoveSphere(float x, float z)
{
Vector3 v = new Vector3(x, 0, z) * 5f;
GetComponent<Rigidbody>().AddForce(v);
}
5. クライアントRPC呼び出し
NetworkBehaviourの「Rpc」ではじまるメソッドに[ClientRpc]タグを付加することで、サーバーから呼ばれた時、クライアント上で実行されるメソッドとして指定できます。
プレーヤーゲームオブジェクトに限定されず、ネットワークIDを使用して任意のゲームオブジェクトで呼び出すことができます。
6. サーバー専用とクライアント専用のメソッド
NetworkBehaviourのメソッドに[Server][Client]タグを付加することで、サーバー専用またはクライアント専用のメソッドとして指定できます。
[ServerCallback]
public void CountUp()
{
count++;
}
タグは、次のとおりです。
・[Server] : サーバー専用(クライアントが呼ぶと警告またはエラー)
・[ServerCallback] : サーバー専用(クライアントが呼んでも無処理)
・[Client] : クライアント専用(サーバーが呼ぶと警告またはエラー)
・[ClientCallback] : クライアント専用(サーバーが呼んでも無処理)
7. 通信イベント
メソッドをオーバーライドすることで、通信イベントを受信できるようになります。
public class SpaceShip : NetworkBehaviour
{
// サーバーでのオブジェクト生成時に呼ばれる
public override void OnStartServer()
{
print("OnStartServer");
}
// クライアントでのオブジェクト生成時に呼ばれる
public override void OnStartClient()
{
print("OnStartClient");
}
}
メソッドは、次のとおりです。
・OnStartServer : サーバーでのオブジェクト生成時。
・OnStopServer : サーバーでのオブジェクト破棄時。
・OnStartClient : クライアントでのオブジェクト生成時。
・OnStopClient : クライアントでのオブジェクト破棄時。
・OnStartLocalPlayer : ローカルプレイヤーの生成時。
・OnStartAuthority : 権限取得をクライアントに要求した時。
・OnStopAuthority : 権限削除をクライアントに要求した時。
8. 同期変数の動作確認
同期変数を利用するコードは、次のとおりです。
◎ 基本型
using UnityEngine;
using Mirror;
public class PlayerControl : NetworkBehaviour
{
[SyncVar]
float r;
[SyncVar]
float g;
[SyncVar]
float b;
// サーバーでのオブジェクト生成時に呼ばれる
public override void OnStartServer()
{
r = Random.Range(0f, 1f);
g = Random.Range(0f, 1f);
b = Random.Range(0f, 1f);
}
// 定期更新時に呼ばれる
void FixedUpdate()
{
// 色の指定
gameObject.GetComponent<Renderer>().material.color = new Color(r, g, b);
}
}
◎ オブジェクト型
using UnityEngine;
using Mirror;
public class PlayerControl : NetworkBehaviour
{
[SyncVar]
Color color;
// サーバーでのオブジェクト生成時に呼ばれる
public override void OnStartServer()
{
color = new Color(
Random.Range(0f, 1f),
Random.Range(0f, 1f),
Random.Range(0f, 1f));
}
// 定期更新時に呼ばれる
void FixedUpdate()
{
// 色の指定
gameObject.GetComponent<Renderer>().material.color = color;
}
}
◎ SyncList
using UnityEngine;
using Mirror;
public class PlayerControl : NetworkBehaviour
{
readonly SyncList<Color> colors = new SyncList<Color>();
// サーバーでのオブジェクト生成時に呼ばれる
public override void OnStartServer()
{
colors.Add(new Color(
Random.Range(0f, 1f),
Random.Range(0f, 1f),
Random.Range(0f, 1f)));
}
// 定期更新時に呼ばれる
void FixedUpdate()
{
// 色の指定
gameObject.GetComponent<Renderer>().material.color = colors[0];
}
}
この記事が気に入ったらサポートをしてみませんか?