MLAPIをHoloLensでつかう その3 (物体の操作を共有する)
今回は前回の続きです。
xr-physics-work-etc.hatenablog.com
HoloLensを使った共有に重要な物体の操作に関する共有を行います。
Spawnする物体を用意する
今回はCubeをSpawnし、それを操作します。
まずは、Spawn対象であるCubeを用意します。
Hierarchy上で右クリックし、[3D Object]→[Cube]を選択します。
作成したCubeにNetwork Object
コンポーネントとNetwork Transform
コンポーネント、Object Manipulator
コンポーネントをアタッチします。
これらをアタッチすることで、MLAPIの共有対象であることと、位置、姿勢を共有すること、手で物体位置を変更することができます。
MaterialはMRTK_Standard_Red
を設定しておきます。
作成したオブジェクトをAsset/Prefabs
ディレクトリにドラッグしてPrefab化します。
Prefabにした後、Cubeのスケールは好みの大きさに変更しておきます。
Hierarchy上のCubeは削除します。
作成したPrefabは、Hierarchy上のNetworkManager
のNetwork Prefabs
に設定します。
今回追加したオブジェクトはPlayerではないので、Default Player Prefab
のチェックを外します。
Spawnする機構を用意する
次に物体をSpawnする機構を用意します。
今回はボタンを押すたびに物体がSpawnするようにします。
MRTK Tool BoxからPressableButtonHoloLens2
を選択し、Hierarchy上に追加します。
オブジェクトを参加しているユーザ全員でSpawnできるように、NetworkSpawn.cs
を作成します。
- NetworkSpawn.cs
クリックで展開
using UnityEngine; using MLAPI; public class NetworkSpawn : NetworkBehaviour { /// <summary> /// Spawnさせるプレハブ /// </summary> [SerializeField] private GameObject spawnPrefab; public void SpawnObject() { // Spawnされる場所は、自オブジェクトの1m奥、1m上に設定。 Vector3 spawnPosition = this.transform.position + new Vector3(0f, 1f, 1f); // ローカルでSpawn GameObject spawnObject = Instantiate(spawnPrefab, spawnPosition, Quaternion.identity); // ほかのユーザでもSpawn実施 spawnObject.GetComponent<NetworkObject>().Spawn(); } }
作成したNetworkSpawn
コンポーネントをボタンにアタッチし、Onclickで実行されるように設定します。
これで、ボタンが押されるとCubeがSpawnするようになりました。
動作確認
今回も前回と同様にHoloLens側でConnect Host、PC側でConnect Clientボタンを押して共有を開始しました。
xr-physics-work-etc.hatenablog.com
Host側であるHoloLens2からSpawnボタンを押しCubeを召喚、PCからHoloLens2側からの操作を確認することができました。
ただし、問題点が3点あります。
NetworkTransform
がScaleの変更に対応していない。
→ 実装すれば解決可能。- Client側から物体の操作はできない。
- Client側からSpawnボタンを押すと下記エラーが発生して正しくSpawnできない。
NotServerException: Only server can spawn NetworkObjects
原因としては、Host(Server)側からSpawnしたCubeには、PCであるClient側からの操作権限がないこと、またMLAPIではNetwork共有された物体のSpawn処理(NetworkObject.Spawn()
)はServer側からしか実行できないことが挙げられます。
そのため、Client側からそれぞれをを実行するためには、Client側からServer側に操作権限取得依頼と、Spawnの依頼を実施する必要があります。
次回は共有対象のオブジェクトの操作権限取得と、Server側にSpawn依頼を行う方法について記載します。