ObservedComponentListを利用した、オブジェクト同期データのカスタマイズ

目次

  概要
  事前設定
  オブジェクト同期データの仕組み

  OnMonobitSerializeViewWrite メソッド
  OnMonobitSerializeViewRead メソッド
  OnMonobitSerializeView メソッド

  MonobitEngine.MonobitStream.isWriting プロパティ
  MonobitEngine.MonobitStream.isReading プロパティ

  MonobitEngine.MonobitStream.Enqueue メソッド
  MonobitEngine.MonobitStream.Dequeue メソッド


概要

オブジェクト同期処理時に、自由に送受信したいデータを追加する

  MonobitView コンポーネントを持つオブジェクトは、先のページで記した RPC の手段のほかにも
  クライアント間のオブジェクトそのものの同期をとるために、一定の時間間隔で情報を送受信させています。

  先述した以下のコンポーネントはその代表格で、一定の時間間隔でオブジェクトの位置や姿勢情報、
  アニメーション情報を同期しあっています。
    ・MonobitTransformViewコンポーネント
    ・MonobitAnimatorViewコンポーネント

  これらの同期は MonobitView コンポーネントの Observed Component Registration List に登録することで機能しますが、
  MUN では上記のコンポーネントだけに限らず、オブジェクトに関する情報について、ある程度自由に送受信させることが可能です。

  ここでは MonobitView コンポーネントオブジェクトに関する任意の情報を送受信する手法について説明します。

事前設定

送受信処理を組み込むためのスクリプトには、MonobitEngine.MonoBehavior の継承が必要です

  送受信処理は MUN のコールバック機能を利用しますが、
  そのコールバックの呼び出しは MonobitEngine.MonoBehavior を継承したクラスに限定されます。

MonobitView コンポーネントの Observed Component Registration List 項目に
上記で定めたスクリプトを登録しておく必要があります。

  上記で示したように、MonobitView のObserved Component Registration List に登録することで機能を発揮しますので、
  データを送受信する処理を組み込みたいスクリプトを登録しておく必要があります。

  コンポーネントを事前に登録しておく場合、その追加の方法は比較的簡単です。
  まずはオブジェクト同期処理の際に「送受信処理を独自に組み込むためのスクリプト」を、該当するオブジェクトに登録します。

  続けて、MonobitView コンポーネントにある [Add Observed Component List Column] ボタンを押し、
  リスト内に空き項目を用意します。

  空き項目を作成したら、先にオブジェクトに登録した「送受信処理を独自に組み込むためのスクリプト」を
  ドラッグ&ドロップで追加します。

  空き項目の名称が、スクリプト名に置き換わったら準備完了です。


オブジェクト同期データの仕組み

オブジェクト同期データとして取り扱うことのできるデータの種類

  オブジェクト同期データとして取り扱うことのできるデータは、先のページで記した RPC で送受信可能な種類に制限されます。
・bool(Boolean)
・byte(Byte)
・char(SByte)
・short(Int16)
・unsingned short(UInt16)
・int(Int32)
・unsigned int(UInt32)
・long(Int64)
・unsigned long(UInt64)
・float(Single)
・double(Double)
・string(String)
・Vector2, Vector3, Vector4
・Quaternion
・MonobitEngine.MonobitPlayer
・上述のデータ型に基づく、任意の長さを持つ配列情報
・上述のデータ型に基づく Hashtable
・上述のデータ型に基づく Dictionary
・上述のデータ型で構成された object(Object)
  上記に示したデータ型以外では、同期データとして取り扱えません。
  ご注意ください。

オブジェクト同期情報は MonobitEngine.MonobitStream クラスで取り扱う

  オブジェクト同期データは MonobitEngine.MonobitStream クラスで管理されます。
  MonobitStream クラスは、以下の機能を有します。
1. オブジェクト固有の任意の情報をシリアライズして、byte[] 型のデータに変換する
2. シリアライズされた byte[] 型のデータを、オブジェクト固有の任意の情報にデシリアライズする
  MonobitStream クラスでシリアライズされたデータは、MUN のネットワーク機能によって、
  オブジェクト所有権を有するクライアント側から、一定のタイミングでサーバに送信され、サーバ側を介して他のクライアントに引き渡されます。

  オブジェクト同期情報を送受信するためには、この MonobitStream クラスを使って任意の送信情報を格納することと、
  デシリアライズされた受信情報を受け取ることが必要です。


