提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、制作小BOSS龙牙哥
- 1.导入素材制作动画
- 2.制作两种攻击行为
- 3.制作从惊醒到转身到走路or跑步行为
- 总结
前言
hello大家好久没见,之所以隔了一天时间才来更新是因为CSDN有个限制每天发图片的数量,然后昨天我喜提24小时冷却,现在终于有被放出来了就来讲讲上期遗漏的内容,来介绍我们这期的主角!
一、制作小BOSS龙牙哥
1.导入素材制作动画
看到这里你可能会觉得,就上面几个敌人还不够自己塞牙的,行为逻辑也没有看上去这么难理解,感觉没什么技术含量,但是你知道我专门会把有一些难度的内容放到最后面来讲,因此在这一节制作的敌人更是重量级,它是谁呢?当然是令空洞萌新胆寒的三大新人杀手之一------龙牙哥:

对于它的动画,首先介绍攻击分为慢攻击attack和快攻击attack2:
Stomp即脚踩地面制造两个方向的冲击波的动画,它也分为三个阶段:



摇摆龙牙时的动画:

我们先来制作龙牙哥的子对象:
它拥有警觉区域和攻击区域两个alert Range


攻击时产生的烟尘粒子系统:

跑步时扬起的灰尘粒子系统:

攻击时产生的岩石粒子系统

这个是践踏地面时产生的岩石粒子系统:

判断头顶有无撞到Terrain层级的地板


这个Swipe相当于上一期我讲到的僵尸防御者的slash,只有在攻击的时候才打开,注意这里的damageHero的伤害值要设置成2(所以说为啥是萌新杀手)

践踏产生的灰尘

这个是和梦之钉有关的,先别管:

回到主体对象,把敌人该有的脚本都给他添加上去:





2.制作两种攻击行为
制作一个同名脚本"Zombie Guard"的playmakerFSM:
设置好相应的变量和事件








初始化阶段,设置好hero,self的引用找到子物体的attack range,设置好roam L和R




开始时的朝向:


然后进入打瞌睡阶段:注意勾选上everyframe每帧都在检测

如果检测到了两个条件都符合触发ATTACK ALERT事件或者被玩家用骨钉抽了触发TOOK DAMAGE事件进入wake状态


等个0.21s再来处理接下来的事:

进入Idle 状态:



根据不同的Bool All True满足条件我们发送不同的事件
首先看看ATTACK ALERT事件,它的接受者叫状态Face Hero,这里的CameraShake是后续才用到的,这里你可以先到CameraParent中添加好对应的事件名和变量名以防止报错。



设置好速度的正负值


随机选择发送一个事件:

这些变量有关In A Row的都是防止运气太差连续几次都播放同一种行为而加以限制的,比如这里的Clubs In A Row如果连续触发四次,就会返回到Attack Choice状态中,毕竟不怕一万,只怕万一嘛

准备攻击阶段:


攻击阶段,记得要激活Swipe

视觉效果和听觉效果展示:

这里根据Facing Right变量来判断生成slam和swipe的位置:


攻击产生的后坐力阶段:


攻击结束,准备回到冷却阶段:

我们再来随机发送事件的第二个分支:
践踏行为准备阶段:


起跳阶段:

注意这个JUmp Velocity是指横向的速度,并不是y方向上的



这里除了生成了音效,slam effect以外,还生成了左右两个方向上的冲击波



Stomp行为结束,回到cooldown状态:

打断一下,我们先来做冲击波Shockwave预制体:

首先制作子对象:我咧个滚滚浓烟

爆出来的石头:

一个平面Plane

制作playmakerFSM"shockwave":



开始的阶段



开始移动:速度逐帧递增


如果碰到墙壁或者地下的Terrain检测不到了,就结束吧


如果击中玩家了:

cs
using UnityEngine;
namespace HutongGames.PlayMaker.Actions
{
[ActionCategory(ActionCategory.GameObject)]
[Tooltip("Spawns a prefab Game Object from the Global Object Pool on the Game Manager.")]
public class SpawnObjectFromGlobalPoolOverTimeV2 : FsmStateAction
{
[RequiredField]
[Tooltip("GameObject to create. Usually a Prefab.")]
public FsmGameObject gameObject;
[Tooltip("Optional Spawn Point.")]
public FsmGameObject spawnPoint;
[Tooltip("Position. If a Spawn Point is defined, this is used as a local offset from the Spawn Point position.")]
public FsmVector3 position;
[Tooltip("Rotation. NOTE: Overrides the rotation of the Spawn Point.")]
public FsmVector3 rotation;
[Tooltip("How often, in seconds, spawn occurs.")]
public FsmFloat frequency;
[Tooltip("Minimum scale of clone.")]
public FsmFloat scaleMin = 1f;
[Tooltip("Maximum scale of clone.")]
public FsmFloat scaleMax = 1f;
private float timer;
public override void Reset()
{
gameObject = null;
spawnPoint = null;
position = new FsmVector3
{
UseVariable = true
};
rotation = new FsmVector3
{
UseVariable = true
};
frequency = null;
}
public override void OnUpdate()
{
timer += Time.deltaTime;
if(timer > frequency.Value)
{
timer = 0f;
if(gameObject.Value != null)
{
Vector3 a = Vector3.zero;
Vector3 euler = Vector3.up;
if (spawnPoint.Value != null)
{
a = spawnPoint.Value.transform.position;
if (!position.IsNone)
{
a += position.Value;
}
euler = ((!rotation.IsNone) ? rotation.Value : spawnPoint.Value.transform.eulerAngles);
}
else
{
if (!position.IsNone)
{
a = position.Value;
}
if (!rotation.IsNone)
{
euler = rotation.Value;
}
}
if (gameObject != null)
{
//TODO:
GameObject gameObject = Object.Instantiate(this.gameObject.Value, a, Quaternion.Euler(euler));
if (scaleMin != null && scaleMax != null)
{
float num = Random.Range(scaleMin.Value, scaleMax.Value);
if (num != 1f)
{
gameObject.transform.localScale = new Vector3(num, num, num);
}
}
}
}
}
}
}
}
真正有造成伤害和图像显示的其实是Shockwave Spurt,上述的Shockwave顶多算个底盘,用来制作粒子系统和处理判断是否击中玩家和离开墙壁的行为。

制作playmakerFSM:主要是做造成伤害的时间段



Shockwave spurt L也是同理,区别在于记得设置它的rotation为180,这里我们用playmaker来实现:


3.制作从惊醒到转身到走路or跑步行为
回到龙牙哥的playmakerFSM来,我们在idle还有两个事件没有接受者,


先看TRUE状态下,进入惊醒状态Statle



检查方向:



这里的HERO ABOVE事件到底要怎么触发呢,当然是我们上面讲到的子对象Overhead Detect,给它一个新的playmakerFSM:在它的变量string类型添加上事件名字








接着回来制作Check Right和Turn Right



再来制作Turn Left和CheckLeft状态:



如果不用Turn,直接顺着FALSE事件来到追逐chase状态:

如果决定进入走路状态:





跟丢了话就进入丢失玩家Lose Hero状态:


ATTACK ALERT来到Face Hero状态
WAIT就回到Alert状态
RUN就来到Run状态:




Stop Run状态:

ATTACK ALERT的话来到Face Hero状态

WAIT就回到Alert状态

如果Idle状态上过了四秒钟都没有检测到要发送ATTACK ALERT和ALERT事件,我们就发送WAIT事件













总结一下就是,刚开始龙牙哥在初始化阶段后进入睡眠阶段,当玩家进入can see hero和alert range范围后龙牙哥就进入苏醒阶段,如果过了4秒玩家离开区域后就设置好朝向,如果突然返回了就发送惊醒alert阶段,然后就开始根据距离决定跑步还是走路接近玩家,当进入attack range距离后就开始进入Face hero阶段,然后根据random二选一一种攻击方式,第一种是挥舞龙牙的行为,第二种是践踏地面产生冲击波伤害玩家行为。其实理一下还是比较简单的,只是连线太多了给人一种很晕的感觉。
总结
最后我们来看看效果吧:




直接干两滴血真的bt:

压迫感来了:


超出距离的就一直盯紧玩家:
