[Unity Demo]从零开始制作空洞骑士Hollow Knight第十六集(下篇):制作小BOSS龙牙哥

devtools/2024/10/24 18:29:49/

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、制作小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:

压迫感来了:

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


http://www.ppmy.cn/devtools/128490.html

相关文章

如何将闲置平板变为电脑显示器?GameViewer远程助你低成本实现0门槛副屏串流!

家里有闲置的平板还能把它变成电脑显示器?这么不可思议的操作,使用网易GameViewer远程就能助你低成本实现0门槛副屏串流。关于副屏串流,可能还有一部分人不太清楚是什么,在这里简单解释一下,就是能让你多一块显示屏进行…

Star Tower:智能合约的安全基石与未来引领者

在区块链技术的快速发展中,智能合约作为新兴的应用形式,正逐渐成为区块链领域的重要组成部分。然而,智能合约的可靠性问题一直是用户最为关心的焦点之一。为此,Star Tower以其强大的技术实力和全面的安全保障措施,为智…

探索 Web Audio API 的奇妙世界

Web Audio API 是一项强大而灵活的 JavaScript API,它允许开发者在网页中处理和生成音频。本文将带您深入了解 Web Audio API 的基本概念,并介绍一些令人兴奋的应用场景。 1. 什么是 Web Audio API? Web Audio API 是一组用于处理和生成音频…

【Kafka】Kafka源码解析之producer过程解读

从本篇开始 打算用三篇文章 分别介绍下Producer生产消费,Consumer消费消息 以及Spring是如何集成Kafka 三部分,致于对于Broker的源码解析,因为是scala语言写的,暂时不打算进行学习分享。 总体介绍 clients : 保存的是Kafka客户端…

pycharm 中提示ModuleNotFoundError: No module named ‘distutils‘

在Pycharm 中的命令行中输入 pip install setuptools,即可解决

【AI创新】优化ChatGPT提示词Prompt设计:释放AI的无限潜能

【AI创新】优化ChatGPT提示词Prompt设计:释放AI的无限潜能 文章目录 🌟 引言🌟 第一性原理在Prompt设计中的应用系统与用户信息的深度融合实际应用案例分析结论 🌟 系统信息与用户信息的协同作用系统信息(SYSTEM Infor…

前端遮罩层的应用

最近微信小程序需要开发新手引导功能&#xff0c;发现需要在遮罩层中间抠一个洞出来&#xff0c;但是一直不知道该怎么去做&#xff0c;其实很简单&#xff0c;先展示源码&#xff1a; <template><div class"num01">hello<div class"mask"&…

Qt:错点自定义文档怎么解决问题

一.项目运行出现自定义文档 二.依次点击左侧&#xff1a;项目->运行->运行配置 三.下拉运行配置选择框&#xff1a;选择项目运行名称