同期するオブジェクトに同期用のコンポーネントを追加する

目次

  概要
  考察:常に同期させるオブジェクトについて
  考察:コンポーネントの追加について

  同期させる「プレイヤーキャラクタ制御オブジェクト」を開く
  「プレイヤーキャラクタ制御オブジェクト」に同期用コンポーネントを追加する
  「プレイヤーキャラクタ制御オブジェクト」のMonobitViewに同期用コンポーネントを関連付ける
  「プレイヤーキャラクタ制御オブジェクト」のMonobitViewを「最上位の親オブジェクト」に移動する

  同期させる「敵キャラクタ制御オブジェクト」を開く
  「敵キャラクタ制御オブジェクト」に同期用コンポーネントを追加する
  「敵キャラクタ制御オブジェクト」のMonobitViewに同期用コンポーネントを関連付ける
  「敵キャラクタ制御オブジェクト」のMonobitViewを「最上位の親オブジェクト」に移動する

  ここまでの内容について、一旦セーブする


概要

「常に同期させるオブジェクト」に対し、同期用コンポーネントを追加する

  MUN でマルチプレイを実践する上で、何よりも大事なのが、同期オブジェクトの設定です。

  「すべてのクライアントに対し、常に同じ状態を保つ必要のあるオブジェクト」の洗い出しと、
  そのオブジェクトに対し、MUNで提供された同期用コンポーネントを追加する必要があります。

  同期用コンポーネントを設定しない限り、オブジェクトに対する常時同期処理を行なってくれません。
  くれぐれも忘れないよう、注意してください。


考察:常に同期させるオブジェクトについて

「どんなオブジェクトを常に同期させるか」を考えること

  この工程に入る前に、「どんなオブジェクトを常に同期させるか」を考えることが重要です。
  単純明快な話ですが、常に同期するオブジェクトが多ければ多いほど、通信負荷は増えます。
  出来うる限り最低限の、ただし、ゲームが破綻しない範囲での、オブジェクト同期を行なうようにしましょう。

「常に同期する候補」になり得るものを列挙する

  さて、そのオブジェクトの選定についてですが。
  基本的にゲームに登場する全ての「動く物体」が選定候補です。
  (逆に「動かない物体」については、動かないのですから、わざわざ位置・姿勢を常に同期させる必要はありません。)

  今回のゲームの場合、以下の要素が「常に同期する候補」と言えます。
・プレイヤー
・敵(テディベア)
・プレイヤーの弾
・敵(テディベア)の弾

本当に「常に同期させる必要があるか」を考える

  常に同期させるかどうか判断する、もう1つの基準として、「動きが常に変動する物体」であるかどうかが問われます。
  動きが常に一定の動きをする物体、例えば今回のゲームの場合であれば「弾」など、
  発生するタイミングさえ一致すれば良い物体は「常に同期を取らず、発生時のみ同期を取る」ようにします。

  したがって、今回のゲームの場合、上記からさらに「常に同期する候補」が絞り込めます。
・プレイヤー
・敵(テディベア)
  今回はこれに絞り、同期用のコンポーネントを付加します。


考察:コンポーネントの追加について

「どのコンポーネントを追加すれば良いか」の考察

  同期を取るためのコンポーネントは、以下に示す3種類のものがあります。
・MonobitView - 同期処理を行なうオブジェクトに共通して追加されるべきコンポーネント
・MonobitTransformView - 位置や姿勢、倍率の自動同期をするコンポーネント(追加と同時に MonobitView が自動追加される)
・MonobitAnimatorView - アニメーションの自動同期をするコンポーネント(追加と同時に MonobitView が自動追加される)
  導入基準は至って簡単で、以下のように定義づけられます。
   ・位置・姿勢・倍率のいずれかが変動するなら MonobitView + MonobitTransformViewを追加する
   ・アニメーションが変動するなら MonobitView + MonobitTransformView + MonobitAnimatorViewを追加する

  奇しくも、今回常時同期オブジェクトとして指定している「プレイヤー」「敵」ともに、
  位置・姿勢・アニメーションが常に変動して動作します。
  よって両方のプレハブに対し、MonobitView + MonobitTransformView + MonobitAnimatorView を登録します。


