MonobitViewコンポーネント

目次

  概要
  MonobitView コンポーネントの制約
  コンポーネントの追加方法
  機能概要
  MonobitView ID について
  Owner について
  Ownership Transfer について
  Enable Control について
  Enable Sync Encrypt Network について
  Observed Component Registration List について


概要

MUNにおける「通信の基盤」

  MonobitView は、「RPCメッセージ通信」や「オブジェクト同期の監視」など、具体的に通信によって実現したい
  「各クライアント間の情報共有」を支援する、MUN のシステム上極めて重要なコンポーネントです。

  このコンポーネントをアタッチしているオブジェクトに追加されたスクリプト上で、
  MonobitView クラスの任意のメソッドを呼び出すことが出来ます。

  よって、MUN で個別の通信制御を行なうためには、その制御スクリプトがアタッチされているオブジェクトに、
  MonobitView コンポーネントを追加登録する必要があります。


MonobitView コンポーネントの制約

MonobitView コンポーネントは、必ず親オブジェクトに追加しなければならない

  MonobitView コンポーネントは必ず親オブジェクトに追加しなければなりません。
  オブジェクトが階層構造になっている場合、その子オブジェクトに追加しても機能しません。
  子オブジェクトの情報を同期したい場合、その情報をすべて親オブジェクトで管理できるように設計してください

静的なシーンオブジェクトの場合、MonobitView コンポーネントを持つオブジェクトは 最大 1000 個まで

  MonobitView は、同一のシーンオブジェクトとして最大 1000 個まで追加できます。
  それ以上の、プレイヤーに依存しないオブジェクトを追加することはできません。
  通信負荷の視点から言っても、この制限を超えないような設計モデルが求められます。

  シーン全体を「ネットワークを介して同期管理する」のであれば、MonobitView コンポーネントを持つシーンオブジェクトは
  ごく限られた数、できれば「1つのみ」にすべきです。

1クライアントごとに割り当てられる MonobitView コンポーネントを持つオブジェクトは 最大 1000 個まで

  プレハブ(またはアセットバンドル)によって1クライアントごとに個別に管理できるMonobitView コンポーネント付きのオブジェクトは
  上記のシーン静的オブジェクトとは別に、最大 1000 個まで追加できます。
  それ以上の、プレイヤーに依存しないオブジェクトを追加することはできません。
例えば、同一のシーンを共有したいクライアントが3つあり、それぞれ A, B, C とした場合、

【パターン1】
 A, B, C がそれぞれ「同期制御させたいオブジェクトが 1000 を超えない」場合、理論上は動作します。
 例えば
    A が操作し同期させるオブジェクトが 800 個
    B が操作し同期させるオブジェクトが 600 個
    C が操作し同期させるオブジェクトが 700 個
 の場合、それぞれのクライアントで 1000 を超えないため、動作します。

【パターン2】
 A, B, C のいずれかが「同期制御させたいオブジェクトが 1000 を超える」場合、動作しません。
 例えば
    A が操作し同期させるオブジェクトが 50 個
    B が操作し同期させるオブジェクトが 100 個
    C が操作し同期させるオブジェクトが 1020 個
 の場合、上述の【パターン1】より全体の個数は少ないですが、C のクライアントで 1000 を超えるため、動作しません。
  とはいえ、このオブジェクト制限ギリギリまでの、あまりにも多くの物体について同期処理を行なおうと試みると、
  通信総量が圧倒的に多くなってしまうため、できるだけ最小のオブジェクト数でネットワーク同期が可能な設計モデルが求められます。


コンポーネントの追加方法

Inspector の [Add Component] からの操作

  コンポーネントの追加方法は至って簡単です。

  オブジェクトの Inspector 表示にある [Add Component ] ボタンから、
  Monobit Networking > Monobit View で登録するだけです。


機能概要

基本外観

General Settings

項目名 内容
MonobitView ID ゲームシーン上でMonobitView を識別するためのIDです。
Owner MonobitView を制御する権限を持つ「所有者」の情報です。
Ownership Transfer ゲームシーン上で所有権限を移譲する際の取り決めについて設定します。
Enable Control そのオブジェクトを実際に操作可能かどうかを可視化したフラグです。
Enable Sync Encrypt Network そのオブジェクトが行なうオブジェクト同期処理について、暗号化処理を施すかどうかを可視化したフラグです。

Observed Component Registration List

  オブジェクト同期を実行するために、MonobitView に監視させることのできるコンポーネントを追加することが出来ます。
  詳しくは こちら を御覧ください。


MonobitView ID について

MonobitView ID とは?

  ゲームシーン上で「同期通信を行なうオブジェクト」を識別するためのIDです。
  例えば、「オブジェクト同期」を行なうとした場合、同期情報の送信側と受信側とで「IDの一致したオブジェクト」に対し、
  位置・姿勢・アニメーション情報を適合させる、などに用います。

