平台文本渲染
PolySpatial支持使用TextMesh Pro软件包在所有平台上进行文本渲染。PolySpatial使用指定字体的材质和TextMesh Pro生成的网格来创建可在任何平台上渲染的项目。作为通用机制,这工作得很好,但限制了开发人员利用平台特定文本渲染功能或支持的能力。
为了解决这个问题,PolySpatial 提供了一个新的“VisionOSNativeText”组件,您可以将其添加到“GameObject”实例中。该组件将允许您利用一些特定于平台的功能进行文本渲染,以及对直接平台渲染的支持。并非所有平台都支持组件中的所有功能,但 PolySpatial 会尽最大努力尝试尽可能多地匹配,以保持高保真度。
值得注意的是,该组件不以任何方式与“TextMesh Pro”兼容。您需要决定是否要使用其中之一。任何尝试将它们都分配给相同的“GameObject”都会导致错误,并移除PolySpatial组件。
TMP字体序列化
由于字体资源很大,而且每个资源之间存在很多依赖关系,所以没有很好的方法将字体资源转移到平台侧。这里提出的解决方案依赖于Unity JSON序列化以及用资源id替换实例id。当平台实例获取这些序列化资源之一时,基本上会使用先前发送给它的本地资源执行反向资源->实例id替换。通过这种方式,我们不仅维护原始字体信息,还维护与权重表实例和后备实例的所有链接。
关于字体和匹配
在兼容平台上运行时,PolySpatial将使用指定的TextMesh Pro字体资源来渲染文本。对于Unity无法使用TextMesh Pro并且必须依赖平台特定支持的平台,我们使用以下启发式方法来获得可能的最佳字体匹配:
1) 如果我们拥有用于生成 TMP 字体资源的实际字体,我们将把该字体发送到平台,并尝试使用它来创建必要的字体资源。 2) 如果认为无法创建,或者没有要发送的字体,我们将使用TMP字体资源的外观信息来生成字体名称,可以用其来查找匹配的字体。 3)如果无法创建,我们将回退到系统字体。
对于情况1和2,我们将使用字体信息来查找匹配的粗体、斜体或粗体和斜体字体。对于情况3,我们目前没有足够的信息来确定字体应该是粗体还是斜体。
在所有情况下,我们都将使用请求的字体大小来在平台上获得正确的显示尺寸。
构建字体资源管理
TMP字体到字体的映射是由开发人员在将字体分配给文本组件实例时所采取的操作建立的。一旦我们注意到变化,我们就会获取TMP字体资源,找到相关的字体并将其添加到映射中。然后,我们对每个权重表条目和每个后备条目(如果有)执行此操作。这适用于分配的字体,但用户完全有可能在运行时更改组件上的字体,在这种情况下,我们也需要能够找到字体。因为我们不知道那可能是什么,所以我们必须确保映射了运行时可能使用的所有内容。为此,我们有一个构建处理器,它将遍历项目中的每个TMP Font资产,并将它们添加到映射中(如果尚未存在)。
平台文本组件功能
“VisionOSNativeText”组件提供以下功能:
功能 | 描述 |
---|---|
文本 | 要显示的文本。 |
字体资源 | 用于渲染文本的 Text Mesh Pro (TMP) 字体资源。 |
字体大小 | 文本的大小(以磅为单位)。 |
文字颜色 | 用于渲染文本的颜色。 |
插图 | 从画布边缘左、上、右和下边距插入。用于在文本周围提供一些缓冲。 |
理由 | 用于文本的理由。可能的值为左、中、右、两端对齐和无。 |
画布背景颜色 | 画布颜色。 |
画布尺寸 | 画布的宽度和高度(以磅为单位)。NOTE 目前不支持Unity平台渲染。 |
画布圆角半径 | 用于在画布上生成圆角的半径大小。 |