Skip to main content

Cloud Variables (云变量)

概述

云变量(Cloud Variables)是跨越不同世界持久存在的变量。它们的工作性质类似于 动态变量 (Dynamic Variables),但它们不依赖于父子关系或世界层级结构,而是依赖于路径和用户/组的所有权。你可以将它们想象为你最喜欢的游戏的设置或配置文件。不过,云变量比这更生动,因为它们可以在不同的会话、世界甚至你的 Resonite 仪表盘之间同步。

关于云变量的快速入门指南,请参阅此教程:如何使用云变量

云变量由两部分组成:

  • 定义 (Definitions) - 设置和配置:所有者、名称、类型、权限和默认值。
  • 值 (Values) - 每个用户的实际数值。

云变量定义

一个云变量定义由 4 部分组成:

  • 路径/名称。例如 AwesomeGadget.VersionPartyWorld.highQualityLights
  • 数据类型
  • 权限
  • 默认值。
    • 默认值必须是 To String (ProtoFlux Node) 节点的输出结果,且去除空格。例如 ColorX,通过 To String 转换后的结果为:[1;1.23;0;1;sRGB]。DateTime 值 "1/1/2000 00:00:00" 也是可以接受的。

定义也可以注册在某个用户或 组 (Group) 下。将定义注册在组下有一些好处,例如:

默认值

