1

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

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

在旧的 UNet 实现中,我将使用 NetworkManager 在所有连接的设备上对其进行实例化,并且预制件将在任何地方创建,并且其对子组件的所有引用都完好无损。这样做的新方法是什么?

4

1 回答 1

4

观众视图的状态同步逻辑应自动评估 HoloLens/Broadcaster 设备上的游戏对象创建,并将创建事件中继到观众/观察者设备。观众视图逻辑不支持在 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。 c#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. 游戏对象需要以某种方式标记为同步候选对象。这可以通过两种方式来实现。您可以通过 Spectator View 设置声明场景中的所有对象都应同步: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. 您需要将相同的资产缓存编译到 HoloLens 和旁观者应用程序中。当在旁观者设备上创建 ComponentBroadcaster 时,它们通常会获得用于实例化镜像游戏对象组件的资产 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这意味着动态创建网格与依赖于您的一个资产中定义的网格相比将无法正常工作。

于 2019-08-05T16:56:04.207 回答