往期的自定义生物课程中
小编给大家讲过怎么添加动画
怎么让生物学会攻击
(点击关键词回顾相关内容)
你们有没有想过将这两者结合?
为生物添加一些更酷炫的“攻击技能”
今天小编就带大家实操一下
怎么制作攻击动画和范围攻击!
让生物带有一种完整攻击动画一般是指,生物的攻击会因动画效果而带有延迟性。
比如当史莱姆在进攻某个目标时,我们不希望它在达到攻击距离时就对目标造成伤害,而是更希望它携带一种比较好的攻击动画,在动画的某一刻再打出那道伤害。
幸运的是,原版的劫掠兽就携带了这样的行为,并且它也用到了这样的动画效果。因此制作带有完整攻击动画的效果就变得简单起来。
① 让实体带有攻击行为前,必须至少添加一种寻路组件行为、移动组件行为,一个移动速度组件行为和一个攻击力组件行为。
小编笔记
寻路组件行为和移动组件行为打开后,攻击行为才会有效。
移动组件行为和移动速度组件行为使生物能够移动到目标身边。
攻击力组件行为添加上后,生物近战才会携带伤害能力。
② 在高级史莱姆行为中,我们添加了minecraft:behavior.delayed_attack,即延迟攻击组件行为。
{
"format_version": "1.16.0",
"minecraft:entity": {
"description": {
"identifier": "design:superior_slime",
"is_spawnable": true,
"is_summonable": true,
"is_experimental": false,
"runtime_identifier": "design:superior_slime",
"animations": {
"c o n t r o l l e r.roar": "c o n t r o l l e r.animation.superior_slime.roar" //注册吼叫控制器
},
"scripts": {
"animate": [
"c o n t r o l l e r.roar" //挂载控制器
]
}
},
"component_groups": {
"superior_slime:roar": { //吼叫行为组
"minecraft:behavior.knockback_roar": { //吼叫组件行为,来自Ravager劫掠兽
"priority": 0, //优先级0级执行,即最优先执行
"attack_time": 0.1, //吼叫触发的时间
"cooldown_time": 1.0, //冷却时间,0为不冷却
"duration": 0.8, //吼叫持续的时间
"knockback_damage": 2, //吼叫伤害
"knockback_range": 4, //吼叫范围
"knockback_strength": 2, //吼叫强度
"on_roar_end": { //吼叫结束时,触发一个生物事件
"event": "superior_slime:roar_end"
}
}
}
},
"components": {
"minecraft:experience_reward": { //经验组件行为,query.last_hit_by_player为query函数,获取最后一击是否来自玩家,是,则死亡时掉落1点经验,否则掉落0点经验,即不掉落经验球
"on_death": "query.last_hit_by_player ? 1 : 0"
},
"minecraft:type_family": { //实体家族组件行为,可以添加一系列的家族标签,标签可以被过滤器检测
"family": [ "superior_slime", "monster", "mob" ]
},
"minecraft:breathable": { //呼吸组件行为
"total_supply": 15,
"suffocate_time": 0
},
"minecraft:movement": { //速度组件行为
"value": 0.15
},
"minecraft:collision_box": { //碰撞箱组件行为
"height": 1.0,
"width": 0.8
},
"minecraft:attack": {//攻击力组件行为
"damage": 4
},
"minecraft:navigation.walk": {//陆地寻路组件行为
"can_path_over_water": true,
"avoid_water": true
},
"minecraft:jump.static": {//普通跳跃组件行为
},
"minecraft:can_climb": {//爬跃方块组件行为
},
"minecraft:hurt_on_condition": {//受伤条件组件行为,这里是当自身受到岩浆伤害时,每一游戏刻扣除4点生命值
"damage_conditions": [
{
"filters": { "test": "in_lava", "subject": "self", "operator": "==", "value": true },
"cause": "lava",
"damage_per_tick": 4
}
]
},
"minecraft:movement.basic": {//移动组件行为,需要与寻路组件行为配合
},
"minecraft:nameable": {//名字组件行为,添加上后默认可以用命名牌更改生物名字
},
"minecraft:behavior.float": {//浮起水面组件行为
"priority": 1
},
"minecraft:behavior.delayed_attack": {//延迟攻击行为,来自Ravager劫掠兽,使用该行为可以配合动画播放到一个阶段时,打出一次伤害
"priority": 3,
"speed_multiplier": 1.5,//进入攻击状态时,速度加成,这里是乘以1.5倍
"attack_duration": 0.72,//攻击动画时间,与动画资源的时长匹配
"hit_delay_pct": 0.3333,//在时间的多少百分比打出伤害,将动画资源导入BB可以看到在0.24秒时打出攻击动作,动画总时长0.72秒,因此0.24/0.72约等于0.3333
"track_target": true//持续跟踪目标
},
"minecraft:behavior.random_stroll": {//随意闲逛组件行为
"priority": 4
},
"minecraft:behavior.random_look_around": {//随机转头组件行为
"priority": 5
},
"minecraft:behavior.nearest_attackable_target": {//获取攻击目标组件行为
"priority": 2,
"entity_types": [
{
"filters": {
"any_of": [
{
"test": "is_family",
"subject": "other",
"value": "player"
}
]
},
"max_dist": 16
}
],
"must_see": true
},
"minecraft:physics": {//物理组件行为,默认加入后会带有碰撞效果和重力效果
},
"minecraft:pushable": {//推挤组件行为,是否可以被其他生物或活塞方块推挤
"is_pushable": true,
"is_pushable_by_piston": true
}
},
"events": {
"superior_slime:start_roar": {
"add": {
"component_groups": [
"superior_slime:roar"
]
}
},
"superior_slime:roar_end": {
"remove": {
"component_groups": [
"superior_slime:roar"
]
}
}
}
}
}
详细的属性注释都已经写在组件行为旁边咯,开发者们可以仔细查看代码进行了解~
③ 接着切换到资源包,打开动画控制器,可以看到高级史莱姆的动画控制器文件,里面已经包含着一个专属于高级史莱姆的攻击动画控制器。
向上滑动阅览
{
"format_version": "1.10.0",
"animation_c o n t r o l l e r s": {
"c o n t r o l l e r.animation.superior_slime.attack": {
"states": {
"default": {
"transitions": [
{ "attack": "query.is_delayed_attacking" }
]
},
"attack": {
"animations": [ "attack" ],
"transitions": [
{ "default": "!query.is_delayed_attacking" }
]
}
}
}
}
}
使用“molang语法”前,根据文档提示可知,延迟攻击组件行为所搭配的“query”函数叫做“query.is_delayed_attacking”,它遵循以下逻辑:
l s p>an="1" rowspan="1">
当生物做出攻击动作时
l s p>an="1" rowspan="1">
返回“1.0”,即真
l s p>an="1" rowspan="1">
当生物在其他时间下时
l s p>an="1" rowspan="1">
返回“0.0”,即假
因此,攻击动画使用的循环模式为单次,并在“query.is_delayed_attacking”返回“0.0”,即攻击结束时,切换回初始状态。
到这一步
一个带有完整攻击动画的生物就诞生了
那么要如何设置生物的范围攻击呢?
接着往下看↓↓
① 再次打开附录包内的高级史莱姆行为。我们开启了一个组件组,里面包含了一个“knockback_roar”组件行为,它来自劫掠兽,是劫掠兽吼叫时产生范围伤害和击退的组件行为,非常适合用来制作范围攻击。
详细的组件键对属性已经用注释写好了,下面就一起康康如何在合适的时机将这个组件组加进高级史莱姆的活动当中叭!
② 在上一期教程中提到的“控制器与生物事件”中,我们曾经写过一个例子,是在生物发现目标时给予一种状态效果,在失去目标时取消状态效果。
同样,我们也可以将这个模式进行改造,让高级史莱姆在发现目标时对周围产生一次战吼的范围攻击,并在攻击结束后开始朝玩家方向移动。
{
"format_version": "1.10.0",
"animation_c o n t r o l l e r s": {
"c o n t r o l l e r.animation.superior_slime.roar": { //动画控制器的资源名称
"states": {
"default": {
"transitions": [
{
"roar": "query.has_target" //当高级史莱姆发现目标时,切换至roar状态
}
]
},
"roar": {
"on_e n t r y": [
"/say 我讨厌你!咆哮一次!", //公屏发送一段信息
"@s superior_slime:start_roar" //执行实体本身定义好的吼叫事件,这段动作同样会被脚本引擎的EntityDefinitionsEventServerEvent监听到
],
"transitions": [
{
"default": "!query.has_target"//当高级史莱姆失去目标时,切换至default状态
}
]
}
}
}
}
}
附录包的行为包控制器内,已经写好了一个控制范围攻击触发的控制器。由文档可知,“query.has_target”代表:
l s p>an="1" rowspan="1">
实体发现目标时
l s p>an="1" rowspan="1">
返回“1.0”,即真
l s p>an="1" rowspan="1">
实体未发现目标时
l s p>an="1" rowspan="1">
返回“0.0”,即假
因此当切换到“roar”吼叫状态时,必须满足发现目标~
③ 紧接着我们在“on_e***y”里执行一条指令,会触发一次全屏信息公告。
④ 接着触发在高级史莱姆行为内定义好的开始吼叫事件。当吼叫结束时,我们又通过吼叫组件的“on_roar_end”触发一次移除吼叫组件的事件。
这样生物就会开始朝目标靠近,目标消失后,控制器切换回普通状态,直到发现下一个目标,形成一个生动行为的闭环。
本期教程就讲解到这里啦
小编建议开发者们
结合上期教程一起食用
也许会更容易弄清楚各项操作哦!
文本作者:神也佑我