OnMonobitSerializeViewWrite メソッド

機能

  OnMonobitSerializeViewWrite メソッドは、自身の所有する MonobitView オブジェクトに対し、
  他クライアントの同オブジェクトと同期する際に、任意の情報を送信するときにコールされます。

  ここで送信された情報は、他クライアントの同オブジェクトで受信した際、同一クラスに定義された OnMonobitSerializeViewRead メソッドにて受信できます。
  したがって、この送信メソッドと OnMonobitSerializeViewRead メソッドは、かならず同一のクラス上に定義する必要があります。

  なお、OnMonobitSerializeViewWrite メソッドの送信情報は OnMonobitSerializeView メソッドで取得することはできませんのでご注意ください。

引数

変数名 内容
MonobitEngine.MonobitStream stream オブジェクト同期データと同時に送信される、独自情報のパラメータ。
詳しくは MonobitEngine.MonobitStream.Enqueue メソッド をご覧ください。
MonobitEngine.MonobitMessageInfo info 送信元である自身のプレイヤー情報、および送信元のオブジェクトのMonobitEngine.MonobitViewコンポーネントを提供します。
MonobitEngine.MonobitMessageInfo は以下のパラメータから成り立ちます。
変数名 内容
MonobitPlayer sender 送信元である自身のプレイヤー情報を示します。
MonobitEngine.MonobitPlayer は以下のパラメータから成り立ちます。
変数名 内容
int ID ルーム内にてユニークで定義される、プレイヤーの識別ID。
string Name プレイヤー名。
bool isHost このプレイヤーがルームホストであるかどうかの識別フラグ。
Hashtable customParameters プレイヤーに設定された任意のカスタムパラメータ。
Hashtable allParameters 上記4つのデータを統合した、プレイヤーに関する全情報。
MonobitView monobitView 送信元/受信先となるオブジェクトのmonobitViewコンポーネント情報を示します。
MonobitEngine.MonobitView は以下のパラメータから成り立ちます。
変数名 内容
bool isDontDestroyOnRoom 所有者がルームから退室しても、オブジェクトを削除せずに残すかどうかのフラグ。
bool isInstantiated MonobitNetwork.Instantiate() メソッドを実行して生成したオブジェクトかどうかのフラグ。
bool isChangedSerializeView 受信した情報が、前回このメソッドが呼び出された状態から変化したかどうかのフラグ。
object[] instantiationData sender側から MonobitNetwork.Instantiate() メソッドを実行したとき、
その結果サーバを介して受信した任意のパラメータ情報。
int viewID MonobitView コンポーネントの識別ID。
bool isSceneView あらかじめシーンに設置された、静的なオブジェクトであるかどうかのフラグ。
bool isOwner 自身がオブジェクトの生成者であるかどうかのフラグ。
bool isMine 自身がオブジェクトの所有者であるかどうかのフラグ。
bool Encrypt このメソッドで送受信を行なうデータについて、暗号化を適用するかどうかのフラグ。

戻り値

内容
void -

記述例

// 以下の変数を、オブジェクト同期とともに共有される独自情報とします。
int  intValue = 100;
string strValue = "MonobitEngine";
float[] floatArray = new float[] { 1.0f, 2.5f };
UnityEngine.Vector3 vec3Value = new UnityEngine.Vector3.zero;
 
// オブジェクトの同期データについて独自情報を書き込みます。
public void OnMonobitSerializeViewWrite( MonobitEngine.MonobitStream stream, MonobitEngine.MonobitMessageInfo info )
{
    Debug.Log("OnMonobitSerializeViewWrite");
 
    /*
     * 同期データの書き込み
     */
    stream.Enqueue(intValue);
    stream.Enqueue(strValue);
    stream.Enqueue(floatArray);
    stream.Enqueue(vec3Value);
}


OnMonobitSerializeViewRead メソッド

