ネットワーク越しのオブジェクトの生成

目次

  概要
  注意
  事前設定
  MonobitEngine.MonobitNetwork.AssetBundlePath プロパティ
  MonobitEngine.MonobitNetwork.Instantiate メソッド(1)
  MonobitEngine.MonobitNetwork.Instantiate メソッド(2)
  MonobitEngine.MonobitNetwork.Instantiate メソッド(3)
  MonobitEngine.MonobitNetwork.Instantiate メソッド(4)
  インスタンス生成されたオブジェクトの破棄
  接続コールバック


概要

プレハブ/アセットバンドルを用いたインスタンス生成を「ネットワーク上で同期」させて実行する

  プレハブまたはアセットバンドルをもとにインスタンス生成を行なう Unity のメソッドとして
    ・UnityEngine.Instantiate
    ・UnityEngine.CreateAssetBundle(UnityEngine.LoadAssetBundle)
  などがありますが、これはあくまでローカル上でのインスタンス生成でしかありません。
  ネットワーク越しに同時にオブジェクトを生成するためには、それなりのプロセスが必要です。

  MUN では、ネットワークの垣根を超えて複数のクライアント上で同時にインスタンス生成するためのインタフェースを用意しています。
  ここではそれについて御紹介します。


注意

プレハブは Resources フォルダに格納する必要があります。

  非常に重要なことですが、プレハブは Resources という名称のフォルダに入れてください
  スペルミスにも注意してください。(一文字でも間違えると機能しません。)
※ MUNではマルチプラットフォーム対応(特にiOSデバイス)のために内部的にResources.Load()でプレハブを読み込んでおり、
  Resources フォルダに含まれていないプレハブは読み込めません。

Android/iOS端末上でアセットバンドルをIL2CPP ビルド環境で読み取る場合、
ビルド設定上 StripEngineCode を無効にする必要があります。

  これも非常に重要なことですが、IL2CPPビルドにおいて、アセットバンドルのオブジェクトが削除されてしまうので注意が必要です。

  IL2CPPでビルドした場合、ビルド途上でUnityが「不要」と判断したスクリプトやデータ類を全て破棄した状態でアプリケーションを生成しますが、
  この時、汗っとバンドルは有効なスクリプト内での利用の是非に関わらず、問答無用で削除されます。
  このため、デフォルトの状態でアセットバンドルの読み込み処理をIL2CPPでビルドした場合、そのアプリケーションは読み込みに100%失敗します。

  これを防ぐためには、Android/iOSのビルド設定にてStripEngineCodeを無効にする必要があります。
  詳細につきましては、以下のページをご覧ください。

    〇 Android 版のビルドの場合
        「プラットフォームごとのビルド、および実行手順」 > 「Android 版のビルド、および実行手順」 > 「【アセットバンドル使用時】StripEngineCodeを無効にする」

    〇 iOS 版のビルドの場合
        「プラットフォームごとのビルド、および実行手順」 > 「iOS 版のビルド、および実行手順」 > 「【アセットバンドル使用時】StripEngineCodeを無効にする」


事前設定

生成されるプレハブ/アセットバンドルに MonobitView コンポーネントを登録する必要があります。

  また、生成されるプレハブおよびアセットバンドルには、必ず MonobitView コンポーネントが登録されている状態にしてください。
  登録していない場合には生成されません。

MUNサーバに接続しており、かつルームに入室している必要があります。

  オブジェクト生成はマルチプレイ用の制御ですので、ルームに入室していない状態で出現させることはできません。


MonobitEngine.MonobitNetwork.AssetBundlePath プロパティ

機能

  ネットワーク越しにアセットバンドル経由でオブジェクトを生成する場合、事前にそのアセットバンドルが含まれているフォルダ(ディレクトリ)を指定します

  アセットバンドルからの生成メソッドについては、以下の項目をご確認ください。

      MonobitEngine.MonobitNetwork.Instantiate メソッド(2)
      MonobitEngine.MonobitNetwork.Instantiate メソッド(4)
      MonobitEngine.MonobitNetwork.InstantiateSceneObject メソッド(2)

入出力型

内容
string アセットバンドルのデータが含まれているフォルダ(ディレクトリ)へのパスを指定します。
標準的なUnityプロジェクトにおける指定方法については、Unityドキュメントの以下のページをご覧ください。
  https://docs.unity3d.com/ja/current/Manual/StreamingAssets.html

記述例

// UnityEngine.Application.streamingAssetsPath をアセットバンドルのパスに指定します。
MonobitEngine.MonobitNetwork.AssetBundlePath = UnityEngine.Application.streamingAssetsPath;


