当前位置: 首页 > news >正文

Unity 人物连招(三段连击)

一: 连招思路

首先人物角色上有三个攻击实例对象 Damage,每一个damage定义了攻击的伤害值,攻击距离,触发器名称,伤害的发起者,攻击持续时间,攻击重置时间,伤害的碰撞框大小等字段:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;[System.Serializable]
public class Damage
{/// <summary>/// 触发动画触发器名称/// </summary>public string animationTrigger = "";/// <summary>/// 组合攻击伤害/// </summary>public int damage = 0;/// <summary>/// 伤害的攻击者/// </summary>public GameObject inflictor;/// <summary>/// 组合攻击持续时间/// </summary>public float duration = 1f;/// <summary>/// 连击重置时间 超过这个时间如果没有收到连击序列 连击将会被取消/// </summary>public float comboResetTime = .5f;[Space(10)][Header("hit collider settings")]public float collSize;public float collDistance;public float collHeight;}

当按下某一个键位的时候,播放对应索引的攻击,如果在攻击时间后再次收到了攻击键位的按下就认为是连击状态,这时候继续播放攻击动作。

二: 代码实现

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerCombat : MonoBehaviour
{// 主角的攻击组合public Damage[] attackCombo;// 主角的最后一次攻击类型public Damage lastAttack;// 记录最后一次攻击时间public float lastAttackTime;public PlayerController playerController;public CharactorState charactorState;// 最近一次攻击的索引public int attackIndex = 0;// 是否是连击状态public bool continueAttackCombo;void Awake(){playerController = GetComponent<PlayerController>();charactorState = GetComponent<CharactorState>();}public void combatEvent(){Debug.LogWarning("state is " + charactorState.curState);if (charactorState.curState != UnitState.ATTACK){// 是否在攻击窗口内bool insideComboWindow = (lastAttack != null && (Time.time < (lastAttackTime + lastAttack.duration + lastAttack.comboResetTime)));if (insideComboWindow && !continueAttackCombo && attackIndex < attackCombo.Length - 1){// 继续攻击attackIndex++;}else{// 重置攻击attackIndex = 0;}doAttack(attackCombo[attackIndex], UnitState.ATTACK);}if (charactorState.curState == UnitState.ATTACK && !continueAttackCombo && playerController.pc.isGround){if (attackIndex < attackCombo.Length - 1){// 已经处于攻击状态,且不是连续攻击 将连续攻击状态打开continueAttackCombo = true;return;}}}public void doAttack(Damage damage, UnitState state){Debug.Log("animationTrigger is " + damage.animationTrigger);if (damage.animationTrigger == "attack3"){Debug.Log("attack3");}lastAttackTime = Time.time;lastAttack = damage;lastAttack.inflictor = this.gameObject;charactorState.SetState(state);playerController.playerAnimation.setTrigger(damage.animationTrigger);Invoke("Ready", damage.duration);}public void Ready(){Debug.LogWarning("Ready");if (continueAttackCombo){// 重置是否继续连招动作 因为这个时候玩家没有触发攻击动作continueAttackCombo = false;if (attackIndex < attackCombo.Length - 1){attackIndex++;}else{attackIndex = 0;}Debug.LogWarning("连招" + attackCombo[attackIndex].animationTrigger);if (attackCombo[attackIndex] != null && attackCombo[attackIndex].animationTrigger.Length > 0){doAttack(attackCombo[attackIndex], UnitState.ATTACK);}}// 重置玩家状态charactorState.SetState(UnitState.IDLE);}// Update is called once per framevoid Update(){}
}

三:攻击窗口

如果当前主角的状态不是攻击状态,检查是否在攻击时间窗口内,如果在攻击时间窗口内就进行攻击索引的累加,否则攻击索引从0开始

if (charactorState.curState != UnitState.ATTACK){// 是否在攻击窗口内bool insideComboWindow = (lastAttack != null && (Time.time < (lastAttackTime + lastAttack.duration + lastAttack.comboResetTime)));if (insideComboWindow && !continueAttackCombo && attackIndex < attackCombo.Length - 1){// 继续攻击attackIndex++;}else{// 重置攻击attackIndex = 0;}doAttack(attackCombo[attackIndex], UnitState.ATTACK);}if (charactorState.curState == UnitState.ATTACK && !continueAttackCombo && playerController.pc.isGround){if (attackIndex < attackCombo.Length - 1){// 已经处于攻击状态,且不是连续攻击 将连续攻击状态打开continueAttackCombo = true;return;}}

相关文章:

Unity 人物连招(三段连击)

一&#xff1a; 连招思路 首先人物角色上有三个攻击实例对象 Damage,每一个damage定义了攻击的伤害值&#xff0c;攻击距离&#xff0c;触发器名称&#xff0c;伤害的发起者&#xff0c;攻击持续时间&#xff0c;攻击重置时间&#xff0c;伤害的碰撞框大小等字段&#xff1a; …...

关于WSL以及docker连接adb的坑

结论 WSL可以连接到adb&#xff0c;需要和主机保持一致的adb型号。主机是windows还是macOS的docker没法直接连接到adb设备&#xff0c;只有主机为Linux才可以。其他平台只能通过TCP网络协议。 具体过程 关于WSL连接adb设备 windows安装adb工具&#xff08;安装可以去官网下…...

python安装第三方包时报错:...\lib\site-packages\pip\_vendor\urllib3\response.py...

安装redis第三方包&#xff1a; pip install redis报错现象&#xff1a; 解决方法&#xff1a;使用以下命令可成功安装 pip install redis -i http://pypi.douban.com/simple --trusted-host pypi.douban.com...

腾讯云从业者认证考试考点——云存储产品

文章目录 存储产品功能云存储产品概述存储产品存储网关存储服务 存储分类按存储方式分按存储频率分 云存储与传统存储的区别功能需求性能需求容量扩展数据共享 云硬盘CBS产品概述归档存储和文件存储归档存储CAS文件存储CFS 对象存储存储网关存储网关的分类 云数据迁移CDM日志服…...

猿辅导Motiff与IXDC达成战略合作,将在UI设计领域推动AI革新更多可能性

近日&#xff0c;“IXDC 2023国际体验设计大会”在北京国家会议中心拉开序幕&#xff0c;3000设计师、1000企业、200全球商业领袖&#xff0c;共襄为期5天的用户体验创新盛会。据了解&#xff0c;此次大会是以“设计领导力”为主题&#xff0c;分享全球设计、科技、商业的前沿趋…...

条件操作符(三目操作符)

比如之前我们想写一个条件判断表达式是这样写的&#xff1a; 用操作符就可以这样写&#xff1a; 应用&#xff0c;比如求两个数的最大值...

(五)Unity开发Vision Pro——FAQ

常见问题 (FAQ) 1.问&#xff1a;我看到在visionOS 模拟器中运行的结果与在硬件上运行的结果不同 请注意&#xff0c;在模拟器中运行时&#xff0c;某些特定于硬件的功能不可用 - 最明显的是 AR 数据。这可能意味着 VisionOS 模拟器中的模拟结果可能与 Vision Pro 耳机上的模…...

GitOps 与 DevOps:了解关键差异,为企业做出最佳选择

在软件开发领域&#xff0c;GitOps 和 DevOps 是加强协作和实现软件交付流程自动化的重要技术。虽然这两种模式都旨在提高软件开发生命周期的效率&#xff0c;但它们的核心原则和实施方式却各不相同。 本篇文章将帮助您了解 GitOps 和 DevOps 之间的差异、它们的工作流程&am…...

Java实现Word文档转PDF,PDF转Word,PDF转Excel,PDF转换工具

前言 java实现word文档转PDF&#xff0c;PDF转word 解决只能转换4页问题 解决每页头部存在水印问题 实现 引入依赖 <dependency><groupId>com.documents4j</groupId><artifactId>documents4j-local</artifactId><version>1.0.3</ve…...

Docker部署ES服务,全量同步的时候内存爆炸,ES自动关闭,CPU100%

问题 使用canal-adapter全量同步&#xff08;参考Canal Adapter1.1.5版本API操作服务&#xff0c;手动同步数据&#xff08;4&#xff09;&#xff09;的时候 小批量数据可以正常运行&#xff08;几千条&#xff09;只要数据量一大&#xff08;上万条&#xff09;&#xff0c…...

Python——添加照片边框

原图&#xff1a; 添加边框后&#xff1a; 添加边框会读取照片的exif信息如时间、相机型号、品牌以及快门焦段等信息&#xff0c;将他们显示在下面的边框中。 获取当前py文件路径 import os #get path that py file located def Get_Currentpath():file_path os.path.abspa…...

《高性能MySQL》——查询性能优化(笔记)

文章目录 六、查询性能优化6.1 查询为什么会慢6.2 慢查询基础&#xff1a;优化数据访问6.2.1 是否向数据库请求了不需要的数据查询不需要的记录多表关联时返回全部列总是取出全部列重复查询相同的数据 6.2.2 MySQL 是否在扫描额外的记录响应时间扫描的行数与返回的行数扫描的行…...

【Linux操作系统】编译过程中遇到的问题-为什么加-c?执行文件提示无法执行二进制文件?main函数参数argc和*argv[]的作用和理解?

在使用GCC编译器进行程序开发时&#xff0c;我们经常会遇到一些编译过程中的问题&#xff0c; 比如为什么要加上"-c"选项&#xff0c;以及为什么生成的可执行文件无法执行等问题。 本篇博客将详细介绍这些问题&#xff0c;并给出相应的代码和解释&#xff0c;帮助读者…...

【数据结构与算法——TypeScript】图结构(Graph)

【数据结构与算法——TypeScript】 图结构(Graph) 认识图结构以及特性 什么是图? 在计算机程序设计中&#xff0c;图结构 也是一种非常常见的数据结构。 但是&#xff0c;图论其实是一个非常大的话题 认识一下关于图的一些内容 图的抽象数据类型一些算法实现。 什么是图?…...

C语言字符串拷贝函数详解及示例代码

目录 简介字符串拷贝函数 strcpy字符串拷贝函数 strcpy_s使用示例注意事项结束语 1. 简介 字符串拷贝是C语言中常用的操作之一。当需要将一个字符串复制到另一个字符串数组中时&#xff0c;可以使用字符串拷贝函数来实现。C语言提供了多种字符串拷贝函数&#xff0c;其中最常…...

IntelliJ IDEA热部署:JRebel插件的安装与使用

热部署 概述JRebel 概述 热部署&#xff0c;指修改代码后&#xff0c;无需停止应用程序&#xff0c;即可使修改后的代码生效&#xff0c;其有利于提高开发效率。 热部署方式&#xff1a; 手动热部署&#xff1a;修改代码后&#xff0c;重新编译项目&#xff0c;然后启动应用程…...

iTOP-3568开发板使用OpenCV处理图像-颜色转换

本小节代码在配套资料“iTOP-3568 开发板\03_【iTOP-RK3568 开发板】指南教程 \04_OpenCV 开发配套资料\05”目录下&#xff0c;如下图所示&#xff1a; cv2.cvtColor()函数功能&#xff1a; 将一幅图像从一个色彩空间转换到另一个色彩空间。 函数原型&#xff1a; cv2.cvt…...

Python技巧----解压序列/可迭代对象赋值给多个变量

1 、解压序列赋值给多个变量 我们这里说的不是正常情况的一一赋值比如下面 >>> data = [ ACME, 5, 9, (2012, 12, 1) ] >>> name, shares, price, date = data >>> name ACME...

16.3.2 【Linux】程序的管理

程序之间是可以互相控制的。举例来说&#xff0c;你可以关闭、重新启动服务器软件&#xff0c;服务器软件本身是个程序&#xff0c; 你既然可以让她关闭或启动&#xff0c;当然就是可以控制该程序。 使用kill-l或者是man 7 signal可以查询到有多少个signal。主要的讯号代号与名…...

Linux命令200例:date用于显示和设置系统的日期和时间

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…...

如何永久保存微信聊天记录并挖掘数据价值?WeChatMsg全攻略

如何永久保存微信聊天记录并挖掘数据价值&#xff1f;WeChatMsg全攻略 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/W…...

DevOps 实践与自动化:从开发到运维的无缝衔接

DevOps 实践与自动化&#xff1a;从开发到运维的无缝衔接 前言 作为一个在数据深渊里捞了十几年 Bug 的女码农&#xff0c;我深知 DevOps 在现代软件开发中的重要性。DevOps 不仅是一种技术实践&#xff0c;更是一种文化和思维方式&#xff0c;它强调开发和运维团队的紧密协作&…...

零信任架构下的企业数据安全防护体系设计与实践

1. 零信任架构&#xff1a;企业数据安全的新范式 过去十年我见过太多企业安全事件&#xff0c;根源往往在于传统边界防护的失效。某次给金融客户做安全评估时发现&#xff0c;他们花重金部署的防火墙就像个筛子——攻击者通过一个普通员工的钓鱼邮件就长驱直入&#xff0c;最终…...

自适应交易利器:KAMA指标在Python中的高效实现与实战解析

1. 认识KAMA指标&#xff1a;让移动平均线"活"起来 第一次接触KAMA指标是在2018年的一个量化交易项目中。当时我们团队正在寻找能够适应不同市场环境的趋势指标&#xff0c;传统的均线系统在震荡市中频繁发出假信号&#xff0c;而在趋势行情中又显得过于滞后。直到一…...

从音频到全身动捕:手把手教你用AudCast和DITs生成带手势的AI视频(附开源项目分析)

从音频到全身动捕&#xff1a;手把手教你用AudCast和DITs生成带手势的AI视频&#xff08;附开源项目分析&#xff09; 在数字内容创作领域&#xff0c;AI视频生成技术正经历从静态图像到动态交互的跨越式发展。传统音频驱动视频方案往往局限于面部表情同步&#xff0c;而全身动…...

如何使用unbuild在5分钟内搭建现代化JavaScript项目:终极快速指南

如何使用unbuild在5分钟内搭建现代化JavaScript项目&#xff1a;终极快速指南 【免费下载链接】unbuild &#x1f4e6; A unified JavaScript build system 项目地址: https://gitcode.com/gh_mirrors/un/unbuild 在当今快速发展的JavaScript生态系统中&#xff0c;构建…...

LangGraph条件边实战:手把手教你打造一个能‘看图说话’的客服工单分流Agent

LangGraph条件边实战&#xff1a;打造智能客服工单分流系统 想象一下&#xff0c;当用户向客服系统发送"我要退款"或"查询物流"这样的请求时&#xff0c;系统能像经验丰富的客服主管一样&#xff0c;瞬间理解意图并将工单精准路由到对应处理部门。这不再是…...

Yii2的EVENT_BEFORE_ACTION的本质的庖丁解牛

yii\base\Controller::EVENT_BEFORE_ACTION 是 Yii2 框架中 AOP&#xff08;面向切面编程&#xff09; 的核心锚点&#xff0c;也是 MVC 流程中的“安检门”。 它的本质是&#xff1a;在具体的业务逻辑&#xff08;Action&#xff09;执行之前&#xff0c;提供的一个“拦截、验…...

性能实测:登临Goldwasser V2加速卡跑YOLOv5s,对比CPU看速度提升多少?

登临Goldwasser V2加速卡YOLOv5s实测&#xff1a;从环境配置到性能对比的全流程拆解 当目标检测任务遇上边缘计算场景&#xff0c;算力与能效的平衡往往成为工程落地的关键瓶颈。上周在部署某工业园区安防系统时&#xff0c;我们尝试用登临科技的Goldwasser V2加速卡运行YOLOv5…...

Maya Arnold前台渲染无响应问题排查与解决

1. Maya Arnold前台渲染无响应问题排查指南 最近在Maya中使用Arnold渲染时&#xff0c;不少朋友都遇到了前台渲染无响应的问题。点击渲染按钮后&#xff0c;Render View窗口毫无反应&#xff0c;就像什么都没发生过一样。这种情况在动画场景整合阶段尤其常见&#xff0c;我自己…...