機能

  OnMonobitSerializeViewRead メソッドは、自身の所有する MonobitView オブジェクトの同期に際し、
  オブジェクト所有権を有するクライアント側からOnMonobitSerializeViewWrite メソッドを使って送信された
  任意の情報を受信するときにコールされます。

  なお、OnMonobitSerializeViewRead メソッドは、OnMonobitSerializeViewWrite メソッドと同一のクラス内に記述する必要があります。
  また、OnMonobitSerializeViewWrite メソッドで送信した順序と同じ順番で、OnMonobitSerializeRead メソッドで受信する必要があります。

  なお、OnMonobitSerializeViewRead メソッドの受信情報は OnMonobitSerializeView メソッドから送信することはできませんのでご注意ください。

引数

変数名 内容
MonobitEngine.MonobitStream stream オブジェクト同期データと同時に受信される、独自情報のパラメータ。
詳しくは MonobitEngine.MonobitStream.Dequeue メソッド をご覧ください。
MonobitEngine.MonobitMessageInfo info 誰が送信したデータか、および送信元のオブジェクトのMonobitEngine.MonobitViewコンポーネントを提供します。
MonobitEngine.MonobitMessageInfo は以下のパラメータから成り立ちます。
変数名 内容
MonobitPlayer sender 送信元のプレイヤー情報を示します。
MonobitEngine.MonobitPlayer は以下のパラメータから成り立ちます。
変数名 内容
int ID ルーム内にてユニークで定義される、プレイヤーの識別ID。
string Name プレイヤー名。
bool isHost このプレイヤーがルームホストであるかどうかの識別フラグ。
Hashtable customParameters プレイヤーに設定された任意のカスタムパラメータ。
Hashtable allParameters 上記4つのデータを統合した、プレイヤーに関する全情報。
MonobitView monobitView 送信元/受信先となるオブジェクトのmonobitViewコンポーネント情報を示します。
MonobitEngine.MonobitView は以下のパラメータから成り立ちます。
変数名 内容
bool isDontDestroyOnRoom 所有者がルームから退室しても、オブジェクトを削除せずに残すかどうかのフラグ。
bool isInstantiated MonobitNetwork.Instantiate() メソッドを実行して生成したオブジェクトかどうかのフラグ。
bool isChangedSerializeView 受信した情報が、前回このメソッドが呼び出された状態から変化したかどうかのフラグ。
object[] instantiationData sender側から MonobitNetwork.Instantiate() メソッドを実行したとき、
その結果サーバを介して受信した任意のパラメータ情報。
int viewID MonobitView コンポーネントの識別ID。
bool isSceneView あらかじめシーンに設置された、静的なオブジェクトであるかどうかのフラグ。
bool isOwner 自身がオブジェクトの生成者であるかどうかのフラグ。
bool isMine 自身がオブジェクトの所有者であるかどうかのフラグ。
bool Encrypt このメソッドで送受信を行なうデータについて、暗号化を適用するかどうかのフラグ。

戻り値

内容
void -

記述例

// 以下の変数を、オブジェクト同期とともに共有される独自情報とします。
int  intValue;
string strValue;
float[] floatArray;
UnityEngine.Vector3 vec3Value;
 
// オブジェクトの同期データについて独自情報を読み込みます。
public void OnMonobitSerializeViewRead( MonobitEngine.MonobitStream stream, MonobitEngine.MonobitMessageInfo info )
{
    Debug.Log("OnMonobitSerializeViewRead");
 
    /*
     * 同期データの読み込み
     */
    intValue = (int)stream.Dequeue();
    strValue = (string)stream.Dequeue();
    floatValue = (float[])stream.Dequeue();
    vec3Value = (UnityEngine.Vector3)stream.Dequeue();
}


OnMonobitSerializeView メソッド

機能

  OnMonobitSerializeView メソッドは、自身の所有する MonobitView オブジェクトの同期データの送受信処理時にコールされます。
  オブジェクト所有権を有するクライアント側から一定のタイミングで送信する際に、このメソッドがコールされます。
  また MUN サーバを介して、同一ルーム内に所属する全クライアント上の同一オブジェクトに対し、受信処理としてこのメソッドがコールされます。

  なお、OnMonobitSerializeView メソッドの送信情報は OnMonobitSerializeViewRead メソッドで受信できません
  同様に、OnMonobitSerializeView メソッドの受信情報は OnMonobitSerializeViewWrite メソッドで送信できませんのでご注意ください。