MonobitEngine.MonobitNetwork.Instantiate メソッド(1)

機能

  ネットワーク越しに、プレハブからインスタンスを生成します。

  生成されたオブジェクトは、同一ルームに入室している限り、シーン切り替えによって消失しません。
  ただし、この命令を実行したクライアント(オブジェクト所有者)がルームから退室した場合、生成したオブジェクトは消失します。

引数

変数名 内容
string prefabName インスタンスを生成するプレハブ名。
該当するプレハブは、必ず Resources フォルダ内に置かれている必要があります。
Vector3 position インスタンス生成時に適用する、Vector3 で表される位置情報。
Quaternion rotation インスタンス生成時に適用する、Quaternion で表される回転情報。
int group インスタンス生成後に所属することになる、MonobitView のグループID。
グループについては こちら を御覧ください。

group に 0 以外の数値を指定した場合、そのグループIDの送受信が許可されていない場合、オブジェクトが生成されません。
・送信側クライアントで 0 以外の数値を設定する場合、MonobitEngine.MonobitNetwork.SetSendingEnabled() メソッドにて、
 事前にインスタンス生成で指定したいグループIDの送信許可を与えてください。
・受信側クライアントで 0 以外の数値を設定する場合、MonobitEngine.MonobitNetwork.SetReceivingEnabled() メソッドにて、
 事前にインスタンス生成で指定したいグループIDの受信許可を与えてください。

戻り値

内容
GameObject インスタンス生成されたGameObjectの情報。

記述例

/*
 * ネットワーク越しに、"Prefab"という名前のプレハブからインスタンス生成します。
 * 位置は (0, 0, 0), 回転量は (0, 0, 0), グループIDは 0 を指定します。
 */
MonobitEngine.MonobitNetwork.Instantiate( "Prefab", Vector3.zero, Quaternion.identity, 0 );


MonobitEngine.MonobitNetwork.Instantiate メソッド(2)

機能

  ネットワーク越しに、プレハブまたはアセットバンドルのいずれかから、インスタンスを生成します。

  生成されたオブジェクトは、同一ルームに入室している限り、シーン切り替えによって消失しません。
  ただし、この命令を実行したクライアント(オブジェクト所有者)がルームから退室した場合、生成したオブジェクトは消失します。

引数

変数名 内容
MonobitEngine.Definitions.InstantiateType loadType インスタンスの読み込み対象の種類。以下の定数値の中からいずれか1つを選択して組み込みます。
定数値 内容
InstantiateType.RESOURCE プレハブについて、Resources.Load メソッドを使って読み込みます。
Resources.Load メソッドを利用する都合上、特にiOSプラットフォームにおいて
読み込む対象のプレハブデータが Resources フォルダ内に含まれている必要があります。
InstatiateType.ASSETBUNDLE アセットバンドルについて、AssetBundle.LoadFromFile メソッド
(Unity5.3 以降では AssetBundle.CreateFromFile メソッド)を使って読み込みます。
事前に MonobitNetwork.AssetBundlePath にアセットバンドルのファイルパスを
指定しておく必要があります。
string prefabName インスタンスを生成するプレハブ名。
該当するプレハブは、必ず Resources フォルダ内に置かれている必要があります。
Vector3 position インスタンス生成時に適用する、Vector3 で表される位置情報。
Quaternion rotation インスタンス生成時に適用する、Quaternion で表される回転情報。
int group インスタンス生成後に所属することになる、MonobitView のグループID。
グループについては こちら を御覧ください。

group に 0 以外の数値を指定した場合、そのグループIDの送受信が許可されていない場合、オブジェクトが生成されません。
・送信側クライアントで 0 以外の数値を設定する場合、MonobitEngine.MonobitNetwork.SetSendingEnabled() メソッドにて、
 事前にインスタンス生成で指定したいグループIDの送信許可を与えてください。
・受信側クライアントで 0 以外の数値を設定する場合、MonobitEngine.MonobitNetwork.SetReceivingEnabled() メソッドにて、
 事前にインスタンス生成で指定したいグループIDの受信許可を与えてください。

戻り値

内容
GameObject インスタンス生成されたGameObjectの情報。

記述例

/*
 * ネットワーク越しに、"AssetBundle"という名前のアセットバンドルからインスタンス生成します。
 * 位置は (0, 0, 0), 回転量は (0, 0, 0), グループIDは 0 を指定します。
 */
MonobitEngine.MonobitNetwork.Instantiate( MonobitEngine.Definitions.InstantiateType.ASSETBUNDLE,
                                          "AssetBundle", Vector3.zero, Quaternion.identity, 0 );