创建定义 时,你需要通过一系列命令提供数据和配置。万一你忘记或省略了某个命令,以下是定义的各种属性的默认值:

  • 读写权限默认为 variable_owner
  • 列表权限默认为 definition_owner
  • 如果未指定默认值,Resonite 将返回该数据类型的默认值(按照 C# 定义)。

云变量值

每个云变量定义可以有多个值,每个值都绑定到一个独立的 Resonite 用户或组。一个“值”只包含其数值本身,没有关于定义的细节。你可以把它想象成一个有两列的表格:所有者 ID 和值。

例如,如果创建了一个数据类型为字符串、名称为“Favorite Fruit”(最喜欢的水果)的云变量定义,那么它的值可能如下所示:

Favorite Fruit
变量所有者 ID
U-Frooxius Strawberry
U-Nexulan Orange
U-Shifty Pineapple
U-ProbablePrime Blueberry
G-MyGroup Banana

最后一行显示了特定于组的值。这只有属于组的云变量才可能实现。

带有空格的变量所有者 ID(用户 ID 或组 ID)需要用连字符书写。例如:组 "My Group" 变为 "G-My-Group"。请务必仔细检查你的用户 ID 和组 ID,它们可能与用户/组的显示名称完全不同。

使用云变量

在使用云变量之前,必须先创建并注册它们。这是通过向 Resonite Bot 发送各种类型的 命令 来完成的。这些命令会在 Resonite 中创建并注册一个 云变量定义。注册后,就可以使用 ProtoFlux组件 根据该定义读取、写入和操作云变量的值。

使用注意事项 / 警告

  • 变量定义会被大量缓存,通常需要几分钟才能更新。建议提前完整设置好它们。
  • 读取和写入会被缓冲、批处理和缓存,需要一点时间来传播。
  • 目前云变量系统的一个限制是,除非在同一主机/用户上运行,否则它们不会在不同的会话之间实时同步。如果你在一个无头客户端(或你自己的电脑)上托管多个世界/会话,对云变量的更改将在这些会话内实时同步。
  • 如果不同的用户托管同一个世界,一个世界中的更改不会立即反映在另一个世界中,需要几分钟才能刷新。目前的计划是通过将 SignalR 集成到 Resonite 云基础设施中来添加针对此类情况的完全实时同步,这也将有助于云更好地扩展其他功能,如活动会话或消息系统。
  • 当前的限制、权限和其他方面可能会发生变化。
  • 可以更改数据类型,但已存储的值不受影响。

限额

云变量不占用任何存储空间,但它们有限额。

定义限额

限制类型 限额
用户 (Users) 256
组 (Groups) 8192

这些限制仅适用于创建的 变量定义,不适用于存储在其中的 。例如,变量定义 "U-ProbablePrime.FavoriteColor" 仍然可以为每个用户的最爱颜色拥有无限数量的值。

速率限制

从云变量读取/写入时,适用以下限制:

ProtoFlux

使用 ProtoFlux 时,由于读取或写入是由脉冲触发的,读/写操作会在节点接收到脉冲时立即发生。

因此,读/写过程每分钟最多可执行 30 次。

当使用 ProtoFlux 读取或写入数据到变量时,为已定义变量设置的限制同样存在于 ProtoFlux 节点中。如果节点存在于你的本地空间,那么节点可以读/写那些只允许在安全上下文中读/写的变量。

组件

云变量组件按计划运行,定期双向刷新值。这些值的更新速度目前不快,但随着我们要对 SignalR 使用的进一步增强(需要引用),这些值将更新得更及时。

目前:

  • 读取每 5 分钟发生一次。
  • 写入将被延迟(缓冲)并每 30 秒发送一次。
    • 如果组件上的值变化频率高于此频率,则发送写入时最新设置的值将被发送到云端。

更新频率

请阅读上面的 限额 章节。

支持的数据类型

创建云变量定义时,需要指定有效的类型。支持的数据类型如下所列,但通常支持任何原始数据类型。不支持引用数据类型(Reference data types),因为引用仅在一个定义的世界/会话中有效。

支持的云变量数据类型
bool bool2 bool3 bool4      
float float2 float3 float4 float2x2 float3x3 float4x4
int int2 int3 int4      
long long2 long3 long4      
double double2 double3 double4 double2x2 double3x3 double4x4
uint uint2 uint3 uint4      
ulong ulong2 ulong3 ulong4      
short ushort          
byte sbyte          
floatq            
doubleq            
color            
datetime            
timespan            
decimal            
enum *          
string *          
  • Enum (枚举):
    • 你现在也可以使用枚举类型,云变量定义必须设置为 string 才能正确同步。创建后,你可以使用 DataTypes 设置为你希望使用的 enumProtoFlux组件。例如 CloudValueField<ShadowType>
  • String (字符串):
    • 设置数据类型时,你可以指定字符串的最大长度。
    • 格式为 string:<max_length>
    • 默认情况下,字符串长度为 256 个字符。最大长度为 8192。
    • 用户和组变量都受这些限制影响。

未来可能会支持更多数据类型。

权限

云变量权限由两部分组成:

  • 操作权限 (Action permission) - 权限组可以执行的操作类型。
  • 组/类型权限 (Group/type permission) - 用户组或用户分类。

在读取和决定权限集时,请记住,在大多数情况下,每个用户都有自己的云变量值。

例如在以下命令中:/setUserVarPerms test.color read,write,list anyone。操作是“read, write 和 list”,权限类型/组是“anyone”。

操作权限

操作权限 描述
read 授予读取云变量值的各能力。
write 授予写入云变量值的能力。
list 授予列出所有值或变量的能力。
all 一次性授予上述所有权限。

你也可以一次指定多个权限,用逗号分隔。例如 /setUserVarPerms test.color read,write,list variable_owner 将会把 test.color 变量的读取、写入和列表权限设置为 variable_owner

组/类型权限

通用定义权限

这些权限可用于用户和组拥有的定义。

权限类型 描述 位置 限制
anyone 任何人都可以读取/写入此变量的值。推荐用于读取公共变量,但不推荐用于写入,因为任何人都可以更改任何人的值。 任何地方。 不能与用户拥有的定义上的 write 权限一起使用。
definition_owner_only 只有定义变量的用户/组可以读取/写入他们自己的单个值。适用于公告/版本控制系统。 仅限用户空间/安全上下文。 不能用于 list 权限。
definition_owner_only_unsafe 只有定义变量的用户/组可以读取/写入他们自己的单个值。适用于公告/版本控制系统。 任何地方。 不能用于 list 权限。
variable_owner 只有拥有变量值的用户才能写入/读取他们自己的值。在这种情况下,定义所有者无法读取/写入其他人的值。 仅限用户空间/安全上下文。 不能用于 list 权限。
variable_owner_unsafe 只有拥有变量值的用户才能写入/读取他们自己的值。在这种情况下,定义所有者无法读取/写入其他人的值。 任何地方。 不能用于 list 权限。

用户定义权限

这些权限只能用于用户拥有的定义。

权限类型 描述 位置 限制
definition_owner_only_contacts (待补充) 仅限用户空间/安全上下文。 不能用于 list 权限。
definition_owner_only_contacts_unsafe (待补充) 任何地方。 不能用于 list 权限。
variable_owner_only_contacts (待补充) 仅限用户空间/安全上下文。 不能用于 list 权限。
variable_owner_only_contacts_unsafe (待补充) 任何地方。 不能用于 list 权限。

组定义权限

这些权限只能用于组拥有的定义。

权限类型 描述 位置 限制
definition_owner 只有定义变量的组可以读取/写入它。 仅限用户空间/安全上下文。 无。
definition_owner_unsafe 只有定义变量的组可以读取/写入它。 任何地方。 无。

List (列表) 权限

由于“list”权限有效的选项非常有限,列出允许 list 使用的权限更容易:

  • anyone - 仅限基于组的定义。
  • definition_owner
  • definition_owner_unsafe

安全上下文 (Safe Contexts)

在 Resonite 中的大多数情况下,任何人都可以观察甚至操纵你在做什么。这些是非安全 (unsafe) 上下文。当在诸如用户空间(Resonite 仪表盘所在位置)等地时,没人能看到或修改你在做什么。这就是安全上下文。

权限矩阵

此表显示了哪些权限可以应用于用户和组变量的 操作权限

  用户读取 用户写入 用户列表 组读取 组写入 组列表
anyone
definition_owner_only(_unsafe)
definition_owner(_unsafe)
variable_owner(_unsafe)
definition_owner_only_contacts(_unsafe)
variable_owner_only_contacts(_unsafe)

云变量命令

要创建、更新和修改云变量,你需要使用命令。这些命令可以发送给 Resonite 内的 Resonite Bot,你可以在联系人列表中找到它。

括号 () 内的命令参数是可选的。所有其他参数都是必需的

创建定义

用户定义

  • /createUserVar <path> - 使用给定路径创建一个变量定义。
  • /setUserVarType <path> <type> - 设置变量定义的 数据类型
  • /setUserVarDefaultValue <path> <value> - 设置定义的默认值。
  • /setUserVarPerms <path> <action permission> <permission type> - 设置定义的 权限

还有一个命令可以在一行中创建定义:

  • /createUserVar <path> <type> <default value> <read perms> <write perms> <list perms>

组定义

  • /createGroupVar <group> <path> - 使用给定路径创建一个变量定义。
  • /setGroupVarType <group> <path> <type> - 设置变量定义的 数据类型
  • /setGroupVarDefaultValue <group> <path> <value> - 设置定义的默认值。
  • /setGroupVarPerms <group> <path> <action permission> <permission type> - 设置定义的 权限

还有一个命令可以在一行中创建定义:

  • /createGroupVar <group> <path> <type> <default value> <read perms> <write perms> <list perms>

建议

通常我们建议使用一次性创建整个定义的命令,这可以确保你不会忘记任何步骤或部分,以免导致变量不可用。

读取值

关于使用 ProtoFlux / 组件 读取值,请参阅后续章节

用户值

  • /getUserVar <path> - 获取变量的定义(类型、权限、默认值)。
  • /getUserVarValue <definition_owner> <path> <target user> - 获取某用户的定义值。
    • 例如:/getUserVarValue U-ProbablePrime testing.bool U-ProbablePrime 将获取 Prime 自己的 testing.bool 变量值。
  • /listUserVars (<user>) - 列出某用户(默认:你自己)的变量定义。需要 list 权限。

组值

  • /getGroupVar <group> <path> - 获取变量的定义(类型、权限、默认值)。
  • /getGroupVarValue <group> <path> (<target user>) - 获取某用户(默认:你自己)的定义值。
  • /listGroupVars <group> - 列出组的变量定义。需要 list 权限。

写入值

设置/写入值时,请确保你的权限设置正确。

关于使用 ProtoFlux / 组件 写入值,请参阅后续章节

写入用户拥有的定义的值

/setUserVarValue (<user>) <path> (<target user>) <value> - 设置单个用户的定义值。

例如:/setUserVarValue U-ProbablePrime testing.bool U-Frooxius true 将把 ProbablePrime 定义的 testing.bool 变量中,属于 Frooxius 的值设置为 true。

写入组拥有的定义的值

/setGroupVarValue <group> <path> (<target user>) <value> - 设置单个用户的定义值。

例如:/setGroupVarValue G-Cheese testing.bool U-Frooxius true 将把 Cheese 组定义的 testing.bool 变量中,属于 Frooxius 的值设置为 true。

设置复杂值

对于复杂值,你可能不知道该输入什么。以下是一些可能有帮助的例子:

删除定义

你可以使用以下命令删除定义:

  • /deleteUserVar <path> 用于用户变量。
  • /deleteGroupVar <group> <path> 用于组变量。(目前已损坏,见 Issue #537

此命令会删除定义以及链接到该定义的所有值。由于需要清理定义的缓存、值和其他系统,此命令完全执行需要一段时间(约 30 分钟)。

定义示例

用户布尔值

创建一个 Boolean 类型的 User 变量,任何人都可以读取,所有者(每个用户拥有自己的副本)可以从用户空间和世界空间写入:

/createUserVar testing.enabled
/setUserVarType testing.enabled bool
/setUserVarPerms testing.enabled read anyone
/setUserVarPerms testing.enabled write variable_owner_unsafe

用户颜色

创建一个 Color 类型的 User 变量,只有所有者可以从用户空间写入,并可从任何地方读取:

/createUserVar testing.myColor
/setUserVarType testing.myColor color
/setUserVarPerms testing.myColor read variable_owner_unsafe
/setUserVarPerms testing.myColor write variable_owner

组布尔值

创建一个 Boolean 类型的 Group 变量,只有所有者可以从任何地方读取和写入:

/createGroupVar MyGroup testing.enabled
/setGroupVarType MyGroup testing.enabled bool
/setGroupVarPerms MyGroup testing.enabled read,write variable_owner_unsafe

使用云变量

组件

ActiveUserCloudField`1 (Component) - 类似 CloudValueField,但将 OwnerId 覆盖为本地用户。

ActiveUserCloudValueVariable`1 (Component) - 类似 CloudValueVariable,但将 OwnerId 覆盖为本地用户。

CloudValueField`1 (Component) - 使用目标字段来存储值,其他方面类似于 CloudValueVariable。a

CloudValueVariable`1 (Component) - 代表云变量,可以手动设置 OwnerId。

CloudValueVariableDriver`1 (Component) - 用指定云变量的值驱动目标字段。将 OwnerId 覆盖为本地用户。

ProtoFlux 节点

Write Cloud Variable`1 (ProtoFlux Node) - 收到脉冲时,为指定所有者写入指定的云变量。

Read Cloud Variable`1 (ProtoFlux Node) - 收到脉冲时,为指定所有者读取指定的云变量。

云端房间和自动启动世界选项

云变量可以通过多种方式用于 云端客户端 (Headless Client) 配置文件和 启动配置文件 (Startup Config File)

  • 配置会话中的角色。
  • 允许/拒绝用户加入/访问会话。
  • 提供自定义的拒绝消息,解释用户为何被拒绝访问会话。

这些选项在 Resonite 内部的 UI 中不可用,需要从游戏外部进行高级设置。

由于权限要求,我们建议为此类设置使用组变量。你可能勉强可以使用配置得当的用户变量,但组变量能给你最大的控制权。

要设置这些,你需要将下述参数添加到你的配置 JSON 文件中。

角色

要使用云变量配置角色,请在你的世界启动/无头会话配置中添加 roleCloudVariable 参数。其值应为你要使用的云变量的完整路径。会话随后将使用该云变量来确定用户拥有的角色。

这样做时,你需要记住几件事:

  1. 变量数据类型必须是字符串。
  2. 强烈建议为此变量使用 definition_owner 权限组。其他权限组可能允许用户覆盖他们的角色。
  3. 如果未为变量和用户设置值,将使用其他确定角色的方法。

设置示例:

G-Cheese.awesomeHeadless.userRoles
变量所有者 ID
U-Frooxius Admin
U-Nexulan Builder
U-Shifty Guest
U-ProbablePrime Spectator
U-Vegasx Spectator

需要添加的相应 JSON 属性为:"roleCloudVariable": "G-Cheese.awesomeHeadless.userRoles"

访问权限

有一些变量和设置可以控制对无头会话的访问。

允许用户访问

要使用云变量配置对无头会话的访问,请在你的世界启动/无头会话配置中添加 allowUserCloudVariable 参数。其值应为你要使用的云变量的完整路径。会话随后将使用该云变量来提供会话访问权限。

此选项优先于所有其他检查,包括最大用户数和可见性等常规会话设置。

这样做时,你需要记住几件事:

  1. 变量数据类型必须是 bool(布尔值)。
    1. 如果设置为 true,用户将被允许加入会话。
    2. 如果设置为 false 或不存在值,将使用其他确定访问权限的方法。
  2. 如果其值为 true,服务器将允许用户访问。
  3. 这相当于向用户发送邀请。
  4. 无论 MaxUsers(最大用户数)设置如何,用户都可以加入。
  5. 即时会话是私有的,用户也可以加入。不过他们需要会话链接。

设置示例:

G-Cheese.awesomeHeadless.userAccess
变量所有者 ID
U-Frooxius true
U-Nexulan true
U-BadGuy false

需要添加的相应 JSON 属性为:"allowUserCloudVariable": "G-Cheese.awesomeHeadless.accessControl"

拒绝用户访问

allowUserCloudVariable 类似,你可以使用 denyUserCloudVariable 来拒绝用户访问你的世界启动/无头会话配置。按照上面的指南允许访问,但改为使用 denyUserCloudVariable。当用户的值为 true 时,他们将被拒绝访问。

当为 true 时,此选项优先于所有其他检查,包括最大用户数和可见性等常规会话设置。

设置示例:

G-Cheese.awesomeHeadless.userAccess
变量所有者 ID 描述
U-Frooxius false 允许访问
U-Nexulan false 允许访问
U-BadGuy true 拒绝访问

需要添加的相应 JSON 属性为:"denyUserCloudVariable": "G-Cheese.awesomeHeadless.userAccess"

加入控制

除了上述选项外,你还可以选择使用 requiredUserJoinCloudVariable。当此选项添加到你的世界启动/无头会话配置中时,将在用户加入时检查其值。如果为 true,则允许用户加入。如果为 false,则不允许加入。

请注意,此选项优先于其他会话检查。即使此值设置为 true,如果会话已满(达到最大用户数),用户也将无法进入。

设置示例:

G-Cheese.awesomeHeadless.userAccess
变量所有者 ID
U-Frooxius true
U-Nexulan true
U-BadGuy false

需要添加的相应 JSON 属性为:"requiredUserJoinCloudVariable": "G-Cheese.awesomeHeadless.userAccess"

拒绝消息

当你的无头客户端使用 requiredUserJoinCloudVariable,你可以在配置文件中使用第二个配置元素:requiredUserJoinCloudVariableDenyMessage

这允许你指定一条单一消息,发送给那些因在 requiredUserJoinCloudVariable 定义的变量中值缺失或为 false 而被限制加入的用户。

你必须使用 requiredUserJoinCloudVariable 才能使其工作,因为它们是链接在一起的。这些系统不能与其他云变量或其他访问控制结合使用。

这些选项起初可能令人困惑,但对于控制会话访问非常有用,且不绕过常规检查(如可见性和最大用户数)。我们经常看到它用于像漫展这样需要注册的活动。

延伸阅读

(文档待完善)

默认云变量

Resonite 有一些在内部使用或为用户自动设置的云变量。如下所示:

变量 描述
G-Resonite.Favorites.AudioPlayer 包含用户最喜欢的 音频播放器Uri
G-Resonite.Favorites.AudioStreamController 包含用户最喜欢的 音频流控制器Uri
G-Resonite.Favorites.Avatar 包含用户最喜欢的 Avatar (化身)Uri
G-Resonite.Favorites.Camera 包含用户最喜欢的 相机Uri
G-Resonite.Favorites.Home 包含用户最喜欢的 云端之家Uri
G-Resonite.Favorites.Keyboard 包含用户最喜欢的 Resonite 键盘Uri
G-Resonite.Favorites.NamePlate 包含用户最喜欢的 名牌Uri
G-Resonite.Favorites.NoticeDisplay 包含用户最喜欢的 通知显示器Uri
G-Resonite.Favorites.ProgressBar 包含用户最喜欢的 进度条Uri
G-Resonite.Favorites.TextDisplay 包含用户最喜欢的 文本显示器Uri
G-Resonite.Favorites.UrlDisplay 包含用户最喜欢的 Url 显示器Uri
G-Resonite.Favorites.VideoPlayer 包含用户最喜欢的 视频播放器Uri
G-Resonite.Favorites.WorldLoadingIndicator 包含用户最喜欢的 世界加载指示器Uri
G-Resonite.CloudHome.FeaturedPanel.BackgroundImage 包含精选云端之家面板背景图片的 Uri
G-Resonite.CloudHome.AvatarPanel.AvatarWorldList 包含一个 string,是云端之家面板中不同精选 Avatar 世界的列表。
G-Resonite.CloudHome.FeaturedPanel.WorldCredit 包含一个 string,是云端之家面板中精选世界的制作人员名单。
G-Resonite.CloudHome.FeaturedPanel.WorldLink 包含一个 uri,是云端之家中精选世界的链接。
G-Resonite.CloudHome.FeaturedPanel.WorldName 包含一个 string,是云端之家中精选世界的名称。
G-Resonite.CloudHome.HasVisited 包含一个 bool,表示用户是否访问过云端之家。
G-Resonite.UserSettings.Accessibility.ReducedMotion 包含一个 bool,表示用户是否开启了减少动态效果。
G-Resonite.UserSettings.Color.Enabled 包含一个 bool,确定是否使用用户的主、次和第三颜色云变量。
G-Resonite.UserSettings.Color.Primary 包含用户主色的 ColorX。通常用于头部和手部。
G-Resonite.UserSettings.Color.Secondary 包含用户次色的 ColorX。通常用于头部和手部。
G-Resonite.UserSettings.Color.Tertiary 包含用户第三颜色的 ColorX。通常用于头部和手部。
G-Resonite.UserSettings.ColorPicker.LastOpenedTab 包含一个 int,表示用户在拾色器中最后打开的标签页。
G-Resonite.UserSettings.ColorPicker.Swatch1 包含用户拾色器插槽 1 的 ColorX
G-Resonite.UserSettings.ColorPicker.Swatch2 包含用户拾色器插槽 2 的 ColorX
G-Resonite.UserSettings.ColorPicker.Swatch3 包含用户拾色器插槽 3 的 ColorX
G-Resonite.UserSettings.ColorPicker.Swatch4 包含用户拾色器插槽 4 的 ColorX
G-Resonite.UserSettings.ColorPicker.Swatch5 包含用户拾色器插槽 5 的 ColorX
G-Resonite.UserSettings.ColorPicker.Swatch6 包含用户拾色器插槽 6 的 ColorX
G-Resonite.cloud_home.current 包含以前在旧版基础设施中用于用户最爱 云端之家Uri。已被 G-Resonite.Favorites.Home 取代。
G-Resonite.common_avatar.current 包含以前在旧版基础设施中用于用户最爱 AvatarUri。已被 G-Resonite.Favorites.Avatar 取代。
G-Resonite.interactive_camera.current 包含以前在旧版基础设施中用于用户最爱 相机Uri。已被 G-Resonite.Favorites.Camera 取代。
G-Resonite.virtual_keyboard.current 包含以前在旧版基础设施中用于用户最爱 Resonite 键盘Uri。已被 G-Resonite.Favorites.Keyboard 取代。
G-Resonite.CustomUserColor 包含以前用于用户主色(如默认头手 Avatar)的 ColorX。已被 G-Resonite.UserSettings.Color.Primary 取代。
G-Resonite.test.byte 包含一个供用户测试的 byte
G-Resonite.test.color 包含一个供用户测试的 color
G-Resonite.test.definitionOwnerUnsafe 包含一个供用户测试的 string
G-Resonite.test.definitionOwnerWriteOnly 包含一个供用户测试的 Uri
G-Resonite.test.enum 包含一个供用户测试的 string
G-Resonite.test.float 包含一个供用户测试的 float
G-Resonite.test.float2 包含一个供用户测试的 float2
G-Resonite.test.float3 包含一个供用户测试的 float3
G-Resonite.test.float3x3 包含一个供用户测试的 float3x3
G-Resonite.test.float4 包含一个供用户测试的 float4
G-Resonite.test.int 包含一个供用户测试的 int
G-Resonite.test.longString 包含一个 8192 字符长的 string,供用户测试。
G-Resonite.test.ownerOnlyVariable 包含一个拥有 OwnerOnly 权限的 string,供用户测试。
G-Resonite.test.ownerWriteOnly 包含一个拥有 OwnerWriteOnly 权限的 string,供用户测试。
G-Resonite.test.publicVariable 包含一个权限设置为 public 的 string,供用户测试。
G-Resonite.test.shortString 包含一个 8 字符长的 string,供用户测试。
G-Resonite.test.string 包含一个默认长度的 string,供用户测试。

(文档待完善)