连击非第一击无伤害

在连击攻击敌人时,每次攻击开始和结束都设置同一个变量用于标识是否处于攻击状态。我的标识逻辑基于动画事件,在动画开始的第一帧和结束的最后一帧设置变量。先将触发事件的代码挂载在对应的动画上。

cs 复制代码
using UnityEngine;

public class AttackStateBehaviour : StateMachineBehaviour
{

    public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        animator.GetComponent<PlayerAction>()?.OnAttackEnter();
        Debug.Log($"[正确进入] 攻击状态,时间:{Time.time}");
    }

    public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        animator.GetComponent<PlayerAction>()?.OnAttackExit();
        Debug.Log($"[正确退出] 攻击状态,时间:{Time.time}");
    }
}

最初我的过渡动画时间为0.14s,测试结果为

这里发现不是我预期的开始->退出->开始->退出->开始->退出,第一次退出与第二次开始,第二次退出与第三次开始之间相隔时间都接近0.14s,现在将一二段攻击间缩短过渡时间到0.07s。

发现第一次退出和第二次开始之间相隔时间大约0.07s,第二次退出与第三次开始之间相隔大约0.14s。

这与我得预期相同,状态开始与结束受到过渡时间的影响,下面我将过渡时间设置为0,应该就能解决只有第一段攻击有伤害的问题。

符合预期,经检验,伤害判定也正常了,每段攻击都可以正确出伤。但是过渡时间设置为0导致了我的动画切换僵硬,我们需要使用其他办法。

可以直接在FSM有限状态机中,每个状态的进入与退出处设置,而不是用动画事件。现在我们加上过渡时间测试

符合预期,经检验,攻击判定也符合预期。其中一个攻击状态代码:

cs 复制代码
public void OnEnter()
{
    rootMotionController.applyRootMotion = true;
    rootMotionController.applyRootMotionPositionXZ = true;
    rootMotionController.applyRootMotionPositionY = false;
    rootMotionController.applyRootMotionRotation = true;
    rootMotionController.SetManualRotation(Quaternion.identity); // 清除程序旋转
    rootMotionController.SetManualMovement(Vector3.zero);

    playerBlackBoards.anim.SetTrigger("AttackTrigger");

    playerBlackBoards.anim.GetComponent<PlayerAction>()?.OnAttackEnter();
    Debug.Log($"[正确进入] 攻击状态,时间:{Time.time}");
}

public void OnExit()
{
    rootMotionController.applyRootMotion = false;

    playerBlackBoards.anim.GetComponent<PlayerAction>()?.OnAttackExit();
    Debug.Log($"[正确退出] 攻击状态,时间:{Time.time}");
}
相关推荐
SakitamaX1 小时前
LVS(Linux Virtual Server)概念详解
linux·运维·lvs
小张同学a.1 小时前
Linux系统管理
linux·运维
会飞的小新2 小时前
Windows CMD 与 PowerShell 深度解析:底层原理、命令差异、自动化选型指南
运维·windows·自动化
代码村新手2 小时前
Linux的基本指令
linux·运维·服务器
MonolithIoT3 小时前
实战方案|设备备件无人值守仓库:连续化产线运维备件 7×24 小时数字化管控方案
运维·网络·数据库
gwf2164 小时前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件
AAA@峥4 小时前
CentOS7 源码编译安装 MySQL5.7|SQL 基础操作 + 备份恢复完整实战
运维·数据库·sql·centos
Ai_easygo5 小时前
自动化客服Agent实战:用LangGraph+RAG+MCP把80%工单交给AI(从设计到部署)
运维·人工智能·自动化
2601_963282777 小时前
极寒专网技术拆解:黑龙江零下 40℃场景数字对讲组网全方案|黑龙江移远科技寒地通信底层技术解析
运维·网络·人工智能·科技
LedgerNinja7 小时前
WEEX API 稳定性实战:限频、重试与风控的工程化清单
运维·区块链