MonobitEngine.MonobitNetwork.Instantiate メソッド(3)

機能

  ネットワーク越しに、プレハブからインスタンスを生成します。

  生成されたオブジェクトがシーン切り替えによって消失するかどうか、オブジェクトの所有権が自身にあるかどうか、
  および、生成されたオブジェクトがルームの入退室によって消失するかについては、メソッド内パラメータで決定します。

引数

変数名 内容
string prefabName インスタンスを生成するプレハブ名。
該当するプレハブは、必ず Resources フォルダ内に置かれている必要があります。
Vector3 position インスタンス生成時に適用する、Vector3 で表される位置情報。
Quaternion rotation インスタンス生成時に適用する、Quaternion で表される回転情報。
int group インスタンス生成後に所属することになる、MonobitView のグループID。
グループについては こちら を御覧ください。

group に 0 以外の数値を指定した場合、そのグループIDの送受信が許可されていない場合、オブジェクトが生成されません。
・送信側クライアントで 0 以外の数値を設定する場合、MonobitEngine.MonobitNetwork.SetSendingEnabled() メソッドにて、
 事前にインスタンス生成で指定したいグループIDの送信許可を与えてください。
・受信側クライアントで 0 以外の数値を設定する場合、MonobitEngine.MonobitNetwork.SetReceivingEnabled() メソッドにて、
 事前にインスタンス生成で指定したいグループIDの受信許可を与えてください。
object[] data ネットワーク越しに生成されるオブジェクトに対し、付随する任意の情報。
ここで指定した情報は生成後、OnMonobitInstantiate コールバックメソッド の実行以降、
MonobitView.instantiationData に格納され保持されます。
bool isDontDestroyOnLoad インスタンス生成後に同一ルームに入室した状態で、シーン切り替えに伴い生成したオブジェクトの情報を
維持するかどうかのフラグを指定します。
true を指定した場合には、生成されたオブジェクトはシーン切り替えによって消失しません。
false を指定した場合には、生成されたオブジェクトはシーン切り替えによって消失します。
bool isMine 生成されたオブジェクトの所有権が自身にあるかどうかのフラグを設定します。
true を指定した場合には、生成されたオブジェクトの所有権は、実行したクライアント側が保有します。
false を指定した場合には、生成されたオブジェクトの所有権は、シーンが保有し、その権限はルームホストに与えられます。
bool isDontDestroyOnRoom インスタンス生成後、オブジェクトの所有権を保有するクライアントがルームから退室した場合、
生成したオブジェクトの情報を維持するかどうかのフラグを指定します。
true を指定した場合には、生成されたオブジェクトは所有者のルーム退室によって消失しません。
false を指定した場合には、生成されたオブジェクトは所有者のルーム退室によって消失します。

戻り値

内容
GameObject インスタンス生成されたGameObjectの情報。

記述例

/*
 * ネットワーク越しに、"Prefab"という名前のプレハブをインスタンス生成します。
 * 位置は (0, 0, 0), 回転量は ( 0, 0, 0), グループIDは 0 を指定します。
 * 生成後、MonobitView.instantiationData には何も入れません。
 * 同一ルームに接続している状態でも、シーン切り替えによってオブジェクトを消失させません。
 * また、所有者はこのメソッドを実行したクライアント側が保有し、所有者がルーム退室後、オブジェクトは消失させます。
 */
MonobitEngine.MonobitNetwork.Instantiate( "Prefab", Vector3.zero, Quaternion.identity, 0, null, true, true, false );


MonobitEngine.MonobitNetwork.Instantiate メソッド(4)

機能

  ネットワーク越しに、プレハブまたはアセットバンドルのいずれかから、インスタンスを生成します。
  また、同時に「生成したオブジェクトについて、シーン切り替え後も存在し続けるかどうか」のフラグを設定し、
  同一ルームに入室中シーン切り替えによってオブジェクトを消失させるかどうかを決定します。

引数

変数名 内容
MonobitEngine.Definitions.InstantiateType loadType インスタンスの読み込み対象の種類。以下の定数値の中からいずれか1つを選択して組み込みます。
定数値 内容
InstantiateType.RESOURCE プレハブについて、Resources.Load メソッドを使って読み込みます。
Resources.Load メソッドを利用する都合上、特にiOSプラットフォームにおいて
読み込む対象のプレハブデータが Resources フォルダ内に含まれている必要があります。
InstatiateType.ASSETBUNDLE アセットバンドルについて、AssetBundle.LoadFromFile メソッド
(Unity5.3 以降では AssetBundle.CreateFromFile メソッド)を使って読み込みます。
事前に MonobitNetwork.AssetBundlePath にアセットバンドルのファイルパスを
指定しておく必要があります。
string prefabName インスタンスを生成するプレハブ名。
該当するプレハブは、必ず Resources フォルダ内に置かれている必要があります。
Vector3 position インスタンス生成時に適用する、Vector3 で表される位置情報。
Quaternion rotation インスタンス生成時に適用する、Quaternion で表される回転情報。
int group インスタンス生成後に所属することになる、MonobitView のグループID。
グループについては こちら を御覧ください。

