MRTK新观众视图:如何在运行时在服务器和客户端上实例化预制件?

时间:2019-08-01 10:02:40

标签: hololens mrtk mr-spectatorview

新的旁观者视图似乎已经改变了其同步状态的方式。它不再使用UNet,但是每个组件都有一个状态同步服务。

我可以看到它从一开始就如何同步场景中对象的变化,但是如果我想在运行时实例化预制件,它如何工作?

在旧的UNet实现中,我将使用NetworkManager在所有连接的设备上实例化它,并且将在所有位置都创建完所有子组件参考的预制件。这样做的新方法是什么?

1 个答案:

答案 0 :(得分:3)

观众视图的状态同步逻辑应自动评估HoloLens /广播设备上的游戏对象创建,并将创建事件中继到观众/观察者设备。观众视图逻辑不支持在HoloLens设备上重新创建的在观众设备上创建的对象。如果这符合您的需求,则逻辑流程如下:

  1. 在HoloLens的场景中声明游戏对象(标记为同步)时,它会添加一个TransformBroadcaster组件。此TransformBroadcaster监视子层次结构的更改,因此,在创建此TransformBroadcaster的游戏对象的子游戏对象时,父TransformBroadcaster会向子游戏对象添加一个TransformBroadcaster组件:https://github.com/microsoft/MixedReality-SpectatorView/blob/73414f4429048c6f0eed154fb8bbdea93b4caa81/src/SpectatorView.Unity/Assets/SpectatorView/Scripts/StateSynchronization/TransformBroadcaster.cs#L576

  2. 每帧更新,TransformBroadcaster也会观察其游戏对象的变化。如果已将与ComponentBroadcasterServices相关联的新组件添加到游戏对象,则它将ComponentBroadcasters添加到游戏对象:https://github.com/microsoft/MixedReality-SpectatorView/blob/73414f4429048c6f0eed154fb8bbdea93b4caa81/src/SpectatorView.Unity/Assets/SpectatorView/Scripts/StateSynchronization/TransformBroadcaster.cs#L502

  3. 将ComponentBroadcaster(包括TransformBroadcaster)添加到游戏对象后,它将评估所有观众的帧更新。如果ComponentBroadcaster检测到有一个不知道其存在的观众,则它将向该观众发送广播创建事件:https://github.com/microsoft/MixedReality-SpectatorView/blob/73414f4429048c6f0eed154fb8bbdea93b4caa81/src/SpectatorView.Unity/Assets/SpectatorView/Scripts/StateSynchronization/ComponentBroadcaster.cs#L177

  4. 创建事件将由StateSynchronizationSceneManager中的观众设备接收。当StateSynchronizationSceneManager看到此创建事件时,它将获取或创建一个镜像游戏对象(本质上是在HoloLens设备上运行的游戏对象的副本)。然后,它使用关联的IComponentBroadcasterService将相应的ComponentObserver添加到镜像游戏对象中:https://github.com/microsoft/MixedReality-SpectatorView/blob/73414f4429048c6f0eed154fb8bbdea93b4caa81/src/SpectatorView.Unity/Assets/SpectatorView/Scripts/StateSynchronization/StateSynchronizationSceneManager.cs#L241

  5. 将ComponentObserver添加到游戏对象时,它将创建它正在观察的组件:https://github.com/microsoft/MixedReality-SpectatorView/blob/73414f4429048c6f0eed154fb8bbdea93b4caa81/src/SpectatorView.Unity/Assets/SpectatorView/Scripts/StateSynchronization/ComponentObserver.cs#L27 然后,在每次有效负载更新时,ComponentObserver都会更新此附加组件以模仿HoloLens设备上正在显示的内容。

一旦所有ComponentBroadcasters注册为通过观众设备创建的,您应该在观众场景中重新创建的HoloLens场景中创建新的游戏对象;但是,还有一些其他需要注意的地方:

  1. 游戏对象需要以某种方式标记为同步对象。这可以通过两种方式来实现。您可以通过“观众视图”设置声明所有对象应在场景中同步:https://github.com/microsoft/MixedReality-SpectatorView/blob/master/doc/SpectatorView.Setup.md#hololens-2--hololens 或者,您可以将GameObjectHierarchyBroadcaster添加到您的HoloLens场景中(GameObjectHierarchyBroadcaster组件下的所有子游戏对象将被同步)。

  2. 如果您具有自定义的Unity类型,则可能需要创建自己的IComponentBroadcasterService,IComponentBroadcaster和IComponentObserver。大多数默认的Unity组件(变换,网格等)已经具有组件广播器服务,但是您自己的自定义类型可能需要其他工作。

  3. 您需要将相同的Asset Cache编译到HoloLens和观众应用程序中。在旁观者设备上创建ComponentBroadcasters时,通常将它们传递给资产ID,这些资产ID用于实例化镜像游戏对象组件。例如,创建新的MeshFilter时,它将使用AssetId通过AssetService查找MeshFilter,以了解要添加到镜像游戏对象的网格物体:https://github.com/microsoft/MixedReality-SpectatorView/blob/73414f4429048c6f0eed154fb8bbdea93b4caa81/src/SpectatorView.Unity/Assets/SpectatorView/Scripts/StateSynchronization/NetworkedComponents/MeshFilter/MeshFilterObserver.cs#L15这意味着与依赖于您的一种资产中定义的网格将无法正常工作。