Skip to content

生成物品

本页面镜像自
BedrockWiki

根据原始项目协议授权。本文经过AI翻译处理,如有内容遗漏,可以提交PR进行补充。

在世界中生成物品(如同自然掉落)是常见的需求。本文将介绍多种实现方法,包括实体死亡、交互操作和通用方法。

/loot命令

目前最简单的方式是使用/loot命令。格式如下:

/loot spawn ~ ~ ~ loot "entities/cow"
json
"minecraft:loot": {
	"table": "loot_tables/entities/cow.json"
}

实体死亡

另一种常用方法是在实体死亡时掉落物品。通过为实体添加minecraft:loot组件并关联对应的战利品表(如下例中的forium表)实现。

json
"minecraft:loot": {
	"table": "loot_tables/entities/forium.json"
}

虚体死亡

我们可以为虚体添加minecraft:loot组件,在生成时立即死亡来创建drop_entity。通过/summon wiki:drop_entity即可生成物品,适用于不介意死亡粒子/音效的场景。

行为包配置:

json
{
	"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组件的组件组。

json
"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需根据需求调整。此方法可能导致实体位移,建议略微抬高生成位置或缩小碰撞箱。

json
"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]
}

动画控制器

必须为实体关联此动画控制器以实现自动移除。也可使用时间轴动画实现。通过传送实体至虚空避免死亡效果。双重状态过渡确保实体不在生成瞬间被移除。

json
{
	"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填充结构(避免加载时覆盖方块)并放入物品。此方法可保留物品数据(如耐久度),支持随时加载。