group に 0 以外の数値を指定した場合、そのグループIDの送受信が許可されていない場合、オブジェクトが生成されません。
・送信側クライアントで 0 以外の数値を設定する場合、MonobitEngine.MonobitNetwork.SetSendingEnabled() メソッドにて、
 事前にインスタンス生成で指定したいグループIDの送信許可を与えてください。
・受信側クライアントで 0 以外の数値を設定する場合、MonobitEngine.MonobitNetwork.SetReceivingEnabled() メソッドにて、
 事前にインスタンス生成で指定したいグループIDの受信許可を与えてください。
object[] data ネットワーク越しに生成されるオブジェクトに対し、付随する任意の情報。
ここで指定した情報は生成後、OnMonobitInstantiate コールバックメソッド の実行以降、
MonobitView.instantiationData に格納され保持されます。
bool isDontDestroyOnLoad インスタンス生成後に同一ルームに入室した状態で、シーン切り替えに伴い生成したオブジェクトの情報を
維持するかどうかのフラグを指定します。
true を指定した場合には、生成されたオブジェクトはシーン切り替えによって消失しません。
false を指定した場合には、生成されたオブジェクトはシーン切り替えによって消失します。
bool isMine 生成されたオブジェクトの所有権が自身にあるかどうかのフラグを設定します。
true を指定した場合には、生成されたオブジェクトの所有権は、実行したクライアント側が保有します。
false を指定した場合には、生成されたオブジェクトの所有権は、シーンが保有し、その権限はルームホストに与えられます。
bool isDontDestroyOnRoom インスタンス生成後、オブジェクトの所有権を保有するクライアントがルームから退室した場合、
生成したオブジェクトの情報を維持するかどうかのフラグを指定します。
true を指定した場合には、生成されたオブジェクトは所有者のルーム退室によって消失しません。
false を指定した場合には、生成されたオブジェクトは所有者のルーム退室によって消失します。

戻り値

内容
GameObject インスタンス生成されたGameObjectの情報。

記述例

/*
 * ネットワーク越しに、"AssetBundle"という名前のアセットバンドルからインスタンス生成します。
 * 位置は (0, 0, 0), 回転量は (0, 0, 0), グループIDは 0 を指定します。
 * 生成後、MonobitView.instantiationData には何も入れません。
  * 同一ルームに接続している状態でも、シーン切り替えによってオブジェクトを消失させません。
 * また、所有者はこのメソッドを実行したクライアント側が保有し、所有者がルーム退室後、オブジェクトは消失させます。
 */
MonobitEngine.MonobitNetwork.Instantiate( MonobitEngine.Definitions.InstantiateType.ASSETBUNDLE,
                                          "AssetBundle", Vector3.zero, Quaternion.identity, 0, null, true, true, false );


インスタンス生成されたオブジェクトの破棄

生成したオブジェクトの破棄条件

  MonobitEngine.MonobitNetwork.Instantiate メソッドで生成したオブジェクトは、以下の段階で自動破棄されます。
  (ネットワーク越しに、他クライアント上でも破棄されます)
・所有権を持つプレイヤーがルームから退室した場合
・所有権を持つプレイヤーがアプリケーションを終了させた場合
・所有権を持つプレイヤーのネットワーク回線が途中で切断してしまった場合
・ルームが消去された場合
・所有権を保有するクライアント側から、オブジェクトに対して ネットワーク越しのオブジェクトの破棄を実行した場合
・(isDontDestroyOnLoad パラメータを false に設定した場合のみ)シーンを変更した場合
・(isDontDestroyOnRoom パラメータを true に設定しない場合のみ)所有権を保有するクライアントがルームから退室した場合


接続コールバック

インスタンスが生成された際にコールバックされるメソッド

  このメソッドの実行結果に応じて、以下の接続コールバックが呼び出されます。
  (接続コールバックについては こちら を参照してください。)
OnMonobitInstantiate メソッド 自身、もしくはルーム内の誰かが、MonobitEngine.MonobitNetwork.Instantiate() を使ってプレハブをインスタンス化したときにコールされます。
インスタンス化対象となるプレハブにアタッチされているスクリプトでのみコールされますので、ご注意ください。