本站文本内容除另有声明外,均在知识共享 署名-非商业性使用-相同方式共享 3.0 协议下提供。(详情… 本站文本内容除另有声明外,均在知识共享 署名-非商业性使用-相同方式共享 3.0 协议下提供。(详情…中文Minecraft Wiki是完全公开的。欢迎持续参与翻译工作中文Minecraft Wiki是完全公开的。欢迎持续参与翻译工作Minecraft中文Wiki微博正在更新!或许有兴趣去看看Minecraft中文Wiki微博正在更新!或许有兴趣去看看翻译或创建页面之前,不妨看看译名标准化Wiki条例页面。翻译或创建页面之前,不妨看看译名标准化Wiki条例页面。想与其他用户进行编辑上的沟通?社区专页正是为此创建的。想与其他用户进行编辑上的沟通?社区专页正是为此创建的。需要管理员的协助?在管理员告示板留言也许可以帮到您。需要管理员的协助?在管理员告示板留言也许可以帮到您。

教程/制作行为包

来自Minecraft Wiki
跳转至: 导航搜索
Mclogo.svg

概述[编辑 | 编辑源代码]

这篇文章和“资源包教程”有类似之处. 当然我们也建议您最好先了解一下如何创建一个资源包, 这篇教程可能会忽略一些与资源包的共同点. 下面会讲解如下内容:

  • 简述JSON数据格式
  • 如何创建行为包
  • 如何改变怪物行为

如果你看过站内关于pig.json的修改教程,那么可能会辅助阅读本篇文章。

所需时间[编辑 | 编辑源代码]

完成本教程大约需要1至1个半小时。

所需工具[编辑 | 编辑源代码]

跟随下面给出的步骤继续教程:

文本编辑器[编辑 | 编辑源代码]

可以使用任意一种文本编辑器,但我建议你使用一些编程用的IDE。在PC上,Notepad++是一个非常不错的选择,不仅免费,而且能够对编程语法进行高亮显示,你可以从https://notepad-plus-plus.org/下载到Notepad++。其他软件比如Visual Studio Code也是不错的选择。而在iOS上,用Textcode Viewer则是不错的选择。

文件管理器[编辑 | 编辑源代码]

可以使用任何一种文件管理器。我建议:Windows可以用系统自带的文件管理器(但是请你安装好压缩和解压用的软件,如WinRAR,7z等)。而iOS设备上则可以用文件全能王(英文名FileMaster);安卓可以使用ES文件管理器。

JSON数据格式[编辑 | 编辑源代码]

另见:教程/NBT与JSON§JSON的语法

在开始制作行为包之前,我们需要先快速了解一下JSON是怎么运作的。我们不会去太过于深入JSON技术的一些细节,但是如果你希望了解更多,你可以参阅http://www.json.org/

JSON里由两种不同的数据结构所组成:

  • 字符串
    • 例如: "name": "value"
  • 数组/对象数组
    • 例如: ["value1","value2"]

你可以创建一个数组,里面放一些有顺序的内容。可以是标量(字符串、数值、布尔值和空值)也可以是对象(对象和数组)。

对象范例[编辑 | 编辑源代码]

"minecraft:scale": { "value": "0.5" }

上面的对象由一个字符串组成,其中"minecraft:scale"是键(该对象的名称),值是另一个键值对("value": "0.5")

带集合的对象范例[编辑 | 编辑源代码]

{
  "minecraft:health": {
    "value": "10",
    "max": "10"
  }
}

带数组的对象范例[编辑 | 编辑源代码]

{
  "minecraft: type_family": {
    "family": ["monster","undead"]
  }
}

注意[编辑 | 编辑源代码]

键与值之间总是使用冒号分开,值之间则使用逗号分开。另外,每一个大括号{必须封闭},即不允许只出现一个左大括号但是没有右大括号的情况;中括号[]、双引号""同理。这一点非常重要!请务必记住。如果上述符号没有封闭,将可能造成错误的结果,让你的JSON代码无法执行。

幸运的是,我们可以使用一些在线的工具网站来帮助我们检查JSON,你可以使用http://pro.jsonlint.com/或如果访问速度较慢,也可以使用国内类似的网站如http://www.bejson.com/来检查你JSON的合法性;你只需要复制你的JSON代码到该页面,然后点击右边的检查按钮(√)即可。如果检查按钮显示为绿色,则说明你的JSON正常,反之,如果检查按钮为红色,他将尝试告诉你错误的原因。注意!这个网站只能检查这个JSON是否有错误比如漏掉大括号或者中括号等,即使通过也并不能代表你的JSON能够在游戏里正确的运行!我们也会检查你在json文件中写的注释,注释在json中通常是无效的,但是当你在文档中写了"//注释"的时候工具也会告诉你"JSON文件无效",记得在使用工具检查代码前先移除所有注释!

创造一个行为包[编辑 | 编辑源代码]

行为包作为Add-Ons的一部分,允许你更改一个实体的行为来达到全新的表现效果。不过目前仅支持添加或修改一个实体已经存在的行为(当然这个实体也应该是存在的)。这个简单的教程将向您展示如何将爬行者的爆炸行为添加到猪身上,不过在修改猪之前,我们要先让别人知道自己是这个Add-On的作者。

当然,下面的步骤你也可以用在一个材质包上:

  • 将原版行为包复制下来并放到一个专门的文件夹中,命名为“教程行为包”
  • 在此寻找行为包文件夹(Windows 10版):C:\Users\帐户名称\AppData\Local\Packages\Microsoft.MinecraftUWP_8wekyb3d8bbwe\LocalState\games\com.mojang\behavior_packs
  • 创建一个名为pack_manifest.json的JSON文件

manifest.json[编辑 | 编辑源代码]

你可以在这个manifest找到你需要的内容。

manifest.json
{
  "header": {
    "pack_id": "e3c5a9be-1cfc-4a74-9f70-9213bab32090",
    "name": "教程数据包",
    "packs_version": "0.0.1",
    "description": "教程资源包5",
    "modules": [
      {
        "description": "未使用",
        "version": "0.0.1",
        "uuid": "14d5fb6b-ef0a-47e5-8a98-d615709c1a03",
        "type": "data"
      }
    ],
    "dependencies": [
      {
        "description": "依赖于教程材质包",
        "version": "0.0.1",
        "uuid": "891f5751-bb0e-47c6-91f0-fdc4e76949ef",
        "type": "resources"
      }
    ]
  }
}

当然,你完全可以把 “manifest.json”复制进你的行为包文件夹并修改它。如果你需要让你行为包配套材质绑定到行为包上,就要让行为包中“dependencies”里面的“uuid” 和材质包中modules的“uuid”相同。

注意

单从文件名称和大致结构看来材质包和行为包的“manifest.json”似乎是完全一样的。但是modules中的“type”决定了它是那种类型的包,行为包对应“data”,材质包对应“resources”。不过与此同时,你需要让header和modules的UUID不同,同样的材质包的所有UUID也不能和行为包重合。如果真的出现相同的情况,则会导致只能导入其中一个包。

制作一个图标[编辑 | 编辑源代码]

为行为包制作图标的过程其实是和为资源包制作图标一样的, 可以在创建资源包中查看细节。当然,资源包和行为包图标一样也是可以的。

测试自己的行为包[编辑 | 编辑源代码]

现在可以尝试运行了!创建一个新的世界,在创建世界页面的左边可以看到行为包选项,点进去之后找到你导入的行为包并选中。如果有弹窗就点确定,行为包会导致这个世界不再能够获得成就:

FileExtensions.png

请记住,每当您更改行为包时,您都需要创建一个新世界,因为游戏会在创建世界时制作行为包的副本。同样,如果您修改世界文件夹中包含的加载项,则可以避免这种情况。请记住,如果你这样做,你需要手动将它复制回com.mojang / behavior_packs文件夹,如果你想将这个包应用到其他世界。

设置JSON文件结构[编辑 | 编辑源代码]

现在我们的这个包所需的东西已经准备好了,让我们把这些json文件放进一个文件夹里。

  • 在这个名为"tutorial_behavior_pack"的文件夹里,新建一个名为“entities”的文件夹。

我们将要把所有改变实体行为的json文件放在entities文件夹内。我们开始吧。首先,把pig.json从\Vanilla_Behavior_Pack\entities\pig.json复制出来,然后,把它粘贴到entities文件夹里面。现在pig.json已经复制完了。把它用你选择的文本编辑器打开。

实体 JSON 概述[编辑 | 编辑源代码]

在我们修改JSON代码前,让我们首先简要地看看我们的实体.json怎么建立。

Minecraft实体JSON有4个部分:

minecraft:entity[编辑 | 编辑源代码]

这是每个生物的主要对象,接下来所有行为behavior和事件event都是这个对象中包含的值。

entity.json伪代码
{
  "minecraft:entity": {pig} scale 11.111
    "format_version": 0.1,
    "component_groups": { component groups go here },
    "components": { components go here },
    "events": { events go here }
  }
}
注意

在Minecraft中,这不是有效的json!这只是一个如何编写一个可用实体json的示例。 如果你查看一下现有的pig.json你将会注意到“component groups go here(在这填写组件)”这一部分事实上已经写入了真正的部件组。

注意2

format_version 是用来告诉Minecraft该读取哪个版本的JSON. 当我们升级JSON文件并添加新组件时, 应当告诉游戏它需要寻找对应版本.而此事通过修改format_version后的版本号来完成

所以,请你尽可能不改变这个数字.因为,当Minecraft的默认JSON更新时,你也需要更新你的JSON来适应新的变化.一旦你改变了你的JSON,你就需要改变这个版本号.你应该把官方已更新的JSON复制过来,做好你自己的修改后再覆盖回去。

(啰嗦一堆就是告诉你别用自己的版本号,去用官方的。)

复合标签组[编辑 | 编辑源代码]

用于定义一组行为,用于简单地去除或增加多个行为,对于改变生物状态十分有用(例如幼年猪与成年猪行为的转换)。

在pig.json中含有pig_baby、pig_adult两个复合标签组。可以看到,只有当某个部件组当前被加入这个实体中时,这个部件组才会运行。因此,当这只猪是幼年猪时,pig_baby这个复合标签组将会被加入并运行,而pig_adult则不会。

复合标签[编辑 | 编辑源代码]

用于定义该种生物的共有行为。

可以看到“minecraft:identifier”和“minecraft:type_family”存在于这一部分,因为我们希望每一种猪都有这些行为。

事件[编辑 | 编辑源代码]

事件用于加入或移除复合标签组。事件被我们加入的部件或者Minecraft本身的代码所触发。

事件可以使用randomize函数在不同结果之间进行选择(请参阅pig.json中的“minecraft:entity_spawned”)。 请注意,randomize的权重可以增加到100以上。这是因为它们不是百分比! 如果你把成年猪的比重设定为23,然后将生猪的比重设定为100,那么你将有23/123的机会获得成年猪和100/123的机会获得一头小猪。

代码组件:[编辑 | 编辑源代码]

minecraft:identifier[编辑 | 编辑源代码]

这个语句对每一个实体来说都是必要的. 它告诉MC你的JSON对哪些实体有效.

请注意:标识符(identifyier)必须被正确命名!如果乱输你可能会遇到一些不可描述的事情或是实体大罢工。不知道/不确定如何命名?请参考原版行为包中关于那个实体的JSON文件。(在 /Vanilla_Behavior_Pack /entities/)

minecraft:type_family[编辑 | 编辑源代码]

它为实体设置族类型。族类型利用多种多样的要素,选择特定的实体。具体例子请参考 “minecraft:rideable” 和 “minecraft:breedable”。

minecraft:entity_spawned[编辑 | 编辑源代码]

当你规定的的实体生成时,这个语句会被触发。 在 pig.json 中有一个随机化函数,可以随机地生成大猪或小猪。你可以阅读它来加深理解。

正式开始吧![编辑 | 编辑源代码]

添加组件[编辑 | 编辑源代码]

现在我们已经明白了一个实体是如何被设置的;是时候魔改一下关于猪的代码了!


找到 creeper.json和 pig.json 文件(在 Vanilla_Behavior_Pack/entities/)然后分别打开它们。你眼前应该有两个分离的窗口(这样便于来回切换)。

首先,让猪找到一个受害者。你可以往pig.json的组件对象中写入"minecraft:nearest_attackable_target" 和"minecraft:target_nearby_sensor"来达到这一目的。

然后,猪要找目标。在组件对象中找到 "minecraft:behavior.random_look_around"。它应该刚好在 "events" 小节之前。

最后,爆炸吧!从 creeper.json 中复制”target_nearby_sensor” 和 “nearest_attackable_target”组件,粘贴到pig.json的”random_look_around”组件之后。(下边有详细代码,自己看)


pig.json 片段:

...

"minecraft:behavior.random_look_around": {
  "priority": 9
},
"minecraft:behavior.nearest_attackable_target": {
  "priority": 1,
  "entity_types": [
    {
      "filters": { "other_with_families": "player" },
      "max_dist": 16
    }
  ], 
  "must_see": true
},
"minecraft:target_nearby_sensor": {
  "inside_range": 3.0,
  "outside_range": 7.0,
  "on_inside_range": {
    "event": "minecraft:start_exploding",
    "target": "self"
  },
  "on_outside_range": {
    "event": "minecraft:stop_exploding",
    "target": "self"
  }
}

...

注意下最后的括弧后没加逗号,这是因为 "minecraft:target_nearby_sensor"是最后一个组件(话说完了,不用逗号)。

minecraft:nearest_attackable_target[编辑 | 编辑源代码]

这个组件让实体在你定义的限制下攻击最近的目标。 下面是一些设置的说明。

  • Priority – 优先级,设置这个组件的重要程度。优先级数越高,组件就越可能优先运行(比如两个组件冲突时)。
  • Entity_types – 选择你定义的实体,把它/它们设置为目标。(上边提到过)
  • Max_dist – 最大距离。目标在这个范围内才能被追踪和攻击。
  • Must_see – 必须被看见。目标必须在玩家的视野范围内,才会被你设置的实体攻击。

在上面的代码中,我们选定了玩家作为目标。当玩家走进以猪为中心16块为半径的区域时,就会遭到追击。

minecraft:target_nearby_sensor[编辑 | 编辑源代码]

目标靠近传感器。在你设定的范围内如果有目标,这个组件就会被触发。

  • Inside_range – 设置“内部范围”的距离
  • Outside_range – 设置“外部范围”的距离
  • On_inside_range – 当目标进入“内部范围”,触发这个函数内的语句。
  • On_outside_range – 当目标脱离“外部范围”,触发该函数内的语句。

上面的代码中,我们想要利用 on_inside_range 和 on_outside_range 触发 "minecraft:start_exploding" (开始爆炸)和 "minecraft:stop_exploding"(停止爆炸)。当然现在啥也不会发生,因为我们还没添加这两个事件呢!(下面就要讲怎么添加事件)

添加事件[编辑 | 编辑源代码]

在pig.json中滚动到“events”对象底部并在 "minecraft:on_unleash"的闭合花括号后添加一个逗号。我们将添加新的开始/停止爆炸事件

从creeper.json复制"minecraft:start_exploding" and "minecraft:stop_exploding" 事件,粘贴到pig.json。pig.json 看起来应该像这样(新的文本以绿色高亮)。

pig.json 片段:

...

"minecraft:on_unleash": {
  "remove": {
    "component_groups": [
      "minecraft:pig_leashed"
    ]
  }
},
"minecraft:start_exploding": {
  "remove": {
    "component_groups":[
      "minecraft:hunting"
    ]
  },
  "add": {
    "component_groups": [
      "minecraft:exploding"
    ]
  }
},
"minecraft:stop_exploding": {
  "remove": {
    "component_groups": [
      "minecraft:exploding"
    ]
  },
  "add": {
    "component_groups": [
      "minecraft:hunting"
    ]
  }
}

... 现在我们带来了苦力怕的事件,但它需要一些清理。我们的猪不需要一个狩猎部件组。因此我们可以从 start_exploding 移除“remove”部分,从stop_exploding移除“add”部分。现在我们的代码看起来像这样:

pig.json 片段:

...

"minecraft:on_unleash": {
  "remove": {
    "component_groups": [
      "minecraft:pig_leashed"
    ]
  }
},
"minecraft:start_exploding": {
  "add": {
    "component_groups": [
      "minecraft:exploding"
    ]
  }
},
"minecraft:stop_exploding": {
  "remove": {
    "component_groups": [
      "minecraft:exploding"
    ]
  }
}

...

注意两个事件都在添加和移除一个部件组叫做“minecraft:exploding”。我们的pig.json还没有这个部件组呢!

添加复合标签组[编辑 | 编辑源代码]

向上滚动到pig.json的顶部到“component_groups”部分。找到最后一个复合标签组,该组应该是pig_leashed,并在其右大括号中添加逗号。 现在输入以下内容,或者从creeper.json复制“minecraft:exploding”组件组。Pig.json现在应该如下所示(绿色新代码):

pig.json 片段

...

  "minecraft:pig_leashed": {
    "minecraft:behavior.move_towards_restriction": {
      "priority": 2,
      "speed_multiplier": 1.0
    }
  },
  "minecraft:exploding": {
    "minecraft:explode": {
      "fuseLength": 1.5,
      "fuseLit": true,
      "power": 3,
      "causesFire": false
    }
  }
},
"components": {
  "minecraft:damage_sensor": {

...

minecraft:explode[编辑 | 编辑源代码]

fuseLength – 这个实体在引信点燃时爆炸所需的时间(以秒为单位)

fuseLit – 添加此组件时引信是否自动点燃

power – 这决定了所造成的伤害,以及爆炸半径的大小

causesFire – 这决定了爆炸是否会导致附近的方块着火

让我们在这个群组中添加一个“scale”组件,这样我们的猪在它爆炸之前就会变大!在“explode”组件的结束大括号中添加一个逗号,并输入以下内容(绿色的新文本):

pig.json 片段

...

  "minecraft:exploding": {
    "minecraft:explode": {
      "fuseLength": 1.5,
      "fuseLit": true,
      "power": 3,
      "causesFire": false
    },
    "minecraft:scale": {
      "value": 2      
    }
  }
},
"components": {
  "minecraft:damage_sensor": {

...

minecraft:scale[编辑 | 编辑源代码]

Value – 实体正常规模的倍率。值为2将使比例加倍,值为.5将使比例减半等。

测试我们的行为包[编辑 | 编辑源代码]

  • 启动游戏
  • 创建新世界
  • 设置世界为创造模式
  • 打开作弊
  • 单击行为包
  • 在右侧列表中找到“Tutorial Behavior Pack”并单击它
  • 单击玩
  • 从创造模式的背包中拿出猪的刷怪蛋,并生成一只猪
  • 跑离20方块左右
  • 使用斜杠命令将模式切换为生存模式: /gamemode s
  • 冲向那只猪

恭喜![编辑 | 编辑源代码]

您只是简单接触到了行为包的可能性! ! 如果您希望能够做的不仅仅是爆炸,请查看实体组件参考指南以查看可以添加到实体的其他行为和组件!您还可以随时查看如何为示例设置Vanilla的行为包。

注意保留的不可修改行为[编辑 | 编辑源代码]

至今,不是某个实体所有的行为都是可编写的数据!你不能改变某些特殊的移动行为,例如蝙蝠、恶魂、烈焰人的飞行行为,或者鱿鱼、守卫者、远古守卫者等的游泳行为。这也会干涉到你可能会向它们加入的行为。例如给予鱿鱼近战攻击(melee attack)行为时,它将不会运行,因为它在水中时它的游泳行为仍然被强行编码在程序中。顺带一提,在任何时候生成另一个实体或者物品是不可能的。比如说鸡生蛋的能力(对于行为包来说)是不可控的数据,你不能修改它。

当然,对于我们行为包作者来说,我们希望这些情况在将来会有所改善——行为包的制作会更加自由,而功能会更强大!

挑战[编辑 | 编辑源代码]

既然你已经有了一些基础的经验,你可以挑战一下下列任务:

  • 使僵尸可以被玩家骑乘;
    • 再尝试让玩家能够用某种东西控制僵尸的方向。

(注:可以参照猪的item_controllable以及controlled_by_player部件)

  • 使村民在持有弓时转变为骷髅。(注:可以参照狼的 tameable 部件和村民的 transformation 部件。)
  • 改变太阳和月亮的材质(和材质包类似)
  • 使牛可以发射恶魂的烈焰弹。

排查故障[编辑 | 编辑源代码]

如果您的JSON更改似乎在游戏中不起作用,请检查以下内容:

  • 确保您已正确输入所有内容。拼写错误和标点丢失会导致不必要的行为!
  • 确保.json文件位于正确的文件夹中并正确命名!
    • 您应该有一个名为entities的文件夹,其中包含所有.json文件
  • 确保您的实体具有正确的标识符
    • 如果您不确定它应该是什么,请检查Vanilla Minecraft行为包中的.json文件
    • Vanilla的.json文件可以在/Vanilla_Behavior_Pack/entities中找到

传播和分享[编辑 | 编辑源代码]

现在你已经创建了一个行为包。想与朋友分享?照着下面做。

  • 定位你的行为包文件夹
    • (C:\Users\帐户名称\AppData\Local\Packages\Microsoft.MinecraftUWP_8wekyb3d8bbwe\LocalState\games\com.mojang\behavior_packs\tutorial_behavior_pack)
  • 选择所有的文件和文件夹
  • 右击,选择“发送到” -> zip压缩文档
  • 把生成的文件重命名为 tutorial_behavior_pack.mcpack
    • 确定文件扩展名为 .mcpack
    • 弹出窗口问你是否确定修改扩展名,选“是”

你现在可以给你的朋友.mcpack文件了! 当他们打开它时,Minecraft会在它还没有运行时启动,然后它将导入你的资源包供他们使用!

注意

您可以通过删除resource_packs文件夹中的副本(首先进行备份!),然后打开mcpack导入它来测试是否可行。 如果它不起作用,请确保在制作.mcpack zip压缩文档时选择了resource_pack的内容而不是文件夹本身。

注意2

如果您的行为包引用资源包,则mcpack也不会自动包含该资源包,即使您已将行为pack_manifest赋予该包的依赖性。如果您具有资源包依赖关系:也为资源包创建.mcpack,或创建一个世界并添加要导出的行为和资源包,然后导出该世界。导入该世界时,该世界的保存文件夹将包含该世界的behavior_packs和resource_packs的文件夹。您可以将这些包复制到本地文件夹,以便能够在行为和资源包菜单中看到它们并将它们添加到其他世界。