見出し画像

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. 同期変数の動作確認

同期変数を利用するコードは、次のとおりです。

画像1

◎ 基本型

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];
    }
}



この記事が気に入ったらサポートをしてみませんか?