引数

変数名 内容
MonobitEngine.MonobitStream stream オブジェクト同期データと同時に送受信される、独自情報のパラメータ。
OnMonobitSerializeView メソッドでは以下の機能を利用して制御する必要があります。
stream.isWriting プロパティ がtrue の場合に送信処理を、falseの場合に受信処理を実行します。
stream.isReading プロパティ がtrue の場合に受信処理を、falseの場合に送信処理を実行します。
   ※ 上記双方のプロパティは、いずれか一方が true であれば他方が必ず false を示します。
・ 送信処理の際には stream.Enqueue メソッド をコールし、オブジェクト同期データを送信します。
・ 受信処理の際には stream.Dequeue メソッド をコールし、オブジェクト同期データを受信します。
MonobitEngine.MonobitMessageInfo info 誰が送信したデータか、および送信元のオブジェクトのMonobitEngine.MonobitViewコンポーネントを提供します。
MonobitEngine.MonobitMessageInfo は以下のパラメータから成り立ちます。
変数名 内容
MonobitPlayer sender このメソッドにおける stream.isReading が true である場合のみ、送信元のプレイヤー情報を示します。
stream.isReading が false の場合、sender は自身のプレイヤー情報を示します。
MonobitEngine.MonobitPlayer は以下のパラメータから成り立ちます。
変数名 内容
int ID ルーム内にてユニークで定義される、プレイヤーの識別ID。
string Name プレイヤー名。
bool isHost このプレイヤーがルームホストであるかどうかの識別フラグ。
Hashtable customParameters プレイヤーに設定された任意のカスタムパラメータ。
Hashtable allParameters 上記4つのデータを統合した、プレイヤーに関する全情報。
MonobitView monobitView 送信元/受信先となるオブジェクトのmonobitViewコンポーネント情報を示します。
MonobitEngine.MonobitView は以下のパラメータから成り立ちます。
変数名 内容
bool isDontDestroyOnRoom 所有者がルームから退室しても、オブジェクトを削除せずに残すかどうかのフラグ。
bool isInstantiated MonobitNetwork.Instantiate() メソッドを実行して生成したオブジェクトかどうかのフラグ。
bool isChangedSerializeView 受信した情報が、前回このメソッドが呼び出された状態から変化したかどうかのフラグ。
object[] instantiationData sender側から MonobitNetwork.Instantiate() メソッドを実行したとき、
その結果サーバを介して受信した任意のパラメータ情報。
int viewID MonobitView コンポーネントの識別ID。
bool isSceneView あらかじめシーンに設置された、静的なオブジェクトであるかどうかのフラグ。
bool isOwner 自身がオブジェクトの生成者であるかどうかのフラグ。
bool isMine 自身がオブジェクトの所有者であるかどうかのフラグ。
bool Encrypt このメソッドで送受信を行なうデータについて、暗号化を適用するかどうかのフラグ。

戻り値

内容
void -

記述例

// 以下の変数を、オブジェクト同期とともに共有される独自情報とします。
int  intValue = 100;
string strValue = "MonobitEngine";
float[] floatArray = new float[] { 1.0f, 2.5f };
UnityEngine.Vector3 vec3Value = new UnityEngine.Vector3.zero;
 
// オブジェクトの同期データについて独自情報を読み書きします。
public void OnMonobitSerializeView( MonobitEngine.MonobitStream stream, MonobitEngine.MonobitMessageInfo info )
{
    Debug.Log("OnMonobitSerializeView");
 
    if( stream.isWriting )
    {
        /*
         * 同期データの書き込み
         */
        stream.Enqueue(intValue);
        stream.Enqueue(strValue);
        stream.Enqueue(floatArray);
        stream.Enqueue(vec3Value);
    }
    else
    {
        /*
         * 同期データの読み込み
         */
        intValue = (int)stream.Dequeue();
        strValue = (string)stream.Dequeue();
        floatValue = (float[])stream.Dequeue();
        vec3Value = (UnityEngine.Vector3)stream.Dequeue();
     }
}


