赋命名空间标识符

From Minecraft基岩版开发Wiki

赋命名空间标识符(Namespaced identifier)是用来指明和识别游戏中特定对象而又能避免潜在的歧义和冲突的一种方式,其主要由命名空间(Namespace)标识符(Identifier,简写ID)两部分组成[注 1]。通常来说,命名空间是内容的区界,标识符相当于对应区界下此内容的名称;有时命名空间也直接充当名称来使用。部分游戏内容(例如方块物品等)拥有数字ID,这个数字ID即数字标识符。

格式[edit]

赋命名空间标识符用作普通字符串来指明游戏中的方块物品实体配方函数等对象。

有效的赋命名空间标识符的格式为<命名空间>:<标识符>,其中只能使用合法字符。

合法字符[edit]

命名空间和标识符可以包含任何符号,斜杠“/”和冒号“:”除外。

斜杠“/”在命名空间中是非法的,但在战利品表、交易、函数和声音中表示路径时是可接受的[注 2]

命名空间和标识符的最好命名方法是小写单词加下划线(snake_case)。

输出为字符串[edit]

游戏通常会将赋命名空间标识符使用字符串表示。赋命名空间标识符的字符串格式为<命名空间>:<标识符>

例子:

命名空间 标识符 字符串表示
minecraft diamond minecraft:diamond
foo bar.baz foo:bar.baz

从字符串识别[edit]

游戏可以识别用户输入的赋命名空间标识符字符串,错误的字符串无法正确识别为赋命名空间标识符。

字符串被正确识别的前提是必须符合合法字符的规则,在此条件下通过添加不同的符号可以更改被识别的内容:

  • 方块物品的赋命名空间标识符字符串后使用冒号,并在冒号后加上数据值可用于指定该赋命名空间标识符下某个数据值的方块或物品。例如:minecraft:wool:3淡蓝色羊毛)。
  • 几何的标识符字符串后使用冒号,并在冒号后加上另一个几何的标识符可继承该几何的内容。例如:geometry.armor:geometry.base

命名空间[edit]

这不是一个新概念,但是我想我应重申一下什么是“命名空间”。游戏中的大多数东西都有一个命名空间,以便在我们加入了something的同时一个模组(或地图,或其他)也加入了something时来区分它们两个。当您要为某个东西命名时,例如一个战利品表,您还需要指定这个东西所属的命名空间。如果您不指定命名空间,我们默认它是minecraft。这意味着somethingminecraft:something是一回事[注 3]

——Dinnerbone评论于命名空间

命名空间是内容的区界。它是为了防止潜在的内容冲突或无意中覆盖了相同名称的对象。

例如,两个附加包里都有一个标识符为start方块。向游戏加入这两个附加包,如果没有命名空间,这两个方块就会发生冲突。当它们具有onetwo两个不同的命名空间时,则方块将变为one:starttwo:start,不再冲突。

minecraft命名空间[edit]

游戏本身使用minecraft命名空间。只有当项目需要覆盖或修改现有的“minecraft”数据时,才应该使用minecraft命名空间。

附加包组件使用<命名空间>:<组件名称>的方式来区分,在国际版中所有含命名空间的组件均使用minecraft命名空间,在中国版中新增的组件则使用netease命名空间。

为了避免和附加包冲突,在Inner Core中自定义的物品、方块和实体当前皆默认以minecraft为命名空间。

自定义命名空间[edit]

不同的项目或内容创作(例如附加包),命名空间应该是不同的,仅当需要覆盖其他项目的时候,才使用与其他项目相同的命名空间。

为了防止潜在的冲突,命名空间应该尽可能的特殊。

  • 避免使用一堆字母的组合。例如,一个名为“nuclear craft”的项目不应该使用命名空间nc,因为太简单了。
  • 避免使用过于模糊的词语。battle_royale也不能提供便于查找的信息,不过player_name_battle_royale会更好些。

这些不当的命名空间都会减少项目的适应程度,并在将多个项目加入到游戏时给调试带来困难。

模式[edit]

附加包一般使用一个赋命名空间标识符(或标识符)来定义该JSON文件的模式,它们通常是JSON文件中二级对象的对象名。例如方块模式的赋命名空间标识符是minecraft:block,它告诉游戏这个文件使用的模式为方块模式。它在JSON文件中的关系如下:

{
  "format_version": "1.17.0",
  "minecraft:block": {
    
  }
}

下表列出了附加包中各种文件的模式赋命名空间标识符(部分仅标识符或命名空间):

赋命名空间标识符
animations 动画
animation_controllers 动画控制器
minecraft:attachable 附着物
minecraft:biome 生物群系
minecraft:client_entity 实体客户端
minecraft:entity 实体服务端
minecraft:<地物名称>_feature 地物
minecraft:feature_rules 地物规则
minecraft:fog_settings 迷雾
minecraft:item 物品
minecraft:geometry[注 4] 几何
particle_effect 粒子
minecraft:recipe_<配方名称> 配方
render_controllers 渲染控制器
minecraft:spawn_rules 实体生成规则
minecraft:texture_set 纹理集
<命名空间>[注 5] JSON UI
minecraft:behavior_tree 行为树

列表[edit]

历史[edit]

携带版(Alpha)
0.16.0build 1加入了命令,支持字符串ID,但这些ID没有命名空间。
基岩版
1.12.01.12.0.2加入了赋命名空间标识符和minecraft前缀以支持通过附加包加入自定义物品。

参见[edit]

注释[edit]

  1. 附加包中一般简称赋命名空间标识符为“identifier”或"name"。例如:
    "identifier": "example:test_block"
    
  2. 战利品表、交易、函数和声音的命名空间即其文件名(函数和声音的命名空间不含文件拓展名),若包含在一个或多个次级目录下则命名空间为其文件路径,用斜杠划分目录。例如:
    • 引用另一个战利品表:
      "name": "loot_tables/gameplay/fishing/junk.json"
      
    • 在命令中填写函数的命名空间:/function check/testblock
  3. 基岩版中如果不指定命名空间,游戏不会默认加上minecraft,但附加包中部分JSON文件的模式赋命名空间标识符仅为一个标识符(例如动画JSON的模式赋命名空间标识符是animations而不是minecraft:animations),这似乎是默认为minecraft命名空间下的内容。
  4. 几何JSON文件可以使用模式赋命名空间标识符也可以不使用;单个模型的几何JSON只使用标识符,不带有命名空间。
  5. JSON UI文件中以
    "namespace": "<example>"
    
    开头作为此UI的命名空间。游戏通过不同的JSON UI的名空间来区分它们彼此。