Ivon852 发表于 2021-8-11 03:19:14

Add-On实体Entity Properties的用法

本帖最后由 Ivon852 于 2021-8-11 03:27 编辑

这篇文章参考自Bedrock Dev Wiki。

Mineraft基岩版1.16.230.52引入了"Entity properties"这个新功能,可以为Add-On的实体添加属性(property)。
这么一来,实体就能够储存变数,可以是数字、字串、布林值。
比起过去用行为包的各种组件伪装成「变数」,再用各种query侦测更方便的多;同样的,方块也有属性可以使用。
新建属性
属性要在行为包的实体档案的description物件进行注册,命名空间一律以property:开头。
在属性中枚举出一系列的数值,然后再进行操作。
{    "format_version": "1.16.0",    "minecraft:entity": {      "description": {            "identifier": "kanmusu:boku",            "is_spawnable": true,            "is_summonable": true,            "is_experimental": false,            "properties": {                //數字範圍的屬性                "property:number_range": {                  "values": {                        "min": 0,                        "max": 100                  },                  "client_sync": true                },                //第二種數字範圍的屬性                "property:number_enum": {                  "values": [                        1,                        2                                  },                //字串陣列的屬性                "property:string_enum": {                  "values": [                        "在水中",                        "在陸地"                                  },                //布林值的屬性                "property:boolean_enum": {                  "values": [                        true,                        false                                  }            }      },      "components": {},      "events": {}    }}
针对每个新增的属性,还可以设定二个值:
default代表的是预设值,如果不填写,则会使用阵列第一个值。
"property:number_range": {    "values": {      "min": 0,      "max": 100    },    "default": 0}
client_sync则是让资源包也能读到这个属性。
"property:number_range": {    "values": {      "min": 0,      "max": 100    },    "client_sync": true}

存取、修改屬性
在行为包的event使用函数: "set_actor_property" 可修改属性的值。
"event:set_entity_property": {    "set_actor_property": {      "property:number_enum": 2,      "property:string_enum": "'在水中'",      "property:boolean_enum": "!query.actor_property('property:boolean_enum')"    }}

別名 (Alias) 的用法可以为实体定义别名,用/summon就能够召唤预先设定好属性数值的实体。也可以单纯只是别名,而不赋值,例如下面的default_alias。目前新增别名,背包会出现多余的生怪蛋。
{    "format_version": "1.16.0",    "minecraft:entity": {      "description": {            "identifier": "kanmusu:boku",            "is_spawnable": true,            "is_summonable": true,            "is_experimental": false,            "properties": {                //字串陣列的屬性                "property:scale": {                  "values": [                        "變大",                        "變小"                                  }            },            "aliases": {                "entity:default_alias": {},                "entity:first_alias": {                  "property:scale": "變大"                },                "entity:second_alias": {                  "property:scale": "變小"                }            }      },      "components": {},      "events": {}    }}

排序 (Permutation) 的用法permutation是位于minecraft:entity物件内,与components同层级。
{    "format_version": "1.16.0",    "minecraft:entity": {      "description": {},      "permutations": [            {                //條件                "condition": "query.actor_property('property:scale') == '變大'",                "components": {                  //內含的組件                  "minecraft:scale": {                        "value": 10                  }                }            },            {                //條件                "condition": "query.actor_property('property:scale') == '變小'",                "components": {                  //內含的組件                  "minecraft:scale": {                        "value": 0.1                  }                }            }      ],      "components": {},      "events": {}    }}

实际应用例子整篇讲下来,让我们来看看实际例子。我制作的boku生物程式码如下:{    "format_version": "1.16.0",    "minecraft:entity": {
      "description": {            "identifier": "kanmusu:boku",            "is_spawnable": true,            "is_summonable": true,            "is_experimental": false, "properties": {                //字串陣列的屬性                "property:scale": {                  "values": [                        "正常",                        "變大",                        "變小"                }            },"aliases": {                //別名1                "boku:big": {                  "property:scale": "變大"                },                //別名2                "boku:small": {                  "property:scale": "變小"                }            }      },"permutations": [            {                //變大的條件                "condition": "query.actor_property('property:scale') == '變大'",                "components": {                  //內含的組件                  "minecraft:scale": {                        "value": 10                  }                }            },            {                //變小的條件                "condition": "query.actor_property('property:scale') == '變小'",                "components": {                  //內含的組件                  "minecraft:scale": {                        "value": 0.1                  }                }            }      ],   "components": {            //預設大小            "minecraft:scale": {                "value": 1.0            }            //...(其餘組件在此省略)      },"events": {            "boku:enlarge": {                "set_actor_property": {                  "property:scale": "'變大'"                }            },            "boku:shrink": {                "set_actor_property": {                  "property:scale": "'變小'"                }            }      }    }}

因为属性预设的值是"正常",permutation也没有写条件,所以正常生成是普通大小。
若使用/summon附加spawn event的指令,在召唤时执行赋值事件,这样会变大:/summon kanmusu:boku ~ ~ ~ boku:enlarge

而用这条召唤,他会变小:
/summon kanmusu:boku ~ ~ ~ boku:shrink


permutation侦测到值的变化,就会自动执行设定好的组件,给予boku指定的大小。当然我有定义别名,也可以直接用这二条: /summon boku:second_alias别名自动赋值,再交由permutation进行缩放。
页: [1]
查看完整版本: Add-On实体Entity Properties的用法