【1.19】addon自定义实体详细教程
简介
本教程将详细讲述Minecraftbe中自定义实体的制作(入门级),带你了解与解读各种文件
此教程非0基础,阅读此教程需了解addon基础知识。由于实体是个非常古老就出现的东西,本帖不会自造轮子,已有的内容会跳转至本站帖子
本教程参考文献:微软wiki,基岩wiki。
https://www.mcbbs.net/%3Cahttps://s2.loli.net/2023/01/16/HVWoMmf67nBrs2x.png
行为包行为包为服务端内容,定义着这个实体的存在以及它对世界的影响。
动画控制器播放命令与事件
状态机(State Machines)
https://www.mcbbs.net/static/image/hrline/4.gif
在动画控制器的学习之前,我们要了解一个概念---状态机(State Machines)。
它只有两个属性:
1.当前状态要做什么
2.如何移动到下一状态
状态机只能处于一种状态,当状态机运行时,你可以将它视为从一种状态移动到另一种状态,并执行此状态的内部逻辑,再遵循移动到其他状态。
状态机不仅是动画控制器其中的一种原理,也是编程开发中重要的原理,可以点击这里了解更多。
状态机示例
https://www.mcbbs.net/static/image/hrline/4.gif
例如,我们需要制作一个直升机螺旋桨的动画,目前有两种状态:
[*]ground state
[*]flying state
我们可以使用上述状态机的属性来注释这些状态:
[*]ground state
[*]不播放动画
[*]如果在空中,则移动为 flying state 状态
[*]flying state
[*]播放飞行动画
[*]如果在地面,则移动到 ground state 状态
我们可以用流程图来表示这个过程
https://s2.loli.net/2023/01/17/sx29S1O8dPRaETI.png
为了让动画更精致一点,我们也可以多加一个死亡爆炸状态:
https://s2.loli.net/2023/01/17/AoeJ3NyRbgDk5cX.png
动画控制器绑定
https://www.mcbbs.net/static/image/hrline/4.gif
动画控制器在运行前需先绑定至实体文件,在行为包中,我们绑定至entities文件夹下的实体文件,格式如下:
"minecraft:entity": {
"description": {
"identifier": "minecraft:player",
"is_spawnable": false,
"is_summonable": false,
"is_experimental": false,
"scripts":{
"animate":[
"xiaobo"
]
},
"animations":{
"xiaobo":"controller.animation.xiaobo"
}
},如上是我写的幸运方块的player.json的部分代码,意思是定义"controller.animation.xiaobo"它的短名称为"xiaobo",在脚本(scripts)中调用。
其中scripts与animations的用法与资源包的实体文件相同,这里不再赘述。
格式
https://www.mcbbs.net/static/image/hrline/4.gif
{
"format_version": "1.10.0",
"animation_controllers": {
"controller.animation.xiaobo": {
"initial_state": "状态1",//初始状态
"states": {//状态
"状态1": {//第一个状态
"on_entry": ["/say 6"],//进入状态执行逻辑(这里是指令)
"transitions": [//转移到下一个状态
{
"状态2": "!query.is_on_ground"//不在地面
}
],
"on_exit":["/say 拜拜"]//退出状态执行逻辑(这里是指令)
},
"状态2": {//第二个状态
"on_entry": ["/say 6"],//进入状态执行逻辑(这里是指令)
"transitions": [
{
"状态1": "query.is_on_ground"//在地面
}
],
"on_exit":["/say 拜拜"]//退出状态执行逻辑(这里是指令)
}
}
}
}
}
其中,on_entry/on_exit可为
[*]指令,如:/say 6
[*]事件,如:@s wiki:transform_into_plane
[*]molang表达式,如:variable.tickets += 1;
动画控制器示例
https://www.mcbbs.net/static/image/hrline/4.gif
{
"format_version": "1.10.0",
"animation_controllers": {
"controller.animation.helicopter.blade": {
"initial_state": "ground",//初始状态
"states": {//状态
"ground": {//第一个状态
"on_entry": ["/say I am now in the ground!"],//执行逻辑(这里是指令)
"transitions": [//转移到下一个状态
{
"flying": "!query.is_on_ground"//不在地面
}
]
},
"flying": {//第二个状态
"on_entry": ["/say I am now in the air!"],//执行逻辑(这里是指令)
"transitions": [
{
"ground": "query.is_on_ground"//在地面
}
]
}
}
}
}
}如上,是第一个流程图的代码化
{
"format_version": "1.10.0",
"animation_controllers": {
"controller.animation.helicopter.blade": {
"initial_state": "ground",
"states": {
"ground": {
"transitions": [
{
"flying": "!query.is_on_ground"
},
{
"explode": "!query.is_alive"
}
]
},
"flying": {
"animations": ["flying"],
"transitions": [
{
"ground": "query.is_on_ground"
},
{
"explode": "!query.is_alive"
}
]
},
"explode": {
"animations": ["explode"]
}
}
}
}
}如上,是第二个流程图的代码化
注意事项
https://www.mcbbs.net/static/image/hrline/4.gif
[*]当实体加载到世界中时,动画控制器将进入初始状态。如果未定义“initial_state”,则使用名为“default”的状态。如果缺少此项,将会报错。
[*]动画控制器在转换状态时,若有多个可转换状态,将优先进入第一个。
[*]动画控制器转换状态最短时间为1tick。
动画实体可通过此文件按时间顺序执行逻辑
格式
https://www.mcbbs.net/static/image/hrline/4.gif
{
"format_version": "1.8.0",
"animations": {
"animation.xiaobo": {
"loop": false,//动画播放完后是否返回t=0
"animation_length":2.55,//t=2.55动画完成,默认填最后一个关键帧时间
"timeline": {//时间线
"0.0":[...],
"1.5":[...],
"2.55":[...]
}
}
}
}在时间线中的格式为:“关键帧”:[逻辑数组]
其中逻辑数组对应动画控制器中的on_entry/on_exit,可填值为:
[*]指令,如:/say 6
[*]事件,如:@s wiki:transform_into_plane
[*]molang表达式,如:variable.tickets += 1;
实体
实体与先前版本没有过多变化,关于先前内容可以参考站内教程或我的视频教程,这里将提供1.16.1后的更新内容。
在这里会将一些已经翻译好的json文本提供给大家参考。
原版山羊
//翻译:哔哩哔哩 别揪小波的天线,若有不对,欢迎指出,记得三连!
//本json来自于 Minecraft 1.16.230.54Beta
{
"format_version": "1.16.0",//版本号1.16
"minecraft:entity": {//定义为实体
"description": {//对该实体的描述
"identifier": "minecraft:goat",//实体ID
"is_spawnable": true,//拥有刷怪蛋
"is_summonable": true,//可以指令生成
"is_experimental": false//不是实验性玩法
},
"component_groups": {//组件组
"minecraft:goat_baby": {//组件组名字
"minecraft:is_baby": {//幼儿状态
},
"minecraft:scale": {//缩小0.5倍
"value": 0.5
},
"minecraft:ageable": {//成长计时器//
"duration": 1200,//需要1200秒长大
"feed_items": "wheat",//通过小麦加速
"grow_up": {//成长一瞬间执行
"event": "minecraft:ageable_grow_up",//执行此事件
"target": "self"//自己执行
}
},
"minecraft:behavior.follow_parent": {//允许生物跟随在其父母周围
"priority": 6,//权重
"speed_multiplier": 1.0//跟随时速度乘数
},
"minecraft:behavior.ram_attack": {//可对生物冲撞//
"priority": 5,//权重
"run_speed": 0.7,//跑步速度乘数
"ram_speed": 1.8,//冲撞速度乘数
"ram_distance": 9.0,//冲撞距离9格
"knockback_force": 2.5,//击退2.5格
"knockback_height": 0.04,//击退0.04格高
"on_start": [//冲撞时执行
{
"event": "start_event",//冲撞时执行此事件
"target": "self"//自己执行
}
]
},
"minecraft:behavior.jump_to_block": {//允许跳跃方块//
"priority": 8,//权重
"search_width": 7,//跳跃宽度
"search_height": 9,//跳跃高度
"minimum_path_length": 7,//跳跃最小高度7格
"minimum_distance": 1,//跳跃最小距离1格
"scale_factor": 0.6,//跳跃因素??
"cooldown_range": [ 5.0, 10.0 ]//跳跃冷却5到10秒
}
},
"minecraft:goat_adult": {//组件组名字
"minecraft:experience_reward": {//掉落经验
"on_bred": "Math.Random(1,7)",//繁殖随机掉落1到7经验
"on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0"//被玩家或狼杀死掉落1到3经验
},
"minecraft:loot": {//控制掉落物
"table": "loot_tables/entities/goat.json"//掉落物json文件
},
"minecraft:behavior.breed": {//允许繁殖
"priority": 3,//权重
"speed_multiplier": 0.6//繁殖时速度乘数
},
"minecraft:breedable": {//允许与其他生物繁殖
"require_tame": false,//无需繁殖前被驯服
"breed_items": "wheat",//通过小麦进入繁殖
"breeds_with": {//可以繁殖对象
"mate_type": "minecraft:goat",//配偶ID
"baby_type": "minecraft:goat",//子代ID
"breed_event": {//执行事件
"event": "minecraft:entity_born",//执行此事件
"target": "baby"//幼崽执行
}
}
},
"minecraft:behavior._attack": {//可对生物冲撞//
"priority": 5,//权重
"run_speed": 0.7,//跑步速度乘数
"ram_speed": 1.8,//冲撞速度乘数
"ram_distance": 9.0,//冲撞距离9格
"knockback_force": 5.0,//击退5格
"knockback_height": 0.03,//击退0.03格高
"on_start": [//冲撞时执行
{
"event": "start_event",//冲撞时执行此事件
"target": "self"//自己执行
}
]
},
"minecraft:behavior.jump_to_block": {//允许跳跃方块//
"priority": 8,//权重
"search_width": 8,//跳跃宽度
"search_height": 10,//跳跃高度
"minimum_path_length": 7,//跳跃最小高度7格
"minimum_distance": 1,//跳跃最小距离1格
"scale_factor": 0.6,//跳跃因素??
"cooldown_range": [ 5.0, 10.0 ]//跳跃冷却5到10秒
},
"minecraft:interact": {//玩家与实体交互行为
"interactions": [//交互行为包括
{
"on_interact": {//交互时触发
"filters": {//过滤器
"all_of": [//以下两个条件都满足可触发
{
"test": "is_family",
"subject": "other",
"value": "player"//是玩家
},
{
"test": "has_equipment",
"domain": "hand",
"subject": "other",
"value": "bucket:0"//手持空桶
}
]
}
},
"use_item": true,//需要使用空桶(被游戏回收)
"transform_to_item": "bucket:1",//给予牛奶
"play_sounds": "milk",//播放音效
"interact_text": "action.interact.milk"//显示文本
}
]
}
},
"attack_cooldown": {//组件组名字
"minecraft:attack_cooldown": {//定义攻击冷却//
"attack_cooldown_time": [ 30.0, 40.0 ],//冷却30到40秒
"attack_cooldown_complete_event": {//冷却事件
"event": "attack_cooldown_complete_event",//冷却此事件
"target": "self"//自己执行
}
}
}
},
"components": {//组件
"minecraft:type_family": {//定义分类
"family": [ "goat", "animal" ]//与动物同一类
},
"minecraft:breathable": {//定义该实体能够在其中呼吸/窒息的方块
"total_supply": 15,//可屏住呼吸15秒
"suffocate_time": 0//受到窒息伤害间隔秒数
},
"minecraft:navigation.walk": {//使实体规划的路径能在地面上跳跃或走下方块
"can_path_over_water": true,//规划路线可以通过水路
"avoid_water": true,//规划路线可以避开水
"avoid_damage_blocks": true,//不可破坏方块
"blocks_to_avoid": [//要避开的方块
{
"name": "minecraft:powder_snow"//避开细雪//
}
]
},
"minecraft:movement.basic": {//可以走路
},
"minecraft:jump.static": {//可以跳
},
"minecraft:can_climb": {//可以爬
},
"minecraft:attack": {//可以攻击
"damage": 1//攻击1生命值
},
"minecraft:collision_box": {//碰撞箱
"width": 0.9,//长宽0.9
"height": 1.3//高1.3
},
"minecraft:nameable": {//可以被命名
},
"minecraft:health": {//生命值
"value": 10,//默认生命值
"max": 10//最高生命值
},
"minecraft:hurt_on_condition": {//定义受伤情况
"damage_conditions": [//情况包括
{
"filters": {//过滤器
"test": "in_lava",
"subject": "self",
"operator": "==",
"value": true//在岩浆里
},
"cause": "lava",//因岩浆受伤
"damage_per_tick": 4//受4生命值伤害
}
]
},
"minecraft:movement": {//可移动
"value": 0.4//速度0.4格每秒
},
"minecraft:despawn": {//不可重生
"despawn_from_distance": {}
},
"minecraft:behavior.float": {//能够浮在水面上
"priority": 0//权重
},
"minecraft:behavior.panic": {//处于恐慌状态
"priority": 1,//权重
"speed_multiplier": 1.0//增加1.0倍移动速度
},
"minecraft:behavior.tempt": {//被食物诱惑
"priority": 4,//权重
"speed_multiplier": 1.0,//被诱惑时增加1倍速度
"items": [//被诱惑的物品
"wheat"//小麦
]
},
"minecraft:behavior.nearest_attackable_target": {//允许生物寻找并追赶攻击距离最近的有效目标//
"priority": 6,//权重
"within_radius": 16.0,//可对16格内生物发动攻击
"entity_types": [//攻击的生物
{
"filters": {//过滤器
"all_of": [
{
"test": "is_family",
"subject": "other",
"operator": "!=",
"value": "goat"//不是山羊
},
{
"test": "is_family",
"subject": "other",
"operator": "!=",
"value": "armor_stand"//不是盔甲架
},
{
"test": "has_component",
"subject": "self",
"operator": "!=",
"value": "minecraft:attack_cooldown"//不拥有此组件
}
]
},
"max_dist": 16//可对此生物攻击最大距离
}
],
"must_see": true//需要看见此生物
},
"minecraft:damage_sensor": {//受伤害传感器//
"triggers": {//触发器
"cause": "fall",//摔落伤害
"deals_damage": true,//会受到摔落时的伤害
"damage_modifier": -20.0//减少20受到的此伤害
}
},
"minecraft:behavior.random_stroll": {//允许生物四处闲逛
"priority": 9,//权重
"speed_multiplier": 0.6//速度乘数
},
"minecraft:behavior.look_at_player": {//允许生物附近有玩家时看着玩家
"priority": 10,//权重
"look_distance": 6.0,// 生物会看着8格内玩家
"probability": 0.02//看向玩家有2%机率
},
"minecraft:behavior.random_look_around": {//允许生物四处乱看
"priority": 11//权重
},
"minecraft:leashable": {//生物可以被栓绳拴住
"soft_distance": 4.0,//栓绳开始有弹性的距离,从这个4格开始该实体会跟着拴着它的实体移动
"hard_distance": 6.0,//栓绳开始变硬的距离,该实体的运动范围会被限制在6格之内
"max_distance": 10.0//栓绳在10格断开
},
"minecraft:physics": {//该生物有物理性质
},
"minecraft:pushable": {//是否可以被推动
"is_pushable": true,//可以被推动
"is_pushable_by_piston": true//可以被活塞推动
}
},
"events": {//事件
"minecraft:entity_spawned": {//事件名:自然生成事件
"randomize": [//随机生成//
{
"weight": 95,
"add": {
"component_groups": [
"minecraft:goat_adult"//事件执行此组件组(95%生成成年山羊)
]
}
},
{
"weight": 5,
"add": {
"component_groups": [
"minecraft:goat_baby"//事件执行此组件组(5%生成小山羊)
]
}
}
]
},
"minecraft:entity_born": {//事件名:繁殖出生事件
"add": {
"component_groups": [
"minecraft:goat_baby"//事件执行此组件组
]
}
},
"minecraft:entity_transformed": {//事件名:实体转换事件
"remove": {
},//无删除组件组
"add": {
"component_groups": [
"minecraft:goat_adult"//增加此组件组(转换为成年山羊)
]
}
},
"minecraft:ageable_grow_up": {//事件名:长大事件
"remove": {
"component_groups": [
"minecraft:goat_baby"//删除此组件组
]
},
"add": {
"component_groups": [
"minecraft:goat_adult"//添加此组件组
]
}
},
"start_event": {//事件名:攻击开始事件
"add": {
"component_groups": [
"attack_cooldown"//添加此组件组
]
}
},
"attack_cooldown_complete_event": {//事件名:攻击冷却完成事件
"remove": {
"component_groups": [
"attack_cooldown"//删除此组件组
]
}
}
}
}
}原版玩家//by bilibili 别揪小波的天线
{
"format_version": "1.17.10",//模块版本
"minecraft:entity": {//定义是一个实体
"description": {//对实体的描述
"identifier": "minecraft:player",//实体ID
"is_spawnable": false,//是否可以通过生成蛋生成
"is_summonable": false,//是否可以自然生成
"is_experimental": false//是否为实验性玩法
},
"component_groups": {//组件组
"minecraft:add_bad_omen": {//组件组名字
"minecraft:spell_effects": {//可以为实体增加或删除状态效果
"add_effects": [//增加效果
{
"effect": "bad_omen",//不祥之兆
"duration": 6000,//时间
"display_on_screen_animation": true//是否使用屏幕动画
}
]
},
"minecraft:timer": {//添加一个计时器,在计时结束后触发事件
"time": [ 0.0, 0.0 ],//计时器时间,此处为瞬间触发
"looping": false,//如果该项为true,计时器将在计时结束后重新启动
"time_down_event": {//计时结束触发事件
"event": "minecraft:clear_add_bad_omen",//事件名
"target": "self"//自身触发
}
}
},
"minecraft:clear_bad_omen_spell_effect": {//组件组名字
"minecraft:spell_effects": {//默认清空效果
}
},
"minecraft:raid_trigger": {
"minecraft:raid_trigger": {//试图在实体位置触发袭击
"triggered_event": {//运行事件并触发袭击
"event": "minecraft:remove_raid_trigger",
"target": "self"
}
},
"minecraft:spell_effects": {//添加或移除效果
"remove_effects": "bad_omen"//移除不祥之兆
}
}
},
"components": {
"minecraft:experience_reward": {//掉落经验
"on_death": "Math.Min(query.player_level * 7, 100)"//死亡掉落经验
},
"minecraft:type_family": {//家族
"family": [ "player" ]
},
"minecraft:is_hidden_when_invisible": {//隐身时怪物看不见
},
"minecraft:loot": {//设置掉落物
"table": "loot_tables/empty.json"
},
"minecraft:collision_box": {//碰撞箱
"width": 0.6,
"height": 1.8
},
"minecraft:can_climb": {//可以攀爬
},
"minecraft:movement": {//移动速度
"value": 0.1
},
"minecraft:hurt_on_condition": {//伤害控制器
"damage_conditions": [//过滤器
{
"filters": { "test": "in_lava", "subject": "self", "operator": "==", "value": true },
"cause": "lava",
"damage_per_tick": 4
}//在岩浆中每游戏刻造成4点伤害
]
},
"minecraft:attack": {//攻击力
"damage": 1
},
"minecraft:player.saturation": {//定义饱和度
"value": 20
},
"minecraft:player.exhaustion": {//定义玩家疲惫状态
"value": 0,
"max": 4
},
"minecraft:player.level": {//玩家等级
"value": 0,
"max": 24791
},
"minecraft:player.experience": {//玩家经验
"value": 0,
"max": 1
},
"minecraft:breathable": {//定义该实体能够在其中呼吸/窒息的方块
"total_supply": 15,//实体能屏住呼吸的秒数,默认为15
"suffocate_time": -1,//在窒息伤害之间的秒数,默认为-20
"inhale_time": 3.75,//该实体回复满呼吸值所需秒数,默认为0.0
"generates_bubbles": false//如果为 true,该实体在水中时将会产生气泡,默认为 true。
},
"minecraft:nameable": {//允许该实体被命名
"always_show": true,//如果为 true,该实体会一直显示着名称,默认 false。
"allow_name_tag_renaming": false//如果为 true,该实体可以被命名牌命名,默认 true。
},
"minecraft:physics": {//具有物理特性
},
"minecraft:pushable": {//定义被推动
"is_pushable": false,//是否可以被其他实体推动
"is_pushable_by_piston": true//是否可以被活塞推动
},
"minecraft:insomnia": {//幻翼生成器
"days_until_insomnia": 3//三天不睡生成
},
"minecraft:rideable": {//定义可以被乘骑
"seat_count": 2,//能同时骑乘该实体的最大实体数目,默认为1
"family_types": [//能乘骑该实体的家族
"parrot_tame"//鹦鹉
],
"pull_in_entities": true,//如果为 true,该实体会将符合条件的实体拉入任一可用的座位,默认为 false
"seats": [//座位列表
{
"position": [ 0.4, -0.2, -0.1 ],//座位相对于该实体位置的位置,默认
"min_rider_count": 0,//当骑乘该实体的实体数量大于此值时,该座位才可用,默认为 0
"max_rider_count": 0,//当骑乘该实体的实体数量小于此值时,该座位才可用,默认为 0
"lock_rider_rotation": 0//骑乘该实体时乘客所能转向的角度限制,如不指定则无限制,默认为 181.0
},
{//同上
"position": [ -0.4, -0.2, -0.1 ],
"min_rider_count": 1,
"max_rider_count": 2,
"lock_rider_rotation": 0
}
]
},
"minecraft:conditional_bandwidth_optimization": {//加载世界
},
"minecraft:block_climber": {},//允许玩家在脚手架上进行探测和操作
"minecraft:environment_sensor": {//根据过滤器触发事件
"triggers": {
"filters": {//同时满足在村庄以及拥有不祥之兆的效果
"all_of": [
{
"test": "has_mob_effect",
"subject": "self",
"value": "bad_omen"
},
{
"test": "is_in_village",
"subject": "self",
"value": true
}
]
},
"event": "minecraft:trigger_raid"//触发此事件
}
}
},
"events": {//事件
"minecraft:gain_bad_omen": {//事件名
"add": {//添加组件组
"component_groups": [
"minecraft:add_bad_omen"
]
}
},
"minecraft:clear_add_bad_omen": {//事件名
"remove": {//移除组件组
"component_groups": [
"minecraft:add_bad_omen"
]
},
"add": {//添加组件组
"component_groups": [
"minecraft:clear_bad_omen_spell_effect"
]
}
},
"minecraft:trigger_raid": {//事件名
"add": {//添加组件组
"component_groups": [ "minecraft:raid_trigger" ]
}
},
"minecraft:remove_raid_trigger": {//事件名
"remove": {//移除组件组
"component_groups": [ "minecraft:raid_trigger" ]
}
}
}
}
}
原版僵尸(网友提供)
/*
注意事项
此代码根据docs.microsoft.com的内容而注释,在翻译过程中
可能造成一些失误导致的个别字符被意外删去,如发现错误请及
时修改
原版僵尸行为包文档
https://docs.microsoft.com/en-us/minecraft/creator/reference/source/vanillabehaviorpack_snippets/entities/zombie
个别隐晦难懂的注释,可能由于文档本身原因或翻译问题
查看原版组件信息,请访问docs.microsoft.com*/
{
"format_version": "1.16.0",
"minecraft:entity": {
"description": {
"identifier": "minecraft:zombie",
"is_spawnable": true,//拥有刷怪蛋
"is_summonable": true,//可以指令生成
"is_experimental": false//不是实验玩法
},
"component_groups": {//组件组
"minecraft:look_to_start_drowned_transformation": {//变异1 组件组名字
"minecraft:environment_sensor": {//根据环境条件创建触发器
"triggers": {//list 当环境条件与给定筛选条件匹配时触发的触发器列表
"filters": {//列表/过滤器,此触发器要执行的条件列表
"test": "is_underwater", "subject": "self", "operator": "==", "value": true//如果在水中
},
"event": "minecraft:start_transforming"//满足此触发器的条件是要运行的事件,意思应该是变异,在水下变成溺尸(开始变异)
}
}
},
"minecraft:start_drowned_transformation": {//变异2
"minecraft:environment_sensor": {
"triggers": {
"filters": {
"test": "is_underwater", "subject": "self", "operator": "==", "value": false//如果不在水中
},
"event": "minecraft:stop_transforming"//停止变异
}
},
"minecraft:timer": {//添加一个计时器,在此计时器之后将触发事件
"looping": false,//布尔值如果为 true,则计时器每次触发后都会重新启动
"time": 30,//范围 计时器的时间量(以秒为单位)。可以指定为一个数字或一对数字(最小值和最大值)。与random_time_choices不兼容
"time_down_event": {//包含计时器上的时间用完时要触发的任何事件。
"event": "minecraft:convert_to_drowned"
}
}
},
"minecraft:convert_to_drowned": {
"minecraft:transformation": {
"into": "minecraft:drowned<minecraft:as_adult>",//此实体将转换为的实体定义,变异成大溺尸
"transformation_sound": "convert_to_drowned",//变异声音
"drop_equipment": true,//布尔值,掉落所有的装备
"delay": {//定义转换延迟的属性
"value": 15
}
},
"minecraft:is_shaking": {//当前物体正在晃动,就是僵尸变异的时候
}
},
"minecraft:convert_to_baby_drowned": {//婴儿僵尸变异
"minecraft:transformation": {
"into": "minecraft:drowned<minecraft:as_baby>",//变异成小溺尸
"transformation_sound": "convert_to_drowned",
"drop_equipment": true,
"delay": {
"value": 15
}
},
"minecraft:is_shaking": {
}
},
"minecraft:zombie_baby": {//小僵尸
"minecraft:experience_reward": {//一个 Molang 表达式,定义了当该实体死亡时奖励的经验量。表达式数组将每个表达式的结果相加,得出最终的总计
"on_death": "query.last_hit_by_player ? 12 + (query.equipment_count * Math.Random(1,3)) : 0"//一个?:符号
},
"minecraft:is_baby": {},//设置实体是个婴儿
"minecraft:scale": {//通过缩放模型大小来设置实体的可视大小
"value": 0.5//一半大
},
"minecraft:movement": {
"value": 0.35//移动速度
}
},
"minecraft:zombie_adult": {//大僵尸
"minecraft:experience_reward": {
"on_death": "query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0"
},
"minecraft:movement": {
"value": 0.23
},
"minecraft:rideable": {//确定是否可以骑乘此实体。允许指定不同的座椅位置和数量
"seat_count": 1,//可以同时乘坐此实体的实体数
"family_types": [//可以乘坐此实体的实体列表
"zombie"
],
"seats": {//seats是由五个参数定义的列表。每个项目都具有以下属性
"position": [ 0.0, 1.1, -0.35 ],//向量 此席位相对于该实体的位置
"lock_rider_rotation": 0//骑乘此实体时允许骑手旋转的角度(以度为单位)。省略此属性没有限制
}
},
"minecraft:behavior.mount_pathing": {//允许实体在装载时自行移动。 还将允许一个实体针对另一个实体进行攻击
"priority": 2,//优先级
"speed_multiplier": 1.25,//使用此AI目标时生物的移动速度倍增器
"target_dist": 0.0,//这群生物想要远离目标的距离
"track_target": true//布尔 如果这是真的,这个生物就会追逐目标,只要它是一个有效的目标
}
},
"minecraft:zombie_jockey": {//盲猜僵尸骑士
"minecraft:behavior.find_mount": {//允许一个实体查找另一个要装载的实体
"priority": 1,//优先级
"within_radius": 16,//以方块为单位的距离,生物将在其中寻找坐骑
"start_delay": 15,//生物在开始向坐骑移动之前等待的时间
"max_failed_attempts": 20//最大失败尝试次数
}
},
"minecraft:can_have_equipment": {//允许拥有装备
"minecraft:equipment": {//装备路径
"table": "loot_tables/entities/zombie_equipment.json"
}
}
},//组件组末尾
"components": {//组件
"minecraft:is_hidden_when_invisible": {//设置实体可以在不可见时躲避敌对生物
},
"minecraft:nameable": {//可命名
},
// 僵尸组件
"minecraft:type_family": {//定义此实体所属的族
"family": [ "zombie", "undead", "monster", "mob" ]
},
"minecraft:equip_item": {//允许实体装备所需的设备
},
"minecraft:collision_box": {//碰撞箱
"width": 0.6,//
"height": 1.9//
},
"minecraft:burns_in_daylight": {//允许实体在日照时燃烧
},
"minecraft:movement.basic": {//定义实体的移动
},
"minecraft:navigation.walk": {//允许这个实体通过像普通生物一样四处走动和在街区上跳来跳来生成路径
"is_amphibious": true,//布尔 告诉探路者是否可以在水下的地面上行走
"can_pass_doors": true,//布尔 是否可以通过门创建路径
"can_walk": true,//布尔 告诉探路者是否可以在水外的地面上行走
"can_break_doors": true//布尔 告诉探路者它可以穿过一扇紧闭的门并打破它
},
"minecraft:annotation.break_door": {//允许实体打破门,假设为组件设置了用于导航的标志 要求实体的导航组件将参数设置为 。can_break_doorstrue
},
"minecraft:jump.static": {//赋予实体跳跃的能力
},
"minecraft:can_climb": {//允许实体爬梯子
},
"minecraft:health": {//生命值
"value": 20,//生命值
"max": 20//最大值
},
"minecraft:hurt_on_condition": {//定义了实体应承受损害的一组条件
"damage_conditions": [//满足时可能对实体造成损害的损坏条件的列表
{
"filters": { "test": "in_lava", "subject": "self", "operator": "==", "value": true },//我的世界过滤器 用于测试的过滤器
"cause": "lava",//字符串 对实体造成的损害类型。各种盔甲和法术都用它来判断该实体是否免疫
"damage_per_tick": 4//整数 每个满足条件的刻度所造成的损害量
}
]
},
"minecraft:breathable": {//定义了实体可以吸入的障碍,并赋予它们窒息的能力
"total_supply": 15,//整数 以秒为单位的时间,实体可以屏住呼吸
"suffocate_time": 0,//整数 窒息损伤之间的时间(以秒为单位)
"breathes_air": true,//布尔 如果为真,这个实体可以呼吸空气
"breathes_water": true//布尔 如果这是真的,这个实体可以吸入水
},
"minecraft:attack": {//允许实体定义实体的近战攻击以及对其攻击的任何其他影响
"damage": 3//范围 近战攻击造成的随机伤害范围。负值可以治愈实体,而不是伤害它
},
"minecraft:loot": {//战利品
"table": "loot_tables/entities/zombie.json"
},
"minecraft:shareables": {//定义了生物想要共享或拾取的项目列表
"items": [
{
"item": "minecraft:netherite_sword",//下界合金剑
"want_amount": 1,//几个
"surplus_amount": 1,//不管他,盈余数量
"priority": 0//优先级
},
{
"item": "minecraft:diamond_sword",//钻石剑
"want_amount": 1,
"surplus_amount": 1,
"priority": 1
},
{
"item": "minecraft:iron_sword",//铁剑
"want_amount": 1,
"surplus_amount": 1,
"priority": 2
},
{
"item": "minecraft:stone_sword",//石剑
"want_amount": 1,
"surplus_amount": 1,
"priority": 3
},
{
"item": "minecraft:golden_sword",//金剑
"want_amount": 1,
"surplus_amount": 1,
"priority": 4
},
{
"item": "minecraft:wooden_sword",//木剑
"want_amount": 1,
"surplus_amount": 1,
"priority": 5
},
{
"item": "minecraft:netherite_helmet",//下界合金帽
"want_amount": 1,
"surplus_amount": 1,
"priority": 0
},
{
"item": "minecraft:diamond_helmet",//钻石帽
"want_amount": 1,
"surplus_amount": 1,
"priority": 1
},
{
"item": "minecraft:iron_helmet",//铁帽
"want_amount": 1,
"surplus_amount": 1,
"priority": 2
},
{
"item": "minecraft:chainmail_helmet",//锁链帽
"want_amount": 1,
"surplus_amount": 1,
"priority": 3
},
{
"item": "minecraft:golden_helmet",//金帽
"want_amount": 1,
"surplus_amount": 1,
"priority": 4
},
{
"item": "minecraft:leather_helmet",//皮帽
"want_amount": 1,
"surplus_amount": 1,
"priority": 5
},
{
"item": "minecraft:turtle_helmet",//海龟帽
"want_amount": 1,
"surplus_amount": 1,
"priority":6
},
{
"item": "minecraft:skull:0",//头颅0
"want_amount": 1,
"surplus_amount": 1,
"priority": 7
},
{
"item": "minecraft:skull:1",//头颅1
"want_amount": 1,
"surplus_amount": 1,
"priority": 7
},
{
"item": "minecraft:carved_pumpkin",//南瓜头
"want_amount": 1,
"surplus_amount": 1,
"priority": 7
},
{
"item": "minecraft:netherite_chestplate",//下界合金甲
"want_amount": 1,
"surplus_amount": 1,
"priority": 0
},
{
"item": "minecraft:diamond_chestplate",//钻石甲
"want_amount": 1,
"surplus_amount": 1,
"priority": 1
},
{
"item": "minecraft:iron_chestplate",//铁甲
"want_amount": 1,
"surplus_amount": 1,
"priority": 2
},
{
"item": "minecraft:chainmail_chestplate",//锁链甲
"want_amount": 1,
"surplus_amount": 1,
"priority": 3
},
{
"item": "minecraft:golden_chestplate",//金甲
"want_amount": 1,
"surplus_amount": 1,
"priority": 4
},
{
"item": "minecraft:leather_chestplate",//皮甲
"want_amount": 1,
"surplus_amount": 1,
"priority": 5
},
{
"item": "minecraft:netherite_leggings",//下界合金裤子
"want_amount": 1,
"surplus_amount": 1,
"priority": 0
},
{
"item": "minecraft:diamond_leggings",//钻石裤子
"want_amount": 1,
"surplus_amount": 1,
"priority": 1
},
{
"item": "minecraft:iron_leggings",//铁裤子
"want_amount": 1,
"surplus_amount": 1,
"priority": 2
},
{
"item": "minecraft:chainmail_leggings",//锁链裤子
"want_amount": 1,
"surplus_amount": 1,
"priority": 3
},
{
"item": "minecraft:golden_leggings",//金裤子
"want_amount": 1,
"surplus_amount": 1,
"priority": 4
},
{
"item": "minecraft:leather_leggings",//皮裤子
"want_amount": 1,
"surplus_amount": 1,
"priority": 5
},
{
"item": "minecraft:netherite_boots",//下界合金鞋子
"want_amount": 1,
"surplus_amount": 1,
"priority": 0
},
{
"item": "minecraft:diamond_boots",//钻石鞋子
"want_amount": 1,
"surplus_amount": 1,
"priority": 1
},
{
"item": "minecraft:iron_boots",//铁鞋子
"want_amount": 1,
"surplus_amount": 1,
"priority": 2
},
{
"item": "minecraft:chainmail_boots",//锁链鞋子
"want_amount": 1,
"surplus_amount": 1,
"priority": 3
},
{
"item": "minecraft:golden_boots",//金鞋子
"want_amount": 1,
"surplus_amount": 1,
"priority": 4
},
{
"item": "minecraft:leather_boots",//皮鞋子
"want_amount": 1,
"surplus_amount": 1,
"priority": 5
}
]
},
"minecraft:environment_sensor": {//根据环境条件创建触发器
"triggers": {
"filters": {
"test": "is_underwater",//水下
"operator": "==",
"value": true
},
"event": "minecraft:start_transforming"//开始变异
}
},
"minecraft:despawn": {//当取消生成规则或可选筛选器的计算结果为 true 时,允许实体重新生成
"despawn_from_distance": {}//指定是否在标准min_distance规则中使用“min_distance”和“max_distance”
},
//僵尸行为包
"minecraft:behavior.equip_item": {//使实体装备物品
"priority": 2//优先级
},
"minecraft:behavior.melee_attack": {//允许实体进行近战近战攻击
"priority": 3//优先级
},
"minecraft:behavior.stomp_turtle_egg": {//允许实体在检测到时瞄准并踩踏海龟蛋
"priority": 4,//优先级
"speed_multiplier": 1,//使用此AI目标时生物的移动速度倍增器
"search_range": 10,//以方块为单位的距离,它将寻找海龟蛋移动
"search_height": 2,//以方块为单位的高度,生物将寻找海龟蛋来移动
"goal_radius": 1.14,//生物内部的方块距离认为它已经达到了目标。这是“回旋室”,用于阻止AI来回反弹试图到达特定位置
"interval": 20//整数 一个随机值,用于确定何时随机移动到某个位置。这有1个/间隔的机会来选择这个目标
},
"minecraft:behavior.pickup_items": {//允许实体从地面上拾取选定的物品
"priority": 6,//优先级
"max_dist": 3,//十进制 这个生物将寻找物品捡起的最大距离
"goal_radius": 2,//十进制 生物内部的方块距离认为它已经达到了目标。这是“回旋室”,用于阻止AI来回反弹试图到达特定位置
"speed_multiplier": 1.0,//十进制 使用此AI目标时生物的移动速度倍增器
"pickup_based_on_chance": true,//布尔 如果为真,根据难度的不同,生物可能无法捡起物品
"can_pickup_any_item": true//布尔 如果这是真的,暴徒可以捡起任何物品
},
"minecraft:behavior.random_stroll": {//允许实体选择随机方向前进
"priority": 7,//优先级
"speed_multiplier": 1//十进制 使用此AI目标时生物的移动速度倍增器
},
"minecraft:behavior.look_at_player": {//允许实体通过在设定的限制内旋转头骨姿势来观察玩家
"priority": 8,//优先级
"look_distance": 6,//十进制 实体将查看的块的距离
"probability": 0.02//十进制 查看目标的概率。值为 1.00 表示 100%
},
"minecraft:behavior.random_look_around": {//允许实体选择一个随机方向,以便在一个范围内的随机持续时间内进行查找
"priority": 9//优先级
},
"minecraft:behavior.hurt_by_target": {//允许实体在被设定目标击中时做出反应
"priority": 1//优先级
},
"minecraft:behavior.nearest_attackable_target": {//允许实体攻击特定目标类型的给定子集中最近的目标
"priority": 2,//优先级
"must_see": true,//布尔值 确定目标有效性是否要求此实体仅在范围内,或既在范围内又在视线范围内
"reselect_targets": true,//布尔值 允许攻击实体更新最近的目标,否则仅在每个“scan_interval”或“attack_interval”之后重新选择一个目标
"within_radius": 25.0,//十进制 此实体跟随它时可以与目标的最大距离,否则目标无效。该值仅在实体未声明“minecraft:follow_range”时使用
"must_see_forget_duration": 17.0,//十进制 该实体不能看到目标的时间(以秒为单位)变为无效。仅在“must_see”为真时使用
"entity_types": [//实体类型
{
"filters": {//过滤器
"any_of": [//任意一个
{ "test": "is_family", "subject": "other", "value": "player" },//玩家
{ "test": "is_family", "subject": "other", "value": "snowgolem" },//雪傀儡
{ "test": "is_family", "subject": "other", "value": "irongolem" }//铁傀儡
]
},
"max_dist": 35//??
},
{
"filters": {
"any_of": [
{ "test": "is_family", "subject": "other", "value": "villager" },//村民
{ "test": "is_family", "subject": "other", "value": "wandering_trader" }//流浪商人
]
},
"max_dist": 35,//
"must_see": false//必须看,布尔值
},
{
"filters": {//
"all_of": [//
{ "test": "is_family", "subject": "other", "value": "baby_turtle" },//小乌龟
{ "test": "in_water", "subject": "other", "operator": "!=", "value": true }
]
},
"max_dist": 35//
}
]
},
"minecraft:physics": {//定义实体的物理属性,包括它是否受重力影响或是否与物体碰撞
},
"minecraft:pushable": {//定义什么可以在其他实体和活塞之间推动实体
"is_pushable": true,//布尔 该实体是否可以由其他实体推送
"is_pushable_by_piston": true//布尔 实体是否可以安全地被活塞推动
},
"minecraft:conditional_bandwidth_optimization": {//定义此实体的条件空间更新带宽优化,也不太清楚什么意思
}
},
"events": {//事件
"minecraft:entity_spawned": {//当实体在场景中生成时,触发对实体的事件调用
"randomize": [//初始化随机数发生器,??也不太懂,这是直接翻译的,就不管他了
{
"weight": 380,//权重
"remove": {},//删除 还是??
"add": {//添加
"component_groups": [//组件组
"minecraft:zombie_adult",//在上面定义了 78行
"minecraft:can_have_equipment"//在上面定义了 111行
]
}
},
{
"weight": 17,//权重
"remove": {
},
"add": {//
"component_groups": [//组件组,上面自己翻
"minecraft:zombie_baby",
"minecraft:can_have_equipment"
]
}
},
{
"weight": 3,
"remove": {
},
"add": {
"component_groups": [//组件组
"minecraft:zombie_baby",
"minecraft:zombie_jockey",
"minecraft:can_have_equipment"
]
}
}
]
},
"minecraft:as_adult": {//作为大僵尸时
"add": {
"component_groups": [//组件组
"minecraft:zombie_adult"
]
}
},
"minecraft:as_baby": {//作为小僵尸时
"add": {
"component_groups": [//组件组
"minecraft:zombie_baby"
]
}
},
"minecraft:start_transforming": {//开始变异
"add": {
"component_groups": [
"minecraft:start_drowned_transformation"
]
},
"remove": {//删除
"component_groups": [ "minecraft:look_to_start_drowned_transformation" ]//
}
},
"minecraft:stop_transforming": {//停止变异
"add": {
"component_groups": [//组件组
"minecraft:look_to_start_drowned_transformation"
]
},
"remove": {//删除
"component_groups": [
"minecraft:start_drowned_transformation"
]
}
},
"minecraft:convert_to_drowned": {//变成溺尸
"sequence": [//序列
{
"filters": {//过滤器
"test": "has_component",
"operator": "!=",
"value": "minecraft:is_baby"
},
"add": {
"component_groups": [ "minecraft:convert_to_drowned" ]
},
"remove": {//删除
"component_groups": [ "minecraft:start_drowned_transformation" ]
}
},
{
"filters": {
"test": "has_component",
"value": "minecraft:is_baby"
},
"add": {
"component_groups": [ "minecraft:convert_to_baby_drowned" ]
},
"remove": {//删除
"component_groups": [ "minecraft:start_drowned_transformation" ]
}
}
]
}
}
}
}
实体属性
https://www.mcbbs.net/static/image/hrline/4.gif
目前还处于活跃更新中,等稳定了再编写。可以查看这篇文档
掉落物
掉落物与先前版本没有过多变化,可以参考站内教程或我的视频教程
生成规则
生成规则与先前版本没有过多变化,可以参考站内教程或我的视频教程
资源包资源包为客户端内容,只能在装载该资源包的客户端显示
短名称(short-name)
https://www.mcbbs.net/static/image/hrline/4.gif
你是否觉得明明其他addon的学习都比较轻松,到了实体却一头雾水?
你忽略了一个重要概念!---短名称
其实短名称我们在之前的学习遇到过,例如:(terrain_texture.json)
"acacia_planks" : {
"textures" : "textures/blocks/planks_acacia"
}在其中,将planks_acacia.png定义到了字符串“planks_acacia”中,在之后blocks.json中仅需调用“planks_acacia”,而不是一大串路径。
实体也是如此,例如:(player.entity.json) {
//定义动画/控制器的短名称
"animations": {
"root": "controller.animation.player.root",
"base_controller": "controller.animation.player.base",
"hudplayer": "controller.animation.player.hudplayer",
"humanoid_base_pose": "animation.humanoid.base_pose"
}
}在之后的动画、渲染控制器等都将使用短名称,所以我们要对短名称有一定的熟悉。
资源包结构了解
https://www.mcbbs.net/static/image/hrline/4.gif
https://s2.loli.net/2023/01/17/Id2JtClpG8fMkEj.png
大概了解即可
每个文件的具体作用在各自页数下的绿字
动画控制器控制动画播放
此内容将与行为包重复
状态机(State Machines)
https://www.mcbbs.net/static/image/hrline/4.gif
在动画控制器的学习之前,我们要了解一个概念---状态机(State Machines)。
它只有两个属性:
1.当前状态要做什么
2.如何移动到下一状态
状态机只能处于一种状态,当状态机运行时,你可以将它视为从一种状态移动到另一种状态,并执行此状态的内部逻辑,再遵循移动到其他状态。
状态机不仅是动画控制器其中的一种原理,也是编程开发中重要的原理,可以点击这里了解更多。
状态机示例
https://www.mcbbs.net/static/image/hrline/4.gif
例如,我们需要制作一个直升机螺旋桨的动画,目前有两种状态:
[*]ground state
[*]flying state
我们可以使用上述状态机的属性来注释这些状态:
[*]ground state
[*]不播放动画
[*]如果在空中,则移动为 flying state 状态
[*]flying state
[*]播放飞行动画
[*]如果在地面,则移动到 ground state 状态
我们可以用流程图来表示这个过程
https://s2.loli.net/2023/01/17/sx29S1O8dPRaETI.png
为了让动画更精致一点,我们也可以多加一个死亡爆炸状态:
https://s2.loli.net/2023/01/17/AoeJ3NyRbgDk5cX.png
格式
https://www.mcbbs.net/static/image/hrline/4.gif
注意,动画控制器必须在实体文件中定义及绑定。(动画与脚本)
{
"format_version": "1.10.0",
"animation_controllers": {
"controller.animation.xiaobo": {
"initial_state": "状态1",//初始状态
"states": {//状态
"状态1": {//第一个状态
"animations": ["动画短名称"],
"transitions": [//转移到下一个状态
{
"状态2": "!query.is_on_ground"//不在地面
}
],
"sound_effects":[//播放声音
{
"effect":"音效短名称"
}
],
"particle_effects": [//生成粒子
{
"effect": "粒子短名称"
}
],
"blend_transition":0.5//平滑淡出动画,0为关闭,1为完全应用淡出
},
"状态2": {//第二个状态
"transitions": [
{
"状态1": "query.is_on_ground"//在地面
}
]
}
}
}
}
}
接下来这个也与行为包的重复
注意事项
https://www.mcbbs.net/static/image/hrline/4.gif
[*]当实体加载到世界中时,动画控制器将进入初始状态。如果未定义“initial_state”,则使用名为“default”的状态。如果缺少此项,将会报错。
[*]动画控制器在转换状态时,若有多个可转换状态,将优先进入第一个。
[*]动画控制器转换状态最短时间为1tick。
动画实体行为的动作(控制模型)推荐使用blockbench编写。
格式
https://www.mcbbs.net/static/image/hrline/4.gif
{
"format_version": "1.8.0",
"animations": {
"animation.xiaobo": {
"loop": false,//动画播放完后是否返回t=0
"animation_length":2.55,//t=2.55动画完成,默认填最后一个关键帧时间
"blend_weight":1.0,//平滑淡出动画,0为关闭,1为完全应用淡出
"override_previous_animation":false,//将骨骼的动画姿势设置为绑定姿势,覆盖到此点之前的任何动画
"bones": {//模型骨骼动画
"body": {//骨骼名
"rotation": [ "-175 * math.sin(variable.attack_time * 180)", 0, 0 ]//旋转,三个值分别表示x,y,z轴
},
"leftwing_bone": {//骨骼名
"rotation": {//旋转关键帧
"0.0": [ 0, 0, 35 ],
"0.05": [ 0, 0, 0 ],
"0.10": [ 0, 0, -35 ],
"0.15": [ 0, 0, 0 ],
"0.2": [ 0, 0, 35 ],
"0.25": [ 0, 0, 0 ],
"0.30": [ 0, 0, -35 ],
"0.35": [ 0, 0, 0 ],
"0.40": [ 0, 0, 35 ],
"0.45": [ 0, 0, 0 ],
"0.50": [ 0, 0, -35 ],
"0.55": [ 0, 0, 0 ],
"0.60": [ 0, 0, 35 ],
"0.65": [ 0, 0, 0 ],
"0.70": [ 0, 0, -35 ],
"0.75": [ 0, 0, 0 ],
"0.80": [ 0, 0, 35 ],
"0.85": [ 0, 0, 0 ],
"0.90": [ 0, 0, -35 ],
"0.95": [ 0, 0, 0 ],
"1.0": [ 0, 0, 35 ],
"1.05": [ 0, 0, 0 ],
"1.10": [ 0, 0, -35 ],
"1.15": [ 0, 0, 0 ],
"1.20": [ 0, 0, 35 ],
"1.25": [ 0, 0, 0 ],
"1.30": [ 0, 0, -35 ],
"1.35": [ 0, 0, 0 ],
"1.40": [ 0, 0, 35 ],
"1.45": [ 0, 0, 0 ],
"1.50": [ 0, 0, -35 ],
"1.55": [ 0, 0, 0 ],
"1.60": [ 0, 0, 35 ],
"1.65": [ 0, 0, 0 ],
"1.70": [ 0, 0, -35 ],
"1.75": [ 0, 0, 0 ],
"1.80": [ 0, 0, 35 ],
"1.85": [ 0, 0, 0 ],
"1.90": [ 0, 0, -35 ],
"1.95": [ 0, 0, 0 ],
"2.0": [ 0, 0, 35 ],
"2.05": [ 0, 0, 0 ],
"2.10": [ 0, 0, -35 ],
"2.15": [ 0, 0, 0 ],
"2.20": [ 0, 0, 35 ],
"2.25": [ 0, 0, 0 ],
"2.30": [ 0, 0, -35 ],
"2.35": [ 0, 0, 0 ],
"2.40": [ 0, 0, 35 ],
"2.45": [ 0, 0, 0 ],
"2.50": [ 0, 0, -35 ],
"2.55": [ 0, 0, 0 ]
},
"position":,//位置
"scale":0.95//缩放,相当于填
}
}
}
}
}
实体实体文件是联系资源包与行为包的重要枢纽。
本文件中定义了大量的短名称,要了解一个实体的前提是熟悉它的短名称
结构
https://www.mcbbs.net/static/image/hrline/4.gif
{
"format_version": "1.10.0",
"minecraft:client_entity": {
"description": {
"identifier": "xiaobo:example",
"materials": {...},
"textures": {...},
"geometry": {...},
"render_controllers": [...],
"animations": {...},
"scripts": {...},
"sound_effects": {...},
"particle_effects": {...},
"spawn_egg": {...},
"enable_attachables": false,
"hide_armor": false
}
}
}实体文件结构大概如上
以下将讲解各个组件的用处。
材质(materials)
https://www.mcbbs.net/static/image/hrline/4.gif
材质决定着纹理(textures)的渲染方式,例如骷髅的材质是透明的,蜘蛛的眼睛会发光。如下是它的格式:(spider.entity.json)
"materials": {//定义材质短名称
"default": "spider",
"invisible": "spider_invisible"
},
注意看,这里仅仅是定义了短名称,该实体并不知道要把材质应用到哪个纹理上。在之后我们可以调用它,例如“Material.default”
这里列出常用的原版材质组件:
不透明:"entity"
(含有)半透明:"entity_alphablend"
(含有)全透明:"entity_alphatest"如果你想了解更全面的原版材质,可以点击这里
纹理(textures)
https://www.mcbbs.net/static/image/hrline/4.gif
纹理相当于贴图。如下为示例:(player.emtity.json)
"textures": {//定义纹理短名称
"default": "textures/entity/steve",
"cape": "textures/entity/cape_invisible"
},注意这里仍然是定义短名称,在之后可以调用它,例如“Texture.default”
模型(geometry)
https://www.mcbbs.net/static/image/hrline/4.gif
也许它被翻译成几何体,但我更喜欢叫它模型。如下为示例:(player.emtity.json)
"geometry": {//定义模型短名称
"default": "geometry.humanoid.custom",//默认
"cape": "geometry.cape"//披风
},
它是将models文件夹里的模型,在该实体中定义短名称,以便调用。
渲染控制器(render_controllers)
https://www.mcbbs.net/static/image/hrline/4.gif
在实体文件中用于绑定渲染控制器。示例如图:(axolotl.entity.json)
"render_controllers": [ "controller.render.axolotl" ]注意这里是读取,而不是定义短名称了。
拥有以上4个组件才可以制作一个简单的实体。
动画(animations)
https://www.mcbbs.net/static/image/hrline/4.gif
这个组件定义了动画/动画控制器的短名称。包含了实体的行走、攻击、看向玩家的方式等等。如下为示例:(player.emtity.json)
"animations": {//定义动画/控制器的短名称
"root": "controller.animation.player.root",
"base_controller": "controller.animation.player.base",
"hudplayer": "controller.animation.player.hudplayer",
...
},
脚本(scripts)
https://www.mcbbs.net/static/image/hrline/4.gif
脚本主要运用于设置变量,运行动画,控制实体大小等,因此这个组件将运用到大量的molang表达式。在这里讲讲解各个组件的作用,关于molang表达式往后随缘更新。
脚本格式:
"scripts": {
"initialize": [...],
"pre_animation": [...],
"animate": [...],
"scale": "1",
}初始化(initialize)
设置molang初始值(每次进入世界或实体生成及加载)
例如:(player.emtity.json)
"initialize": [//设置初始值(每次进入世界或实体生成及加载)
"variable.is_holding_right = 0.0;",
"variable.is_blinking = 0.0;",
"variable.last_blink_time = 0.0;",
"variable.hand_bob = 0.0;"
],动画前(pre_animation)
在动画播放的前一帧进行计算
例如:(player.emtity.json)
"pre_animation": [//动画运行前计算
"variable.helmet_layer_visible = 1.0;",
"variable.leg_layer_visible = 1.0;",
"variable.boot_layer_visible = 1.0;",
"variable.chest_layer_visible = 1.0;",
"variable.attack_body_rot_y = Math.sin(360*Math.sqrt(variable.attack_time)) * 5.0;",
"variable.tcos0 = (math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed / variable.gliding_speed_value) * 57.3;",
"variable.first_person_rotation_factor = math.sin((1 - variable.attack_time) * 180.0);",
"variable.hand_bob = query.life_time < 0.01 ? 0.0 : variable.hand_bob + ((query.is_on_ground && query.is_alive ? math.clamp(math.sqrt(math.pow(query.position_delta(0), 2.0) + math.pow(query.position_delta(2), 2.0)), 0.0, 0.1) : 0.0) - variable.hand_bob) * 0.02;",
"variable.map_angle = math.clamp(1 - variable.player_x_rotation / 45.1, 0.0, 1.0);",
"variable.item_use_normalized = query.main_hand_item_use_duration / query.main_hand_item_max_duration;"
],动画(animate)
在“pre_animation”之后的每一帧都运行。可运行动画及动画控制器。例如:
"scripts": {
"animate": [
"attack_controller",
{
"walk": "q.modified_move_speed"
}
],
}在如上代码中运行了“attack_controller”动画控制器及“walk”动画。
在代码中的molang表达式意思为查询实体的行走速度,而正常的行走速度查询值为1,如果我们将"q.modified_move_speed"改成2,实体将以两倍速度播放行走动画
请注意,这里开始,我们正在使用之前定义过的短名称进行编写
缩放(scale)
控制实体的大小,格式如下:
"scripts": {
"scale": 0.81,//整体缩放
"scaleX": 2,//x轴缩放
"scaleY": 0.5//y轴缩放
}
音效(sound_effects)
https://www.mcbbs.net/static/image/hrline/4.gif
该组件可让实体在特定时间发出特定音效。如下图所示,定义了三个实体攻击的短名称。对的,这还是在定义短名称!
"sound_effects": {
"attack_1": "mob.entity.attack_1",
"attack_2": "mob.entity.attack_2",
"attack_3": "mob.entity.attack_3"
}如上代码,短名称引用了“sound_definitions.json”文件中定义的声音短名称。
在其他地方(例如在命令中)使用声音时,可以使用“mob.entity.attack_1”,但在实体中定义的动画中,可以使用“attack_1”。
粒子效果(particle_effects)
https://www.mcbbs.net/static/image/hrline/4.gif
此组件定义要在动画中使用的粒子效果的短名称。例如:(bee.entity.json)
"particle_effects": {
"nectar_dripping": "minecraft:nectar_drip_particle"
},关于原版粒子id可点击这里查看。
刷怪蛋(spawn_egg)
https://www.mcbbs.net/static/image/hrline/4.gif
此组件定义刷怪蛋的材质,若不使用此组件,刷怪蛋是黑色的。
此组件有两种格式
"spawn_egg": {
"base_color": "#db7500",
"overlay_color": "#242222"
}如上代码,这种格式的刷怪蛋类似于原版资源包的刷怪蛋,由两种颜色组成。
"spawn_egg": {
"texture": "6666",
}如上代码,这种格式的刷怪蛋可使用自定义材质。引用的是在“textureitem_texture.json”定义的短名称
其他组件
enable_attachments:是否可持有附件(弓,剑等)
hide_armor:隐藏盔甲渲染
模型构建实体的模型在这里需要制作一个个几何体,组装成我们的实体模型。
推荐使用blockbench编写。
渲染控制器将模型、材质、纹理整合、分层、渲染的地方
渲染控制器中调用的实体文件中定义的短名称,所以要对短名称较为熟悉
最简单的格式:
https://www.mcbbs.net/static/image/hrline/4.gif
{
"format_version": "1.8.0",
"render_controllers": {
"controller.render.xiaobo": {
"geometry": "Geometry.default",
"materials": [ { "*": "Material.default" }],
"textures": [ "Texture.default" ]
}
}
}调用结构:Geometry.<短名称>
调用材质:Material.<短名称>
调用纹理:Texture.<短名称>
其中“*”代表所有骨骼的纹理
因为渲染控制器调用的是短名称,所以若自定义的实体与原版相似,可以直接套用原版渲染控制器。如果你想做再稍复杂一点的材质,可以接着往下看。
制作多纹理实体
https://www.mcbbs.net/static/image/hrline/4.gif
在这里,我们要多学习一个结构---数组,结构如下:(controller.render.axolotl.json 美西螈)这里建议你打开美西螈的文件对照学习
"arrays": {
"textures": {
"Array.skins": [ "Texture.lucy", "Texture.cyan", "Texture.gold", "Texture.wild", "Texture.blue" ]
}
},在该结构中,将多个纹理放置于同一个数组“Array.skins”,在稍后整合纹理的时候可以调用:
"textures": [ "Array.skins" ]如上是一个molang值,意思是查询随机值variant的值,根据这个值对应数组中的纹理,关于这个随机值我们可以在行为包中定义:
(axolotl.json 组件组)
"axolotl_lucy": {
"minecraft:variant": { "value": 0 }
},
"axolotl_cyan": {
"minecraft:variant": { "value": 1 }
},
"axolotl_gold": {
"minecraft:variant": { "value": 2 }
},
"axolotl_wild": {
"minecraft:variant": { "value": 3 }
},
"axolotl_blue": {
"minecraft:variant": { "value": 4 }
},(axolotl.json事件)
"minecraft:entity_spawned": {
"sequence": [
{
"add": {
"component_groups": [
"axolotl_adult",
"axolotl_in_water"
]
}
},
{
"randomize": [
{
"weight": 25,
"add": {
"component_groups": [ "axolotl_cyan" ]
}
},
{
"weight": 25,
"add": {
"component_groups": [ "axolotl_gold" ]
}
},
{
"weight": 25,
"add": {
"component_groups": [ "axolotl_lucy" ]
}
},
{
"weight": 25,
"add": {
"component_groups": [ "axolotl_wild" ]
}
}
]
}
]
},如上代码,在行为包中的组件组中定义了每个纹理对应的variant的值,在出生事件中随机调用组件组,从而实现随机纹理
注意事项
https://www.mcbbs.net/static/image/hrline/4.gif
再返回数组这个格式:
{
"arrays": {
"textures": {
"自定义数组名": [ "纹理短名称1", "纹理短名称2" ]
},
"geometry": {
"自定义数组名": [ "模型短名称1", "模型短名称2" ]
},
"materials": {
"自定义数组名": [ "材质短名称1", "材质短名称2" ]
}
}
}可以看到它也是支持模型和材质的。
这里需要明白一点:
"materials": [
{ "*": "Material.default" },
{ "*arm": "Material.limbs" },
{ "*leg": "Material.limbs" }在定义纹理、材质、模型中,若出现多个组件,则是由下往上覆盖。
*代表所有骨骼的纹理,*arm代表所有以arm结尾的骨骼的纹理。
声音这是储存/定义/运用声音文件的地方
结构
https://www.mcbbs.net/static/image/hrline/4.gif
https://s2.loli.net/2023/01/17/wyXzPlINRFhmV9B.png
声音文件
https://www.mcbbs.net/static/image/hrline/4.gif
在基岩版中,可以识别的声音文件格式有wav(无损),ogg(有损),fsb(未知)
这里推荐将制作完的声音保存为ogg格式,文件较小,显得包不是那么拥挤。
声音定义(sound_definitions.json)
https://www.mcbbs.net/static/image/hrline/4.gif
在上文有提到,这里是整合,定义声音短名称的地方。
格式
https://www.mcbbs.net/static/image/hrline/4.gif
{
"format_version": "1.14.0",
"sound_definitions": {
"example.xiaobo": {//定义声音短名称
"category": "...",//类型
"min_distance":6.0,//最小传播距离(超过该值声音衰减)
"max_distance":66.0,//最大传播距离(超过该值没有声音)
"sounds": [
"sounds/...",//简单定义声音
"sounds/...",
"sounds/...",
{
"name": "sounds/...",//这里可以细化定义声音
"load_on_low_memory": true,//强制加载声音,自1.16.0起弃用
"stream":true,//限制播放数量,提高游戏性能
"volume":1.0,//响度(默认1.0)
"pitch":1.0,//音速(默认1.0)
"is3D":true,//方向性
"interruptibe":true,//是否可被打断(默认true)
"weight":5//权重,含有多个声音时随机选取播放,默认1
}
]
}
}
}
category可选值
https://www.mcbbs.net/static/image/hrline/4.gif
weather
block
bucket
bottle
ui (忽略范围限制)
player
hostile
music
record
neutral
声音(sounds.json)
https://www.mcbbs.net/static/image/hrline/4.gif
绑定声音到各种事件的地方。
格式:
https://www.mcbbs.net/static/image/hrline/4.gif
{
"block_sounds" : {...},
"entity_sounds" : {...},//实体声音
"individual_event_sounds" : {...},
"interactive_sounds" : {...}
}
实体声音("entity_sounds"):
https://www.mcbbs.net/static/image/hrline/4.gif
这个选项是将声音绑定到实体事件中,既可以对所有声音进行调整,也可以对单个声音调整。例如:
{
"entity_sounds": {
"entities": {
"wiki:elephant": {
"volume": 1,
"pitch": ,
"events": {
"step": {
"sound": "elephant.step",
"volume": 0.18,
"pitch": 1.1
},
"ambient": {
"sound": "elephant.trumpet",
"volume": 0.11,
"pitch": 0.9
}
}
}
}
}
}关于原版事件:(包括但不限于如下)
ambient 随机播放,氛围音
hurt 受攻击时
death 死亡时
step 在地面上行走时
fall.big 从高处落下
fall.small 从低处落下
splash 溅起水花时
attack 攻击时
shoot 射击时
breathe
splash
swim
ambient.in.water
death.in.water
jump
eat
hurt.in.water
mad
stare
sniff
sleep
spit
warn
scream
文本用于翻译字符串
原版溺尸:(zh_CN.text)
entity.drowned.name=溺尸
item.spawn_egg.entity.drowned.name=生成溺尸格式:
entity.<命名空间:id>.name=实体名字
item.spawn_egg.entity.<命名空间:id>.name=实体生成蛋名字
纹理实体的贴图
推荐在blockbench中制作完导出
bug修复
可以先参考这篇文献,在后续翻译
页: [1]