静的オブジェクトの場合、初期登録時に 0 ~ 999 の範囲内で数値を割り当てる必要がある

  シーン上に設けられた静的オブジェクトに対し MonobitView コンポーネントを登録した場合、
  その初期数値として、 0~999 のうち「既に登録されているシーン静的オブジェクトのIDを除く、最も小さい数値」を割り当てる必要があります。

  原則的に MonobitView をコンポーネントとして追加したときに、自動的に割り振りされますので、特段気にする必要はありませんが、
  既にシーン静的オブジェクトとして 0 ~ 999 の MonobitView ID が割り当て済みの場合(つまりは割り当て可能最大数を超えた場合)、
  MonobitView ID が重複することによるエラーが表示されるため注意が必要です。

静的オブジェクトに割り当てられている MonobitView ID が他の静的オブジェクトの MonobitView ID と重複する場合

  自身の、あるいシーン静的オブジェクトに割り当てられている MonobitView ID が、他の静的オブジェクト上に設定された MonobitView ID と重複している場合、
  Inspector にて、以下のように
This "MonobitView ID" is stored in another object 
  という警告が表示されます。
  この場合、同一シーンに存在する他の静的オブジェクトと ID が一致するものが存在していますので、正常動作が保証されません。
  静的オブジェクトの MonobitView ID については、重複しないようにユニークなIDを与えてください。
    ※ この状態でも UnityEditor やビルドを通すことは出来てしまいますが、実行時の挙動は保証できません。

静的オブジェクトに割り当てられている MonobitView ID が規定値以外に設定されている場合

  自身の、あるいシーン静的オブジェクトに割り当てられている MonobitView ID が、規定値である 0 ~ 999 以外の数値が設定されている場合、
  Inspector にて、以下のように
This "MonobitView ID" doesn't alloed as this value(must between 0 to 999). 
  というエラー表示が為されます。
  この場合、このオブジェクトを通じてのオブジェクト同期やRPC送受信などの制御ができなくなりますので、
  MonobitView ID について 0 ~ 999 の範囲に収まるよう、適宜適切に修正してください。
    ※ この状態でも UnityEditor やビルドを通すことは出来てしまいますが、実行時の挙動は保証できません。

プレハブの場合、インスタンス化の際に自動的に設定される

  一方、プレハブの場合、インスタンス化の際に、MonobitView ID が自動的に割り当てられます。
ただし、インスタンス化において MonobitEngine.MonobitNetwork.Instantiate メソッドを利用した場合に限られます。
詳しくは ネットワーク越しのオブジェクトの生成 を御覧ください。
  なお、プレハブの Inspector に表示される MonobitView コンポーネントでは、
  MonobitView ID の値は「Decide at Runtime」と表記変更されます。


Owner について

Owner とは?

  静的オブジェクト、ならびに、インスタンス化されたプレハブの「所有者」を表します。

オブジェクト所有権チェック

  MUNのネットワーク上において、オブジェクトを制御できるのは「所有者」に限られます。
  そのため、プログラム上でオブジェクトを制御する場合、そのオブジェクトの「所有者」であるかどうかを、事前に検知する必要があります。

  詳しくは オブジェクト所有権チェック を御覧ください。

静的オブジェクトの Owner = ホスト

  シーン上に設けられた静的オブジェクトの場合、Owner はシーンとなり、オブジェクトを制御できるのはホストに限られます。

プレハブの Owner = インスタンス化したクライアント

  一方、プレハブの場合、インスタンス化の際に、「インスタンス化したクライアント」が Owner になるよう、自動的に設定されます。
ただし、インスタンス化において MonobitEngine.MonobitNetwork.Instantiate メソッドを利用した場合に限られます。
詳しくは ネットワーク越しのオブジェクトの生成 を御覧ください。
  なお、インスタンス化されるまでは Owner は未決定です。
  (Owner の項目が「Decide at Runtime」と表示されます。)


Ownership Transfer について

Ownership Transfer とは?

  Owner(所有者)について、その権限を動的に移譲できるようにするかどうかの設定です。
  この項目は以下の3つですが、それぞれの設定を行うことで、オブジェクトの権限移譲について次のように変化します。
項目名 内容
Fixed オブジェクトの所有権は固定で、生成から破棄まで以下の仕様に基づきます。
   ・ 「シーン上の静的オブジェクト」の所有者は、シーンのままです。
   ・ 「インスタンス化されたプレハブ」の所有者は、インスタンス化したクライアントのままです。
