变量

变量在 JSON UI 开发中扮演着重要的角色,他们不仅可以在全局当中存储数据,也可以从一个控件中到另外一个控件中继承数据。也可以说变量是一种数据,它存储着字符串、布尔值、数字、数组和对象。

创建变量

我们应该要如何正确创建变量呢?很简单,只需把属性的值写成 “$ + 变量名”,也就是字符串开头加上“$”,例如"text": "$example""test": { "size": "$example_size", "ignored": "$example_ignored", "$example_size": ["100%","100%"], "$example_ignored": true, "$example_controls": "common.empty_panel", "controls": [ {"test@$example_controls":{}} ] }

在示例中,我们创建了变量,甚至引用的控件也能作为变量。

当然,变量远不如此,我们还可以用于继承或其他用途。

声明变量

当一个变量没有声明它所储存的数据,属性就会将他认为 null 或 变量名。

所以声明一个变量是很有必要的,声明变量就像上方的示例一样,将变量视为属性,直接赋值给他。

默认变量

为了尽可能减少变量带来的错误,我们需要给变量赋予一个默认值。(即使你不赋予一个默认值也没有关系,只要变量被声明就行)

我们只需像声明变量那样,在变量名后方加上 |default ,并给这个变量声明一个默认值。

但也不必要一直使用默认变量声明一个变量,因为默认变量的权重低,会被新的值覆盖。

// 仅引用 example1 会显示 abc "example1": { "text": "$example", "$example|default": "abc" }, // 引用 example2 会显示 def "example2": { "$example": "def" }

作用域

上述所提到的变量,声明变量所在的控件就是一个作用域,该作用域的范围为该控件以及所有后代控件。

"example1": { "$example": "abc", "controls": [{"e@example2":{}}] }, "example2": { "$example": "def", "controls": [{"e@example3":{}}] }, "example3": { "type": "label", "text": "$example" }

上述的示例中,example3 控件会显示 def 文字。说明变量会优先使用最近的作用域作为变量的值。

全局变量

如上所述,变量有一定的作用域,并不能在其他控件共享。我们可以使用全局变量弥补这些问题。

全局变量可以在 RP/ui/_global_variables.json 文件中声明,在文件内部声明的变量具有全局性,任何文件都能使用全局变量。

{"$text": "abc"} "test": { "type": "label", "text": "$text" }

继承变量

就像下面那样,使用其他控件的变量:

"example1": { "$test1": 123, "$test2": true }, "example2@example1": { // $test1 变量被修改为 456,$test2 保持不变 "$test1": 456 }

当我们引用其他控件时,变量也同时继承了过来。当前控件的变量名如果与其他控件的变量名一致的话,其他控件的变量就会被覆盖。

批量属性

一般我们都需要重复使用某个控件,我们可以选择引用、使用变量可以使同一个控件呈现出不同的可能。(也可以用于穷举同一个控件…)

就例如定义一个按钮的外观,不可能总是为按钮的三种状态分别写三个不同的控件。我们这时就可以给这三种状态引用同一个控件,使用一个变量定义三种状态不同的按钮背景。这样我们就省下了重复的属性,与此同时也可以多使用几个变量完善按钮的样式。

"button@common.button": { "controls": [ {"default@image":{"$btn_bg":"textures/ui/default"}}, {"default@image":{"$btn_bg":"textures/ui/hover"}}, {"default@image":{"$btn_bg":"textures/ui/pressed"}} ] }, "image": { "type": "image", "texture": "$btn_bg" }

variables 属性

使用 variables 属性,通过不同的条件来反映不同的变量。使用变量的运算以及条件判定大大提升了变量的使用性。

即使属性可以使用变量的运算,但更推荐使用 variables 属性判定某个条件下改变变量的数据。特别是做经典UI样式和携带版UI样式的时候,就可以使用 variables 属性来给屏幕在不同的UI样式下呈现不同的内容。

当你只需要一个判定式去处理,可以直接使用 "variables": {}; 当你只需要多个判定式去处理,可以直接使用 "variables": []

下方是一个判定经典UI样式和携带版UI样式的示例:

"test": { "variables": [ {"requires":"$desktop_screen","$test":"desktop"}, {"requires":"$pocket_screen","$test":"pocket"} ] }

requires 是条件,他的介绍如下:

属性属性名描述
requires需求字符串requires 的条件为 true 时,才会应用该对象内所有的变量。

使用 variables 时,建议给变量赋予默认值,当条件都不符合时变量就会采取默认值。

操作表达式

内容详见 操作表达式 >

数据类型转换

内容详见 数据类型转换 >