MonobitEngine.MonobitStream.isWriting プロパティ

機能

  OnMonobitSerializeView メソッド 処理内において、実行されているオブジェクト同期処理が「送信処理中」であれば true を、
  「受信処理中」であれば false を示します。

  なお、このプロパティは OnMonobitSerializeViewWrite メソッド 処理内であれば必ず true を、
  OnMonobitSerializeViewRead メソッド 処理内であれば必ず false を示します。

  また、MonobitEngine.MonobitStream.isReading プロパティ とは相反関係にあります。
  MonobitStream.isWriting が true であれば、MonobitStream.isReading は必ず false を示します。
  同様に MonobitStream.isWriting が false であれば、MonobitStream.isReading は必ず true を示します。

入出力型

内容
bool 現在オブジェクトデータの送信処理を行なっている最中かどうかのフラグです。
このフラグが true の場合には送信処理中、false の場合には受信処理中です。

記述例

// OnMonobitSerializeView のコールバック処理内で実行します。
public void OnMonobitSerializeView( MonobitEngine.MonobitStream stream, MonobitEngine.MonobitMessageInfo info )
{
    // MonobitStream.isWriting のフラグに応じて、処理を分岐させます
    if( stream.isWriting )
    {
        /*
         * ここに同期データの送信処理を記述します。
         */
    }
    else
    {
        /*
         * ここに同期データの受信処理を記述します。
         */
     }
}


MonobitEngine.MonobitStream.isReading プロパティ

機能

  OnMonobitSerializeView メソッド 処理内において、実行されているオブジェクト同期処理が「受信処理中」であれば true を、
  「送信処理中」であれば false を示します。

  なお、このプロパティは OnMonobitSerializeViewRead メソッド 処理内であれば必ず true を、
  OnMonobitSerializeViewWrite メソッド 処理内であれば必ず false を示します。

  また、MonobitEngine.MonobitStream.isWriting プロパティ とは相反関係にあります。
  MonobitStream.isReading が true であれば、MonobitStream.isWriting は必ず false を示します。
  同様に MonobitStream.isReading が false であれば、MonobitStream.isWriting は必ず true を示します。

入出力型

内容
bool 現在オブジェクトデータの受信処理を行なっている最中かどうかのフラグです。
このフラグが true の場合には受信処理中、false の場合には送信処理中です。

記述例

// OnMonobitSerializeView のコールバック処理内で実行します。
public void OnMonobitSerializeView( MonobitEngine.MonobitStream stream, MonobitEngine.MonobitMessageInfo info )
{
    // MonobitStream.isReading のフラグに応じて、処理を分岐させます
    if( stream.isReading )
    {
        /*
         * ここに同期データの受信処理を記述します。
         */
    }
    else
    {
        /*
         * ここに同期データの送信処理を記述します。
         */
     }
}


MonobitEngine.MonobitStream.Enqueue メソッド

機能

  引数型に指定した値をシリアライズし、オブジェクト同期情報に登録します。
  このメソッドの呼び出しは、以下に示す接続コールバックメソッドの同データ型の引数 stream に限定されます。
    ・ OnMonobitSerializeViewWrite メソッド
    ・ OnMonobitSerializeView メソッド

  また、ここで登録してシリアライズされた情報は、MUN が定める一定のタイミングに併せてサーバに送信され、
  自身のクライアントと同一のルームに所属する全クライアントの固有オブジェクトにて受信されます。

引数

変数名 内容
object obj オブジェクト同期データとして利用される任意の情報を指定します。
ここで指定できる obj の対象、すなわち送信可能なデータの種類は、以下のデータ型に限定されます。
・bool(Boolean)
・byte(Byte)
・char(SByte)
・short(Int16)
・unsingned short(UInt16)
・int(Int32)
・unsigned int(UInt32)
・long(Int64)
・unsigned long(UInt64)
・float(Single)
・double(Double)
・string(String)
・Vector2, Vector3, Vector4
・Quaternion
・MonobitEngine.MonobitPlayer
・上述のデータ型に基づく、任意の長さを持つ配列情報
・上述のデータ型に基づく Hashtable
・上述のデータ型に基づく Dictionary
・上述のデータ型で構成された object(Object)
  上記に示したデータ型以外では、同期データとして取り扱えません。ご注意ください。

