1. Wiki
  2. /物品
  3. /自定义食物

自定义食物

在 Minecraft 基岩版中做一个玩家可以吃的红宝石苹果:饥饿值、饱和度、进食时间和动画,再加上用小脚本实现的状态效果。

在这篇指南中,你将制作一个红宝石苹果:一种能填满一大截饥饿值条的零食,即使吃饱了也能吃,吃完还会获得短暂的速度加成。你将了解饥饿值和饱和度的原理,以及进食需要多长时间。

这篇指南建立在你的第一个自定义物品的基础上。如果你还没做过物品,请先从那里开始:图标、纹理和名称的步骤完全一样。

快捷方式:GodCraft

GodCraft 有一个食物对象,下面提到的所有内容都有对应的滑块,它还会帮你写好状态效果的脚本。

  1. 打开工坊,在你的附加包中添加一个食物。
  2. 在像素编辑器中画出图标。
  3. 设置饥饿值、饱和度以及你想要的状态效果。
  4. 点击导出,然后进游戏吃掉它。

想看看它生成了哪些文件?就在下面。

手动制作

我们使用命名空间 myname。请在所有地方把它换成你自己的。

第 1 步:食物物品

在你的行为包中创建这个文件:

BP/items/ruby_apple.json
{
  "format_version": "1.26.30",
  "minecraft:item": {
    "description": {
      "identifier": "myname:ruby_apple",
      "menu_category": {
        "category": "items"
      }
    },
    "components": {
      "minecraft:icon": {
        "textures": {
          "default": "myname_ruby_apple"
        }
      },
      "minecraft:display_name": {
        "value": "item.myname:ruby_apple.name"
      },
      "minecraft:max_stack_size": 16,
      "minecraft:food": {
        "nutrition": 6,
        "saturation_modifier": 0.8,
        "can_always_eat": true
      },
      "minecraft:use_modifiers": {
        "use_duration": 1.6,
        "movement_modifier": 0.35
      },
      "minecraft:use_animation": "eat",
      "minecraft:tags": {
        "tags": ["minecraft:is_food"]
      }
    }
  }
}

新的部分是最后四个组件。我们逐一来看。

食物组件

minecraft:food 让物品可以被吃掉。

  • nutrition 是它恢复的饥饿值点数。饥饿值条上的一个鸡腿是 2 点,所以 6 能填满三个鸡腿。原版苹果恢复 4 点,牛排恢复 8 点。
  • saturation_modifier 控制隐藏的“饱腹感”,它能让饥饿值条不那么快下降。游戏会增加 nutrition x saturation_modifier x 2 点饱和度。较低的数值(大约 0.1 到 0.3)感觉像零食,0.6 是普通水平,0.8 或更高就是一顿饱饭了。
  • can_always_eat 让玩家在饥饿值满的时候也能吃。普通食物不用写它(默认值是 false)。

还有一个你可能会喜欢的字段:using_converts_to。它会在玩家吃完后给予另一个物品,比如喝完汤后留下碗:

在 minecraft:food 内部
"using_converts_to": "minecraft:bowl"

进食需要多长时间

食物需要 minecraft:use_modifiers,否则玩家无法按住使用键来吃它。

  • use_duration 是进食时间,单位是秒。原版食物需要 1.6 秒,干海带大约只需要一半时间。
  • movement_modifier 会在进食时让玩家减速。0.35 是原版数值,1 表示完全不减速。

动画和标签

  • 把 minecraft:use_animation 设为 "eat",会显示咀嚼动画和食物碎屑粒子。如果是药水或奶昔之类的东西,就用 "drink"。
  • minecraft:tags 中的 minecraft:is_food 会把它标记为食物,和原版食物的标记方式一样。

第 2 步:纹理和名称

这些和第一篇指南中的做法完全一样。把纹理添加到你现有的 item_texture.json 中(放在 texture_data 里,和其他条目放在一起):

RP/textures/item_texture.json
"myname_ruby_apple": {
  "textures": "textures/items/ruby_apple"
}

把一张 16x16 的 PNG 保存到 RP/textures/items/ruby_apple.png,然后添加名称:

RP/texts/en_US.lang
item.myname:ruby_apple.name=Ruby Apple

现在执行 /give @s myname:ruby_apple,咬一口试试。如果需要复习,请看 /give。

添加食用后的状态效果

旧的附加包会在 minecraft:food 中用 effects 列表给食物添加状态效果。这个字段已经不再是当前物品格式的一部分了。 如果你把它加到使用新版 format_version 的文件中,游戏会忽略它,并在内容日志中显示警告。

现在的做法是使用自定义组件:你的物品写上一个由你自己发明的组件名,再由一个小脚本决定它做什么。听起来有点吓人,但其实只有大约 15 行。

第 1 步:给物品添加组件

把下面的内容加到 ruby_apple.json 的 components 中。名字由你自己决定,对象里放的是你自己的设置:

BP/items/ruby_apple.json(components 内部)
"myname:eat_effect": {
  "effect": "speed",
  "seconds": 10,
  "amplifier": 1
}

第 2 步:编写脚本

为此,你的行为包需要在清单文件中加入一个 script module。项目设置讲解了如何添加。然后创建脚本:

BP/scripts/main.js
import { system } from "@minecraft/server";

system.beforeEvents.startup.subscribe(({ itemComponentRegistry }) => {
  itemComponentRegistry.registerCustomComponent("myname:eat_effect", {
    onConsume(event, { params }) {
      event.source.addEffect(params.effect, params.seconds * 20, {
        amplifier: params.amplifier,
      });
    },
  });
});

它的工作原理:

  1. 世界启动时,脚本告诉游戏 myname:eat_effect 是什么意思。
  2. 每当玩家吃完一个带有该组件的物品时,onConsume 就会运行。
  3. params 就是你在物品文件中写的那个对象,所以你可以用这一个脚本给许多食物设置不同的效果。
  4. 脚本中的效果持续时间以刻为单位,1 秒等于 20 刻。这就是为什么 seconds 要乘以 20。
  5. amplifier 为 0 表示 I 级,1 表示 II 级,以此类推。

状态效果名称

使用和 /effect 命令相同的效果 ID,比如 speed、regeneration、night_vision、absorption 或 fire_resistance。

GodCraft 会帮你完成这一整部分:在食物编辑器中选择状态效果,导出时它就会自动添加组件和脚本。

平衡食物的小技巧

  • 向原版看齐。 零食的 nutrition 是 2 到 4,正餐是 6 到 8。数值过高会让其他所有食物都变得毫无意义。
  • 效果要有代价。 强力效果放在稀有食物上很有趣,但放在用泥土就能合成的食物上就不合适了。给它配一个难做的配方(参见工作台和熔炉配方)。
  • 让 can_always_eat 保持特别。 原版只把它用在金苹果之类的东西上,这样才有奖励的感觉。
  • 堆叠数量很重要。 较小的堆叠上限(16)让强力食物更难大量囤积。

出问题时

你看到的现象最可能的原因
完全吃不了缺少 minecraft:use_modifiers,或者 use_duration 为 0
能吃,但只有饿的时候才能吃这是正常的。添加 can_always_eat 即可改变
吃完没有效果清单文件中没有 script module,或者物品和脚本中的组件名不一致
出现关于 effects 的警告你用了旧字段:请改用上面的自定义组件

更多帮助请看故障排除。下一篇:武器和工具。

物品: 指南

We use cookies to improve your experience and analyse site traffic. Learn more