なお、Ownership Transfer のデフォルト値は「Fixed」です。
詳しくはオブジェクト所有権の移譲 を御覧ください。
TakeOver 所有者以外の「所有権移譲リクエスト(RequestOwnership メソッド)」があった場合、
オブジェクトの所有権について無条件に移譲されます。
詳しくはオブジェクト所有権の移譲 を御覧ください。
Requesst 所有者以外の「所有権移譲リクエスト(RequestOwnership メソッド)」があった場合、
所有者側が要求に対し移譲許諾を判断し、条件を満たせば
「所有権移譲リクエストへの許諾(TransferOwnership メソッド)」の処理を行ないます。
詳しくはオブジェクト所有権の移譲 を御覧ください。


Enable Control について

Enable Control とは?

  オブジェクト所有権チェック における MonobitEngine.MonobitView.isMine のフラグを可視化させたものです。
  通常、UnityEditor で非実行中の場合、このフラグを変更することはできません。
  UnityEditor で実行中の場合のみ、そのオブジェクトに対し所有権を有している場合にはチェックが入り、所有権を有していない場合にはチェックが外れます。
  ただし、実行中に値を変更することは出来ません。
  あくまで「デバッグにおけるフラグの視認」を目的として使用してください。


Enable Sync Encrypt Network について

Enable Sync Encrypt Network とは?

  Observed Component Registration List に登録された、MonobitView がクライアント間でデータ同期させるコンポーネントについて、
  同期データを送信する際に「暗号化」を行なうかどうかのフラグを可視化させたものです。

  デフォルトの設定では、チェックボックスがONの状態、つまり「暗号化を行なう」ように設定されています。

  なお MUN では、暗号化処理を有効にした場合、ECDH を用いた以下の手続きによる
  「暗号鍵共有」とデータ送受信に伴う「暗号化&復号化処理」を行なっています。
1. クライアント側からサーバ側に接続を確立すると同時に、サーバ側がそのクライアント専用の秘密鍵と公開鍵を生成し、
  その接続確立応答を受けたクライアント側でも、サーバに対する秘密鍵と公開鍵を生成する。

2. クライアント側からサーバ側に、クライアント側で生成した公開鍵を送信し、
  その受信を受けたサーバ側からクライアント側に、サーバ側で生成した「そのクライアント専用の公開鍵」を送信する。

3. クライアント側はサーバ側より受信した「サーバ側の公開鍵」と「クライアント側の秘密鍵」を使って「クライアント側の共通鍵」を生成し、
  サーバ側はクライアント側より受信した「クライアント側の公開鍵」と「サーバ側の秘密鍵」を使って「サーバ側の共通鍵」を生成する。
    ※ 「クライアント側の共通鍵」と「サーバ側の共通鍵」は同一のものになる。

4. サーバ/クライアントを問わず、送信側は「送信側の共通鍵」を使ってデータを暗号化し、受信側に送信する。

5. 受信側は「受信側の共通鍵」を使ってデータを復号化し、受信処理を実行する。


Observed Component Registration List について

Observed Component Registration List とは?

  オブジェクト同期を実行するために、MonobitView に監視させることのできるコンポーネントを追加することが出来ます。
  現時点で、以下のコンポーネントを監視対象に追加することが可能です。
  (下記以外のコンポーネントを登録しても、監視対象にはなりません)
監視対象 適用内容
Transform オブジェクトの座標・回転量・倍率が同期されます。
Rigidbody オブジェクトの速度・角速度が同期されます。
Rigidbody2D オブジェクトの速度・角速度が同期されます。
MonobitEngine.MonobitTransformView MonobitEngine.MonobitTransformView で設定された項目に応じて、オブジェクトの座標・回転量・倍率が同期されます。
MonobitEngine.MonobitAnimatorView MonobitEngine.MonobitAnimatorView で設定された項目に応じて、オブジェクトのアニメーションが同期されます。
MonobitEngine.MonoBehaviourを継承したクラス クラス内に定義された OnMonobitSerializeView() の処理内容に応じて、オブジェクトが同期されます。

リストの項目を増やす

  デフォルトでは、リスト項目は1つしかありませんが、MonobitViewコンポーネント内の
  [Add Observed Component List Column] ボタンを押すことで、項目数を増やすことが出来ます。

リストの項目を減らす

  リスト項目が2つ以上存在する場合、MonobitView コンポーネント内の、リスト項目の右隣に表示された
  [Remove] ボタンを押すことで、項目数を減らすことが出来ます。

リスト項目に監視対象のコンポーネントを登録する

  監視対象のコンポーネントを登録するためには、リスト項目に対して、
  「Inspector内に登録された監視対象コンポーネント」を、ドラッグ&ドロップします。
  ドラッグ&ドロップ後、以下のように ComponentList 内に登録されます。