生成物品
在游戏中生成物品(如同自然掉落)是相当常见的需求。本文将介绍通过多种方法实现这一目标,包括实体死亡、交互行为以及通用方法。
/loot 命令
目前最简单的物品生成方式是使用 /loot 命令。格式如下:
/loot spawn ~ ~ ~ loot "entities/cow""minecraft:loot": {
"table": "loot_tables/entities/cow.json"
}实体死亡
另一种常见方法是通过实体死亡掉落物品。只需为实体添加 minecraft:loot 组件并关联对应的战利品表(如下例中的 forium),其中包含需要掉落的物品。
"minecraft:loot": {
"table": "loot_tables/entities/forium.json"
}虚拟实体死亡
我们可以在虚拟实体上使用 minecraft:loot 组件,通过召唤即死亡的特性创建 drop_entity。使用 /summon wiki:drop_entity 即可生成物品。此方法适用于不介意死亡粒子/音效的场景。
行为配置:
{
"format_version": "1.16.0",
"minecraft:entity": {
"description": {
"identifier": "wiki:drop_entity",
"is_spawnable": true,
"is_summonable": true,
"is_experimental": false
},
"components": {
// 使实体生成时立即死亡
"minecraft:health": {
"value": 0
},
"minecraft:loot": {
"table": "loot_tables/entities/some_loot.json"
}
}
}
}交互行为
以下是名为"box"的实体在交互时掉落物品的示例。spawn_items 中的战利品表关联了需要掉落的物品。此例中,交互时还会触发 break_box 事件来移除箱子组件。
注意:如果不移除实体,玩家可以重复交互获取物品。如需保留实体,可为交互添加冷却时间(cooldown参数),或通过事件移除包含交互组件的组件组。
"minecraft:interact": {
"interactions": [
{
"on_interact": {
"filters": {
"test": "is_family",
"subject": "other",
"value": "player"
},
"event": "break_box",
"target": "self"
},
"swing": true,
"spawn_items": {
"table": "loot_tables/entities/box.json"
}
}
]
}通用方法
此方法适用于几乎所有场景:实体死亡、基于动画的交互、常规物品掉落。特别适合需要静默掉落(无死亡动画/音效/粒子)的情况。
实现需要:新实体行为、动画控制器、隐形实体资源(参考虚拟实体教程)和战利品表。生成实体即可掉落物品,多个物品可通过组件组事件实现。
行为配置
使用 minecraft:behavior.drop_item_for 组件配合 minecraft:navigation.walk 组件实现(后者是前者的必要条件)。注意文档中未明示但必须设置的 time_of_day_range 参数。若玩家距离较远时仍需掉落,需增大 max_dist 值。
注意:此行为会使实体在掉落时后退,建议生成时略微抬高实体位置(或在动画控制器中传送),也可缩小碰撞箱避免物品偏移。
"minecraft:navigation.walk": {},
"minecraft:behavior.drop_item_for": {
"priority": 1,
"max_dist": 16,
"loot_table": "loot_tables/entities/forium.json",
"time_of_day_range": [0.0, 1.0]
}动画控制器
必须为实体关联此动画控制器以实现召唤后移除(也可使用时间轴动画)。通过传送到虚空实现无痕迹消失,双重过渡确保不会在生成同刻被清除。
{
"format_version": "1.10.0",
"animation_controllers": {
"controller.animation.drop_items.die": {
"initial_state": "spawn",
"states": {
"spawn": {
"transitions": [
{
"delay": "1"
}
]
},
"delay": {
"transitions": [
{
"die": "1"
}
]
},
"die": {
"on_entry": ["/tp @s ~ -200 ~"]
}
}
}
}
}结构方法
还有一种特殊方法——通过结构生成物品。用 structure_void 填充结构(避免加载时覆盖方块),将物品放入其中。此方法可保留物品数据(如耐久度),之后可随时在任何位置加载该结构。