戻り値

内容
void -

記述例

// 以下の変数を、オブジェクト同期とともに共有される独自情報とします。
int  intValue = 100;
string strValue = "MonobitEngine";
float[] floatArray = new float[] { 1.0f, 2.5f };
UnityEngine.Vector3 vec3Value = new UnityEngine.Vector3.zero;
 
// MonobitEngine.MonobitStream の同期データのシリアライズは下記のコールバックメソッドだけに限定されます。
//    ・ OnMonobitSerializeViewWrite メソッド
//    ・ OnMonobitSerializeView メソッド
// ここでは OnMonobitSerializeViewWrite メソッド を例に挙げます
public void OnMonobitSerializeViewWrite( MonobitEngine.MonobitStream stream, MonobitEngine.MonobitMessageInfo info )
{
    // MonobitEngine.MonobitStream.Enqueue メソッドを用い、
    // オブジェクトの同期データについて独自情報を登録しシリアライズします。
    stream.Enqueue(intValue);
    stream.Enqueue(strValue);
    stream.Enqueue(floatArray);
    stream.Enqueue(vec3Value);
}


MonobitEngine.MonobitStream.Dequeue メソッド

機能

  オブジェクト所有権を有するクライアントから受信したオブジェクト同期情報についてデシリアライズし、
  任意のデータ型で構成されるオブジェクト同期情報として取得します。

  このメソッドの呼び出しは、以下に示す接続コールバックメソッドの同データ型の引数 stream に限定されます。
    ・ OnMonobitSerializeViewRead メソッド
    ・ OnMonobitSerializeView メソッド

  また、デシリアライズされる情報は object 型で取得されるため、また、ここでシリアライズされた情報は、MUN が定める一定のタイミングに併せてサーバに送信され、
  自身のクライアントと同一のルームに所属する全クライアントの固有オブジェクトにて受信されます。

引数

変数名 内容
- - -

戻り値

内容
object オブジェクト同期データとして利用される任意の情報を取得します。
ここで取得できるデータはobject型に限定されるため、取得する場合には以下のデータ型への明示的なcastが必要です。
・bool(Boolean)
・byte(Byte)
・char(SByte)
・short(Int16)
・unsingned short(UInt16)
・int(Int32)
・unsigned int(UInt32)
・long(Int64)
・unsigned long(UInt64)
・float(Single)
・double(Double)
・string(String)
・Vector2, Vector3, Vector4
・Quaternion
・MonobitEngine.MonobitPlayer
・上述のデータ型に基づく、任意の長さを持つ配列情報
・上述のデータ型に基づく Hashtable
・上述のデータ型に基づく Dictionary
・上述のデータ型で構成された object(Object)

記述例

// 以下の変数を、オブジェクト同期とともに共有される独自情報とします。
int  intValue;
string strValue;
float[] floatArray;
UnityEngine.Vector3 vec3Value;
 
// MonobitEngine.MonobitStream の同期データのシリアライズは下記のコールバックメソッドだけに限定されます。
//    ・ OnMonobitSerializeViewRead メソッド
//    ・ OnMonobitSerializeView メソッド
// ここでは OnMonobitSerializeViewRead メソッド を例に挙げます
public void OnMonobitSerializeViewRead( MonobitEngine.MonobitStream stream, MonobitEngine.MonobitMessageInfo info )
{
    Debug.Log("OnMonobitSerializeViewWrite");
 
    // MonobitEngine.MonobitStream.Dequeue メソッドを用い、
    // オブジェクトの同期データについて独自情報をデシリアライズして取得します。
    intValue = (int)stream.Dequeue();
    strValue = (string)stream.Dequeue();
    floatValue = (float[])stream.Dequeue();
    vec3Value = (UnityEngine.Vector3)stream.Dequeue();
}