云脚本基本概念
网格云脚本与 MonoBehaviours 之间的差异
网格云脚本和 MonoBehaviours 之间存在几个主要差异:
- 云脚本服务是针对网格云脚本 API(而不是 Unity API)编写的。
- 云脚本服务在云中单独运行(而不是在客户端上运行),其效果会自动同步到所有连接的客户端。
体系结构概述
若要启用网格云脚本,名为 Mesh Cloud Scripting Service 的应用程序服务 将部署到你提供的特定 Azure 资源组。 云脚本在 Azure 后端运行,由一组服务器 C# 脚本组成,这些脚本在容器中运行,其中包含客户端连接到的终结点。 在下图中,可以看到有两个客户端连接到云脚本服务。 云脚本服务有自己的权威场景图(图中标有“A”)。 云脚本服务通过网格云脚本场景图形 API 与此场景图交互。
网格云脚本场景图会自动从云同步到所有连接的客户端。 每个客户端都有网格云脚本场景图(关系图上标记为“B”)的相同副本,该图与权威云版本保持同步。 当网格云脚本服务对云中的场景图进行更改时,这些更改将传播到所有客户端上的副本。
在每个客户端上,Unity 网格运行时都会对客户端的网格云脚本场景图实例中的更改做出反应,并更新 Unity 场景以反映其状态。 尽管网格云脚本场景图形 API 和 Unity 场景图形 API 不同,但它们彼此映射并具有相同或相似的结构。
网格云脚本、游戏对象和网格云脚本场景图
最终出现在网格应用中事件中的对象可以分为两个类别:
在 Unity 中添加到环境的对象。
使用 自定义事件 的对象。 由于这些不是环境的一部分,因此网格云脚本不知道它们。
构建场景
若要启用网格云脚本,场景必须具有 网格云脚本 组件。
该组件负责在网格应用中的编辑时间和运行时管理你创建的脚本并将其绑定到 Unity 场景。 网格云脚本是一种独立技术,但它与 Unity 紧密集成。 可以在名为“创建简单的云脚本项目”的文章中找到有关添加网格云脚本 GameObject 的说明,以及有关程序员指南部分中脚本的更多详细信息。
网格云脚本场景图仅限于添加到包含网格云脚本组件的 GameObject 下的场景的 GameObject。 尽管网格云脚本无法直接查看场景其余部分的场景层次结构,但它可以访问网格应用提供的 API,例如,它可以获取场景中的用户列表或对所选对象做出反应。
组件和网格云脚本场景图
在下图中,请注意 Unity 场景和网格云脚本场景的层次结构是相同的。 Unity 场景部分中的蓝色节点表示 GameObjects;每个 GameObject 在网格云脚本场景图中都有相应的 TransformNode。 更新 TransformNode 时,它会导致它在 Unity 场景中对应于的游戏对象的转换更新为相同的值。
网格云脚本 API 具有仅 映射到一组完整 Unity 组件的子集 的类型。 创建包含网格云脚本 API 无法映射到的组件的 Unity 场景仍然有效;它们只会对网格云脚本不可见。 在关系图中,白色组件在网格云脚本场景图中具有相应的节点;绿色组件不具有颜色。 网格云脚本场景图没有粒子系统节点,因此在我们的示例中,Unity 场景中的粒子系统组件不会显示在相应的网格云脚本场景中。 但是,其周围的组件和拥有游戏对象 位于 网格云脚本场景图中。 这意味着网格云脚本可以通过移动自己的游戏对象来移动粒子系统,即使粒子系统本身对云脚本不可见。
网格云脚本 API 允许克隆节点。 如果应用克隆了“A”(对应于 Unity 场景中的“A”节点 GameObjectParent),这将克隆 GameParentObject 的整个子树,包括粒子系统网格云脚本看不到。
创作网格云脚本
有关网格云脚本的详细说明,请参阅 创建简单的云脚本项目 和 程序员指南 文章。 在这里,我们简要概述了这一点。
包含网格云脚本场景的典型 Unity 项目在磁盘上如下所示(文件夹显示为粗体):
- Unity 项目
- 资产
- 场景
- MyScene.unity
- .MeshCloudScripting
- MyScene
- MyScene.csproj
- Program.cs
- scene.map
- App.cs
- MyScene
- 场景
- 资产
Unity 项目中包含 MeshCloudScripting 组件的每个场景都有一个对应的文件夹,该文件夹的名称与“中所含的名称相同。Assets 目录中的 MeshCloudScripting“文件夹。 网格云脚本组件将创建此文件夹及其初始文件集,这些文件将编译为一个完全正常工作的文件,不过是空的云脚本服务。 上面显示了一些初始文件。 Program.cs
包含负责的样本代码:
配置 IHostBuilder 以启动
App
服务。生成 IHost 实例。
运行实例
IHost
以完成。
App.cs
是托管应用程序逻辑的类。 它实现 IHostedService 接口,因此它有两个入口点: StartAsync
和 StopAsync
。 StartAsync
在准备好启动App
服务时IHost
触发一次。 同时, StopAsync
在正常关闭时 IHost
触发。
场景表示形式
请注意上述列表中的 scene.map 文件。 这是一个内部详细信息,但理解很有用。 在 UI 中手动触发或 Unity 场景在编辑器中播放时,网格云脚本组件会将 scene.map 文件写入相应的网格云脚本文件夹中。 这是场景作为网格云脚本场景层次结构的表示形式;Unity 类型转换为网格云脚本类型。 将 网格云脚本服务 部署到云时,它不需要运行原始 Unity 场景。 而是加载 定义初始场景层次结构的 scene.map 文件。 当网格客户端连接到 网格云脚本服务时,它会接收网格云脚本层次结构并更新其 Unity 场景以匹配。 为了允许这样做,我们还将 ID 存储在网格云脚本绑定中,这些 ID 用于映射到场景中的相应 Unity 对象。
注意:为了使上述操作正常工作, scene.map 文件和 Unity 场景必须匹配。 如果出于某种原因,它们不会(例如,由于导出错误)而检测到,将检测到 网格云脚本服务和 网格客户端无法连接。
使用网格云脚本发布环境
使用网格云脚本发布环境时,它将环境和 网格云脚本服务 发布到 Azure。 下图中显示了这一点:
对场景进行更改时,应按 Unity 中的“播放 ”,通过新建的和本地运行的 网格云脚本服务预览场景。 然后使用网格上传程序发布修改的环境。 在生成和发布环境中更详细地介绍发布,并提供生成和发布文章的云脚本详细信息。
网格云脚本服务中的 身份验证
云脚本服务可以保留其用户是谁的列表。 对用户进行身份验证后,云脚本服务会跨多个会话为用户提供持久标识符。
也就是说,网格云脚本服务中的身份验证流不需要在最终执行任何额外工作。 这完全是隐式的,参与方会努力获取令牌并自动对其进行验证。
下面是身份验证流中涉及的各方:
网格工具包:作为云脚本服务部署到云的工具,可以选择 Service Mode
用于验证身份验证令牌的云脚本服务。 这可以在网格上传程序 UI 的环境配置设置中完成。
Microsoft网格服务:负责颁发令牌。 如果没有令牌,用户将无法与云脚本交互。
Microsoft网格:用户如何与网格云脚本交互的入口点。 Microsoft网格客户端负责代表用户从Microsoft网格服务请求访问令牌。
网格云脚本服务:验证它从针对Microsoft网格服务的连接请求收到的令牌,然后从令牌中选取永久性用户标识符。
各方共同努力,如下所示: