Unity学习笔记(四)如何实现角色攻击、组合攻击

前言

本文为Udemy课程The Ultimate Guide to Creating an RPG Game in Unity学习笔记

实现动画

首先实现角色移动的动画,动画的实现过程在第二篇,这里仅展示效果

attack1

请添加图片描述

触发攻击动画

实现脚本

接下来我们通过 Animator 编辑动画之间的过渡,以及检测是否移动(isAttacking)

在这里插入图片描述

可以攻击的条件:

  • 在地面上
  • 攻击有间隔时间
  • 攻击时不能移动

实现攻击:

  • 通过鼠标点击触发攻击
  • 判断是非为攻击状态
  • 设置攻击动画,攻击动画结束时通过事件触发

脚本新增内容 player2 ,删除了除了本功能以外的代码

public class Player2 : MonoBehaviour
{[Header("Attack info")][SerializeField] private float comboTime = .3f;private bool isAttacking;private float comboTimeWindow;private float xInput;void Update(){...comboTimeWindow -= Time.deltaTime;AnimatorContronllers();...}private void CheckInput(){if (Input.GetKeyDown(KeyCode.Mouse0)){ShartAttackEvent();}...}private void ShartAttackEvent(){if (!isGrounded)return;isAttacking = true;comboTimeWindow = comboTime;}public void AttackOver(){isAttacking = false;}private void Movement(){xInput = Input.GetAxisRaw("Horizontal");// 不能边打边走if (isAttacking){rb.velocity = new Vector2(0, 0);}else if (dashTime > 0){rb.velocity = new Vector2(facingDir * dashSpeed, 0);}else{rb.velocity = new Vector2(xInput * moveSpeed, rb.velocity.y);}}private void AnimatorContronllers(){...anim.SetBool("isAttacking", isAttacking);}
}

动画结束事件脚本

public class Player2AnimEvent : MonoBehaviour
{private Player2 player;void Start(){player = GetComponentInParent<Player2>();}private void AnimationTrigger(){player.AttackOver();}
}

动画添加事件

将事件脚本加到 Animator 这里

在这里插入图片描述
在这里插入图片描述

注意这里不能过度到自己
在这里插入图片描述
这里要有退出时间,使用attacking = false进行过度太突兀了。使用动画的退出时间比较平滑
在这里插入图片描述

最终效果

请添加图片描述

实现组合攻击

attack2
请添加图片描述

attack3
请添加图片描述
组合攻击条件

  • 处于攻击状态
  • 在一定时间内连续攻击
  • 组合攻击完之后我们可以循环进行组合攻击

实现条件

  • 我们需求当前是第几次攻击
  • 我们需要知道第二次攻击间隔时间

我们要设置 Animator 的参数

记得要在 attack 2 和 attack3 设置动画结束事件

在这里插入图片描述

代码变化

public class Player2 : MonoBehaviour
{[Header("Attack info")][SerializeField] private float comboTime = .3f;private bool isAttacking;private float comboTimeWindow;public int comboCounter;private float xInput;void Update(){...comboTimeWindow -= Time.deltaTime;AnimatorContronllers();...}private void CheckInput(){if (Input.GetKeyDown(KeyCode.Mouse0)){ShartAttackEvent();}...}private void ShartAttackEvent(){if (!isGrounded)return;if (comboTimeWindow < 0)comboCounter = 0;isAttacking = true;comboTimeWindow = comboTime;}public void AttackOver(){comboCounter++;isAttacking = false;if (comboCounter > 2)comboCounter = 0;}private void AnimatorContronllers(){...anim.SetBool("isAttacking", isAttacking);anim.SetInteger("comboCounter", comboCounter);}
}

最终效果

请添加图片描述

扩展

我们可以使用混合树来实现组合攻击吗?(混合树(Blend Tree)和子状态机(Sub-State Machine)的区别)

在Unity动画系统中,混合树(Blend Tree**)** 和 子状态机(Sub-State Machine) 是Animator Controller中两种不同的功能,它们用于组织和管理动画的播放,但它们的使用场景和目的不同。以下是两者的区别:

  1. 混合树(Blend Tree**)**

概念

  • 混合树是一种用于基于输入参数动态混合多个动画的结构。
  • 它的主要功能是通过一个或多个输入参数(如速度、角度等)来实时混合动画,从而实现平滑的动画过渡。

主要特点

  • 动态混合动画:允许根据输入参数的变化动态调整多个动画的权重,生成过渡自然的效果。
  • 主要用于运动动画:常用于需要连续平滑过渡的动画,如角色移动(行走、奔跑、慢跑)或视角调整。
  • 单个动画状态:混合树属于Animator中的单个状态,且其内部不支持条件判断或过渡关系。

使用场景

  1. 运动动画:例如,根据“速度”参数在站立、行走、跑步之间动态过渡。
  2. 方向调整:例如,结合“前后”和“左右”输入参数混合8个方向的动画(如8方向移动)。
  3. 平滑控制:任何需要基于输入参数动态调整动画权重的场景。

优点

  • 提供平滑的动画过渡。
  • 通过参数驱动,节省了状态之间过渡的复杂性。
  • 使用简单,易于可视化调整。
  1. 子状态机(Sub-State Machine)

概念

  • 子状态机是一种用于将动画状态组织成逻辑组的工具。
  • 它的主要功能是提高复杂状态机的可读性和可维护性,通过将多个动画状态归类到子状态机中。

主要特点

  • 逻辑分组:可以将多个相关的动画状态封装在一个子状态机中,便于管理。
  • 支持状态切换:子状态机内部的状态可以彼此过渡,且子状态机与外部状态之间也可以进行切换。
  • 条件驱动:通过参数和条件来控制动画状态的切换。

使用场景

  1. 复杂动画状态机:当Animator有太多的动画状态时,可以用子状态机来简化结构。例如,将“站立状态”、“战斗状态”、“跳跃状态”分别封装到子状态机中。
  2. 分层管理动画:将动画状态逻辑分层以提高可维护性和可扩展性。
  3. 模块化设计:当不同模块(如战斗、移动)有独立逻辑时,可以分别用子状态机实现。

优点

  • 简化复杂的状态机结构。
  • 增强可读性和逻辑清晰度。
  • 易于扩展,适合有大量状态的项目。
混合树 VS 子状态机

特性混合树(Blend Tree)子状态机(Sub-State Machine)功能动态混合多个动画,生成平滑的动画过渡逻辑分组多个动画状态,简化状态机管理主要用途用于基于输入参数动态调整动画(如移动速度、方向)用于管理和组织复杂的动画状态动画过渡内部动画通过参数动态混合,无需显式设置过渡状态之间通过过渡条件切换层次结构属于单个动画状态包含多个动画状态典型场景行走、跑步、转向等连续变化的动画各种独立的动画状态(如战斗、移动、跳跃等逻辑)灵活性专注于参数驱动的动态效果适合逻辑复杂的动画状态机

如何选择?
  • 选择混合树
    • 如果需要通过参数动态调整动画,例如在不同速度、角度下生成平滑过渡的运动动画。
    • 如果关注的是动画的平滑效果,而不是状态逻辑的复杂性。
  • 选择子状态机
    • 如果需要组织大量动画状态,或需要逻辑分组来简化复杂状态机的设计。
    • 如果动画状态之间的切换需要明确的条件和逻辑判断。

总结

  • 混合树专注于动画平滑过渡,解决的是“一个状态内的动画动态混合问题”。
  • 子状态机专注于状态管理和逻辑组织,解决的是“动画状态机结构复杂性的问题”。

根据具体需求决定使用哪种工具,或者在复杂项目中结合使用两者,可以达到最佳效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/66056.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis的集群模式与ELK基础

一、redis的集群模式 1.主从复制 &#xff08;1&#xff09;概述 主从模式&#xff1a;这是redis高可用的基础&#xff0c;哨兵和集群都是建立在此基础之上。 主从模式和数据库的主从模式是一样的&#xff0c;主负责写入&#xff0c;然后把写入的数据同步到从服务器&#xff…

一套比较简单的仓储系统

自己编写的一套比较简单的仓储系统&#xff0c;多仓库&#xff0c;入库、出库、明细、统计等相关功能 基于偌依的单体架构&#xff1a;springbootvueuniapp 后端&#xff1a;https://download.csdn.net/download/qq_30641447/90214834 前端&#xff1a;https://download.csdn…

网络IP协议

IP&#xff08;Internet Protocol&#xff0c;网际协议&#xff09;是TCP/IP协议族中重要的协议&#xff0c;主要负责将数据包发送给目标主机。IP相当于OSI&#xff08;图1&#xff09;的第三层网络层。网络层的主要作用是失陷终端节点之间的通信。这种终端节点之间的通信也叫点…

设计模式 创建型 原型模式(Prototype Pattern)与 常见技术框架应用 解析

原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;其核心思想在于通过复制现有的对象&#xff08;原型&#xff09;来创建新的对象&#xff0c;而非通过传统的构造函数或类实例化方式。这种方式在需要快速创建大量相似对象时尤为高效&#x…

MySQL(二)MySQL DDL数据库定义语言

1. MySQL DDL数据库定义语言 1.1. MySQL定义语言 进入MySQL mysql -u root -p(回车后输入密码&#xff0c;即可进入mysq1)1.1.1. 数据库操作 &#xff08;1&#xff09;查看数据库 mysql>show databases;注:MySQL语句分隔符为“&#xff1b;”   mysql库很重要它里面有…

前端页面上传文件:解决 ERR_UPLOAD_FILE_CHANGED

文章目录 引言I 问题 ERR_UPLOAD_FILE_CHANGED问题重现步骤原因II 解决方法将文件转换为base64再转回file检测文件内容是否发生变更III 知识扩展发送一个包含文件和文本的multipart/form-data请求签名优化引言 文件上传应用场景:船舶设备的新增导入(基础信息:出厂编号)船舶…

学术写作中的各种流程图如何利用Kimi进行辅助构建?

目录 1.学术论文中的流程图 2.一些小实践 3.论文中严谨的实践流程 近期小编在思考使用AI工具制作流程图和思维导图&#xff0c;结果发现Kimi现在支持流程图了&#xff0c;Kimi在学术写作中的应用变得更加广泛和深入。随着AIGC技术的不断进步&#xff0c;Kimi的功能将更加强大…

竞品分析对于ASO优化的重要性

产品要想在拥有上千万款App的App Store中脱颖而出的话&#xff0c;要有绝对优势和运营方案&#xff0c;才有可能获得用户的关注。我们要分析和自身产品相似的功能&#xff0c;了解用户获取的途径等&#xff0c;从中获取对竞品有利的因素&#xff0c;明确自身产品的增加和优化方…

什么是485专用屏蔽线

文章目录 一,485屏蔽线基本概念二,485屏蔽线结构及工作原理1、结构2、工作原理三,485屏蔽线的应用一,485屏蔽线基本概念 485屏蔽线,顾名思义,是一种应用于RS-485通信系统的屏蔽线缆。RS_485是一种常用的有线通信协议,具有长距离、高速率、低成本等优点,广泛应用于工业自…

JavaScript BOMDOM

BOM window、document、location、navigator 和 screen等&#xff0c;把它们统称为BOM&#xff08;Browser Object Model&#xff0c;浏览器对象模型&#xff09; window对象 window对象位于BOM的顶层。由浏览器创建&#xff0c;也对应JavaScript本地对象Global &#xff1…

nginx高可用集群搭建

本文介绍nginx高可用集群的搭建。利用keepalived实时检查nginx进程是否存活、keepalived的虚拟ip技术&#xff0c;达到故障转移的目的。终端用户通过访问虚拟ip&#xff0c;感知不到实际发生的故障。架构图如下&#xff1a; 0、环境 Ubuntu&#xff1a;22.04.2 ltsnginx: 1.…

【开源】创建自动签到系统—QD框架

1. 介绍 QD是一个 基于 HAR 编辑器和 Tornado 服务端的 HTTP 定时任务自动执行 Web 框架。 主要通过抓包获取到HAR来制作任务模板&#xff0c;从而实现异步响应和发起HTTP请求 2. 需要环境 2.1 硬件需求 CPU&#xff1a;至少1核 内存&#xff1a;推荐 ≥ 1G 硬盘&#xff1a;推…

【数据结构Ⅰ复习题】

如有错误欢迎指正&#xff0c;题目根据教材----------严蔚敏数据结构&#xff08;c语言版 第2版&#xff09;人民邮电电子版 数据结构Ⅰ复习题 一、填空题1&#xff0e;算法应该具备的5个重要特性有___有穷性___、确定性、可行性、输入和输出。2&#xff0e;非空单链表L中*p是头…

python爬虫--小白篇【selenium自动爬取文件】

一、问题描述 在学习或工作中需要爬取文件资源时&#xff0c;由于文件数量太多&#xff0c;手动单个下载文件效率低&#xff0c;操作麻烦&#xff0c;采用selenium框架自动爬取文件数据是不二选择。如需要爬取下面网站中包含的全部pdf文件&#xff0c;并将其转为Markdown格式。…

Edge Scdn的应用场景有哪些?

酷盾安全Edge Scdn 具备强大的安全防护能力&#xff0c;通过多层防御机制&#xff0c;如防火墙、DDoS 攻击防护、入侵检测和防御、数据加密等&#xff0c;有效抵御各种网络攻击&#xff0c;包括 DDoS 攻击、CC 攻击、SQL 注入攻击、XSS 跨站脚本攻击等&#xff0c;保障网站和应…

TCPDump参数详解及示例

TCPDump参数详解及示例 TCPDump参数详解TCPDump -G的示例TCPDump -i any -s 2048 -G 600 -p udp -Z root -n -X -tt -w %Y_%m%d_%H%M_%S.pcap &的含义TCPDump是一款强大的网络数据包截获分析工具,可以将网络中传送的数据包的完全截获下来提供分析。它支持针对网络层、协议…

Vue2: table加载树形数据的踩坑记录

table中需要加载树形数据,如图: 官网给了两个例子,且每个例子中的tree-props都是这么写的: :tree-props="{children: children, hasChildren: hasChildren}" 给我一种错觉,以为数据结构中要同时指定children和hasChildren字段,然而,在非懒加载模式下,数据结…

SpringCloudAlibaba实战入门之Sentinel服务降级和服务熔断(十五)

一、Sentinel概述 1、Sentinel是什么 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 一句话概括:sentinel即Hystrix的替代品,官网: https://sentinelguard.io/zh…

问题清除指南|关于num_classes与 BCELoss、BCEWithLogitsLoss 和 CrossEntropyLoss 的关系

前言&#xff1a;关于「 num_classes 1 」引发的探究。 2024年尾声&#xff0c;学弟问到一个问题&#xff1a;在研究工作 CNNDetection 的github开源代码 networks/trainer.py 文件的 line 27 self.model resnet50(num_classes1) 中&#xff0c;变量 num_classes 的值为1&…