[Unity Demo]从零开始制作空洞骑士Hollow Knight第十六集(下篇):制作小BOSS龙牙哥
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、制作小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检测不到了,就结束吧



如果击中玩家了:

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:

压迫感来了:


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

相关文章:
[Unity Demo]从零开始制作空洞骑士Hollow Knight第十六集(下篇):制作小BOSS龙牙哥
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、制作小BOSS龙牙哥 1.导入素材制作动画2.制作两种攻击行为3.制作从惊醒到转身到走路or跑步行为总结 前言 hello大家好久没见,之所以隔了一天时间…...
顺序表算法题【不一样的解法!】
本章概述 算法题1算法题2算法题3彩蛋时刻!!! 算法题1 力扣:移除元素 我们先来看这个题目的要求描述: 把与val相同数值的元素移除掉,忽略元素的相对位置变化,然后返回剩下与val值不同的元素个数…...
VuePress的基本常识
今天大概了解了一下Vuepress,感觉很棒,看着极其简单,自己也想做一个,后续我大概率也会做一个用Vuepress为基础做的博客网站,很酷~ 哈哈哈,下面是我今天学习Vuepress的一些内容,简单分享下&#…...
深入解析Vue2与Vue3的区别与Vue3的提升
Vue.js作为一款流行的前端框架,自发布以来,凭借其简洁的语法、灵活的组件化和高效的性能,赢得了众多开发者的喜爱。随着Vue3的发布,许多新特性和新功能也应运而生。那么,Vue2与Vue3究竟有哪些区别呢?Vue3又…...
认识python数据分析
Python作为一种高效、灵活且易于学习的编程语言,在数据分析领域展现出了强大的应用潜力。 从数据清洗、预处理到复杂的统计分析、可视化及机器学习模型的构建,Python提供了丰富的库和框架,极大地简化了数据分析的流程,提高了工作…...
以太网交换安全:MAC地址漂移与检测(实验:二层环路+网络攻击)
一、什么是MAC地址漂移? MAC地址漂移是指网络中设备的MAC地址在运行过程中发生变化的现象。 MAC地址是用于唯一标识网络中的设备。 MAC地址漂移是指交换机上一个VLAN内有两个端口学习到同一个MAC地址,后学习到的MAC地址表项覆盖原MAC地址表项的现象。…...
NeRF三维重建—神经辐射场Neural Radiance Field(二)体渲染相关
NeRF三维重建—神经辐射场Neural Radiance Field(二)体渲染相关 粒子采集部分 粒子采集的部分我们可以理解为,在已知粒子的情况下,对图片进行渲染的一个正向的过程。 空间坐标(x,y,z)发射的光线通过相机模型成为图片上…...
软件测试工程师:如何写出好的测试用例?
软件测试用例(Test Case)是软件测试过程中的一种详细文档或描述,用于描述在特定条件下,对软件系统或组件进行测试的步骤、输入数据、预期输出和预期行为。编写高质量的测试用例是确保软件质量的关键步骤之一。以下是一些编写优秀测试用例的建议ÿ…...
「图::连通」详解并查集并实现对应的功能 / 手撕数据结构(C++)
目录 概述 成员变量 创建销毁 根节点访问 路径压缩 启发式合并 复杂度 Code 概述 并查集,故名思议,能合并、能查询的集合,在图的连通性问题和许多算法优化上着广泛的使用。 这是一个什么数据结构呢? 一般来讲,并查集是…...
基于PSO粒子群优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) PSO优化过程: PSO优化前后,模型训练对比: 数据预测对比: 误差回归对比&a…...
PyTorch 的 DataLoader 类介绍
DataLoader 类 功能与作用 PyTorch 是一个流行的开源机器学习库,它提供了一个名为 DataLoader 的类,用于加载数据集并将其封装成一个可迭代的对象。DataLoader 可以自动地将数据集划分为多个批次,并在训练过程中迭代地返回这些批次。是用于加…...
【设计模式系列】命令模式
目录 一、什么是命令模式 二、命令模式的角色 三、命令模式的典型应用场景 四、命令模式在Runnable中的应用 一、什么是命令模式 命令模式(Command Pattern)是一种行为设计模式,它将一个请求或简单操作封装为一个对象。这个模式提供了一种…...
uniapp中使用lottie实现JSON动画
uniapp中使用lottie实现JSON动画 不喜欢废话直接开干一、引入相关依赖二、在项目的目录新建目录结构三、操作步骤四、编写自定义组件代码五、组件的使用提一嘴更多lottie-web常用方法添加点击事件 不喜欢废话直接开干 一、引入相关依赖 npm install lottie-web # 如果有问题可…...
AcWing275
题目重述 这道题的核心是利用方格取数模型的思想,将两条路径的传递过程映射为同时出发的两条路径,避免重复格子的经过。题解通过以下步骤解题: 路径映射:从 (n, m) 回到 (1, 1) 的路径,可以转换成 (1, 1) 到 (n, m) …...
Windows系统部署redis自启动服务【亲测可用】
文章目录 引言I redis以本地服务运行(Windows service)使用MSI安装包配置文件,配置端口和密码II redis服务以终端命令启动缺点运行redis-server并指定端口和密码III 知识扩展确认redis-server可用性Installing the Service引言 服务器是Windows系统,所以使用Windows不是re…...
深入了解机器学习 (Descending into ML):线性回归
人们早就知晓,相比凉爽的天气,蟋蟀在较为炎热的天气里鸣叫更为频繁。数十年来,专业和业余昆虫学者已将每分钟的鸣叫声和温度方面的数据编入目录。Ruth 阿姨将她喜爱的蟋蟀数据库作为生日礼物送给您,并邀请您自己利用该数据库训练一…...
每日OJ题_牛客_集合_排序_C++_Java
目录 牛客_集合_排序 题目解析 C代码 Java代码 牛客_集合_排序 集合_牛客题霸_牛客网 (nowcoder.com) 题目解析 笔试题可直接用set排序,面试可询问是否要手写排序函数,如果要手写排序,推荐写快排。 C代码 #include <iostream> …...
鸿蒙网络编程系列27-HTTPS服务端证书的四种校验方式示例
1. 服务端数字证书验证的问题 在鸿蒙客户端对服务端发起HTTPS请求时,如果使用HttpRequest的request发起请求,那么就存在服务端数字证书的验证问题,你只有两个选择,一个是使用系统的CA,一个是使用自己选定的CA…...
scala继承
Scala中继承的定义为在原有类的基础上定义一个新类,原有类称为父类,新类称为子类。 当子类从父类中继承的方法不能满足需要时,子类需要有自己的行为,怎么办? 此时使用override可以重写父类方法。 class Aniaml(){va…...
【Hive】2-Apache Hive概述、架构、组件、数据模型
Apache Hive概述 什么是Hive Apache Hive是一款建立在Hladoop之上的开源数据仓库系统,可以将存储在Hadoop文件中的结构化、半结构化数据文件映射为一张数据库表,基于表提供了一种类似SQL的查询模型,称为Hive查询语言(HQL),用于访…...
OpenClaw技能开发:为千问3.5-9B扩展自定义功能
OpenClaw技能开发:为千问3.5-9B扩展自定义功能 1. 为什么需要自定义技能? 去年冬天,我接手了一个重复性极高的数据整理工作——每天需要从十几个不同格式的Excel文件中提取特定字段,合并后生成日报。当我第三次在凌晨两点对着屏…...
别再死记硬背!用孙楠老师的《现代模拟集成电路设计》轻松搞定CMOS差分放大器设计
从零到精通:孙楠《现代模拟集成电路设计》中的CMOS差分放大器实战指南 模拟集成电路设计常被视为电子工程领域的"黑魔法",尤其是CMOS差分放大器这一核心模块。许多初学者在拉扎维等经典教材的复杂公式推导中迷失方向,却不知如何将…...
Linux/Android文件系统架构深度剖析
文章目录一、preface1、资料快车2、概述3、专业术语二、Linux文件系统架构1、文件系统框架图2、文件系统之块设备字符设备框架3、内核如何读取文件?4、文件系统类型1)持久文件系统1、本地文件系统2、网络文件系统2)运行时文件系统3࿰…...
【自动驾驶C++部署黄金法则】:20年老司机亲授5大避坑指南,90%团队在第3步就翻车?
第一章:自动驾驶C部署的底层逻辑与行业现状 自动驾驶系统在量产落地过程中,C因其零成本抽象、确定性内存管理、硬实时支持能力及与硬件驱动/传感器SDK的天然兼容性,成为感知、规划、控制等核心模块部署的首选语言。其底层逻辑根植于对计算资源…...
STM32定时器级联功能实战:如何构建64位定时器
1. 为什么需要64位定时器? 在嵌入式开发中,32位定时器对于大多数应用场景已经足够用了。比如一个72MHz的STM32,32位定时器最大能计时的时长大约是59.6秒(2^32/72MHz)。但在一些特殊场景下,比如需要记录设备…...
JBoltAI框架4.2版本更新:Java开发者的AI新利器
近日,JBoltAI框架发布了V4.2版本,为Java开发企业和团队带来了一系列实用且强大的新功能。这一版本在保持原有架构优势的基础上,进一步拓展了AI应用的可能性,让Java开发者能够更轻松地构建智能化的企业应用。一、多模态交互升级V4.…...
HiFloat8:高性能训练之路
Float8单数据格式FP8/HiF8训练算法介绍Float8混合精度训练策略随着预训练模型(尤其是基于Transformer架构的大语言模型)参数规模突破千亿级,训练过程面临愈发严重的算力和内存瓶颈,成本极高。在此背景下,8位浮点逐渐成…...
解密AI艺术二维码:5步掌握control_v1p_sd15_qrcode_monster实战进阶
解密AI艺术二维码:5步掌握control_v1p_sd15_qrcode_monster实战进阶 【免费下载链接】control_v1p_sd15_qrcode_monster 项目地址: https://ai.gitcode.com/hf_mirrors/monster-labs/control_v1p_sd15_qrcode_monster 你是否曾为传统二维码的单调外观感到遗…...
3大核心功能彻底解决环世界MOD管理难题:RimSort完整指南
3大核心功能彻底解决环世界MOD管理难题:RimSort完整指南 【免费下载链接】RimSort RimSort is an open source mod manager for the video game RimWorld. There is support for Linux, Mac, and Windows, built from the ground up to be a reliable, community-ma…...
NASA Earthdata保姆级教程:手把手教你用矩形框批量下载MODIS和VIIRS遥感数据
NASA Earthdata零基础实战:从注册到批量下载MODIS/VIIRS遥感数据的完整指南 第一次接触NASA Earthdata网站时,面对满屏的专业术语和复杂操作界面,大多数科研新手都会感到手足无措。作为全球最大的对地观测数据平台之一,Earthdata…...
