从零开始学习Unity学习笔记:Day15 巡逻敌人:左右巡逻

状态机层级设计

显然当敌人从向A点走的时候和B点走的时候,移动方向是不一样,可以看做是两种不同的状态,而这两种状态都是巡逻的子状态。为了表达这种状态的层级关系,我们添加一个Super State来管理所有巡逻的逻辑和状态:
并如之前的方法一样创建这个Super State到Dead状态的过渡,过渡的条件也从原先Patrolling状态到到Dead状态的条件复制过来,然后将原先的Patrolling节点删除,并将Super State切换为Start(会显示为绿标),最后得到如下的状态图:
双击这个Super State来编辑,将默认的Start状态修改为To Point A,并建立To Point B状态以及相应的过渡:

基本移动逻辑

为了便于复用,我们创建一个新的Script Graph脚本来写敌人移动的逻辑。
可以在Script Machine文件夹下新建一个Enemy文件夹来专门存放敌人相关的逻辑。
类似于Player移动的方法,我们使用Rigidbody的Set Velocity的节点来让敌人移动。
注意:在使用这个脚本前,需要在敌人对象上新建一个名为Horizontal Spee的的float型对象变量来指定移动速度大小。
给定移动速度的大小后,要解决的是怪物的方向问题。这里我们使用Nesting分类下的Input节点来从状态机中获得这个方向:
添加Input节点后,在Graph Inspector窗口我们可以指定需要从外部输入的数据(Data Inputs)或者触发事件(Trigger Inputs),这里我们需要一个方向的数据,所以在Data Inputs添加名为Direction的输入,并指定类型为Float。
然后就可以在图中看到这个Direction的连接点了。我们需要方向是一个单位化的值(要么1,要么-1)这样与速度大小相乘就可以得到完整的水平速度了,因此我们这里为Direction添加一个Normalize的节点来实现单位化,最后类似于Player移动的方法与大小相乘输出给Rigidbody就行:
最后采用Set Flip X节点实现敌人朝向随移动方向的改变。要注意的是:素材本身的朝向是 向左 的,而水平速度取正值的时候是 向右 移动。所以当这个方向取正值(向右移动)时,反而才需要翻转素材。

编辑巡逻状态

状态朝向设置

现在回到之前敌人状态机中的To Point A节点,将这个移动逻辑的脚本拖入进来,可以看到代表移动逻辑脚本的节点上出现了一个Direction的输入点,我们只需要输入一个Float字面值就行。在To Point A节点中显然是朝着A点(在左侧)移动所以设为-1。
类似的逻辑复制到To Point B节点中,朝着B点(在右侧)移动所以设为1。
原视频中Michelle老师用了比较复杂的方法,可以使得在To Point A状态与To Point B状态之间的转移条件未设置时,到达指定点后反复在指定点左右移动,也使得Point A和Point B在场景中的位置交换时效果不变,但这里毕竟最终要设置转移条件,而且一般也不会改变Point A和Point B的相对,所以这里采用了给定固定方向的简单实现方法,在这一简单方法下实际上移动逻辑里对Direction的单位化节点可以删除。

状态转移设置

To Point A状态过渡到To Point B状态的条件是: 敌人已经向左“走过”了Point A 。因此,我们需要判断敌人自己和Point A的相对位置,具体来说是敌人自己的水平位置是否小于Point A的水平位置。
为了获得Point A的水平位置,我们需要将Point A对象设置为Opossum对象的对象变量,命名为Point B。
使用Transform组件提供的Position来得到水平位置,将二者的水平位置作差即可判断敌人自己的水平位置是否小于Point A的水平位置。
To Point B状态中也是类似的方法:
注意需要将Point B也设置为Opossum对象的对象变量。
至此,就完成了巡逻敌人的所有逻辑编写。撒花✿✿ヽ(°▽°)ノ✿
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值