同期させる「プレイヤーキャラクタ制御オブジェクト」を開く

Hierarchyから「プレイヤーキャラクタ本体」を選択する

  Bearpocalypse.unity から複製した、新規シーン「Test03」(Test03.unity)には、
  現在オフラインで動作するすべてのオブジェクトがシーン内に含まれています。
  その中から「プレイヤーキャラクタ本体」となるオブジェクトを Hierarchy から選択します。

  Hierarchy の中の「Player」オブジェクトがプレイヤーに当たります。
  この項目の左側に表示されている三角ボタンを左クリックして、ツリーを展開してください。
  すると、Playerの子オブジェクトに「Dude」が表示されますので、これをクリックして選択します。


「プレイヤーキャラクタ制御オブジェクト」に同期用コンポーネントを追加する

Dude オブジェクトに「MonobitTransformView」を追加登録する

  選択した Dude オブジェクトに同期用コンポーネントを追加します。
  Dude の Inspector 画面を下方向にスクロールし、
  一番下側にある [Add Component] ボタンを押してください。
  プルダウンメニューから Monobit Network > Monobit Transform View を選択します。
  Inspector に Monobit View と Monobit Transform View の2つが追加されます。

Dude オブジェクトに「MonobitAnimatorView」を追加登録する

  同様に、Dude オブジェクトに MonobitAnimatorView を追加します。
  Inspector から、[Add Component] ボタンを押してください。
  プルダウンメニューから Monobit Network > Monobit Animator View を選択します。
  Inspector に Monobit Animator View が追加されます。


「プレイヤーキャラクタ制御オブジェクト」のMonobitViewに同期用コンポーネントを関連付ける

Dude の MonobitView の「監視コンポーネント」の枠を2枠設ける

  追加された3つのコンポーネントのうち、MonobitView コンポーネントについて
  「Observed Component Registration List(監視コンポーネント登録リスト)」の欄に
・上記で追加した、Dude の MonobitTransformView コンポーネントへのリンク
・上記で追加した、Dude の MonobitAnimatorView コンポーネントへのリンク
  を追加するために、枠を2枠増やします。

  Inspector 上の Monobit View の項目内にある[Add observed Component List Column] ボタンを2回押してください。
  Observed Component Registration List の項目が2つに増えます。

Dude の MonobitView の「監視コンポーネント」に Monobit Transform View を追加する

  MonobitView の「Observed Component Registration List」 に、Monobit Transform View を登録します。
  同 Inspector に登録されている Monobit Transform View の項目名をドラッグ&ドロップしてください。
    (下図の赤枠部分についてドラッグ&ドロップするように動かしてください。)
  以下のように、登録欄が「Dude(MonobitTransformView)」のようになれば成功です。

Dude の MonobitView の「監視コンポーネント」に Monobit Animator View を追加する

  同様の方法で、MonobitView の「Observed Component Registration List」 に、Monobit Animator View を登録します。
  同 Inspector に登録されている Monobit Animator View の項目名をドラッグ&ドロップしてください。
    (下図の赤枠部分についてドラッグ&ドロップするように動かしてください。)
  以下のように、登録欄が「Dude(MonobitAnimatorView)」のようになれば成功です。


「プレイヤーキャラクタ制御オブジェクト」のMonobitViewを「最上位の親オブジェクト」に移動する

「Dude」の MonobitView コンポーネントを、親オブジェクトの「Player」に移動する

  MUNでオブジェクト同期を行なうためには、MonobitView コンポーネントは「最上位の親オブジェクト」に存在する必要があります。

  現在プレイヤー用の MonobitView コンポーネントが追加されている箇所は、子オブジェクトに当たる「Dude」ですが、
  このままではオブジェクトの同期ができませんので、これを「最上位の親オブジェクト」である「Player」に移動しましょう。

  Dude の Inspector にある MonobitView コンポーネントを、Hierarchy にある Player(最上位の親オブジェクト)に
  ドラッグ&ドロップして移動させてください。
  以下のように、Player オブジェクトのコンポーネントに MonobitView が移動しており、
  かつ、移動した MonobitView の Observed Component List に、
  子オブジェクト Dude の MonobitTransformView, MonobitAnimatorView が登録されていることを確認しましょう。
  上記と同時に、移動したことによって
  Dude の MonobitView コンポーネントが消えていることも確認しておきましょう。


同期させる「敵キャラクタ制御オブジェクト」を開く

Hierarchy から「敵キャラクタ本体」を選択する

  同様の手順で、シーンの Hierarchy に登録されているものの中から「敵キャラクタ本体」となるものを選択しましょう。

  Hierarchy の中の「NPC」オブジェクトの中に敵キャラクタ本体が含まれていますので、
  この項目の左側に表示されている三角ボタンを左クリックして、ツリーを展開してください。
  すると、NPC の子オブジェクトに「Bear」がありますので、これをクリックして選択します。


「敵キャラクタ制御オブジェクト」に同期用コンポーネントを追加する

Bearオブジェクトに「MonobitTransformView」を追加登録する

  選択した Bear オブジェクトに同期用コンポーネントを追加します。
  Bear の Inspector 画面を下方向にスクロールし、
  一番下にある [Add Component] ボタンを押してください。
  プルダウンメニューから Monobit Network > Monobit Transform View を選択します。
  Inspector に Monobit View と Monobit Transform View の2つが追加されます。

Bear オブジェクトに「MonobitAnimatorView」を追加登録する

  同様に、Bear オブジェクトに MonobitAnimatorView を追加します。
  Inspector から、[Add Component] ボタンを押してください。
  プルダウンメニューから Monobit Network > Monobit Animator View を選択します。
  Inspector に Monobit Animator View が追加されます。


「敵キャラクタ制御オブジェクト」のMonobitViewに同期用コンポーネントを関連付ける

Bear の MonobitView の「監視コンポーネント」の枠を2枠設ける

  Player と同様、追加された3つのコンポーネントのうち、MonobitView の
  「Observed Component Registration List(監視コンポーネント登録リスト)」の欄に
・上記で追加した、Bear の MonobitTransformView コンポーネントへのリンク
・上記で追加した、Bear の MonobitAnimatorView コンポーネントへのリンク
  を追加するために、枠を2枠増やします。

  Inspector 上の Monobit View の項目内にある[Add observed Component List Column] ボタンを2回押してください。
  Observed Component Registration List の項目が2つに増えます。

Bear の MonobitView の「監視コンポーネント」に Monobit Transform View を追加する

  Bear の MonobitView の「Observed Component Registration List」 に、
  同 Inspector に登録されている Monobit Transform View をドラッグ&ドロップして登録します。
   (下図の赤枠部分についてドラッグ&ドロップするように動かしてください。)
  以下のように、登録欄が「Bear(MonobitTransformView)」のようになれば成功です。

Bear の MonobitView の「監視コンポーネント」に Monobit Animator View を追加する

  同様の方法で、MonobitView の「Observed Component Registration List」 に、Monobit Animator View を登録します。
  同 Inspector に登録されている Monobit Animator View の項目名をドラッグ&ドロップしてください。
    (下図の赤枠部分についてドラッグ&ドロップするように動かしてください。)
  以下のように、登録欄が「Bear(MonobitAnimatorView)」のようになれば成功です。


「敵キャラクタ制御オブジェクト」のMonobitViewを「最上位の親オブジェクト」に移動する

「Bear」の MonobitView コンポーネントを、親オブジェクトの「NPC」に移動する

  これも Player と同様ですが、MUNでオブジェクト同期を行なうためには、
  MonobitView コンポーネントが「最上位の親オブジェクト」に存在する必要がありますので、
  Bear の「最上位の親オブジェクト」である「NPC」に移動させましょう。

  Bear の Inspector にある MonobitView コンポーネントを、Hierarchy にある NPC に
  ドラッグ&ドロップして移動させてください。
  以下のように、NPC オブジェクトのコンポーネントに MonobitView が移動しており、
  かつ、移動した MonobitView の Observed Component List に、
  子オブジェクト Bear の MonobitTransformView, MonobitAnimatorView が登録されていることを確認しましょう。
  上記と同時に、移動したことによって
  Bear の MonobitView コンポーネントが消えていることも確認しておきましょう。


ここまでの内容について、一旦セーブする

シーンデータを保存する

  変更を加えたシーンを保存しましょう。
  Unity のメニューから File > Save (または File > Save Scene) を選択してください。