unity实现 动作游戏的连招/连击

工程下载:https://files.cnblogs.com/files/sanyejun/ComboAttack.7z

全网也没查到比较好的资料,自己弄了个

一共是3个脚本

先上图

 

 黑色为触发条件

绿色和红色为2个动画Behaviour脚本

注意:attack01  attack02    attack03  ——> idle  的has exit time 需要勾选上,其他的都不用

然后attack01 可以连到 attack02 , attack02 可以连到 attack03

那么attack01 和 attack02  需要在动画转折的地方添加动画事件

一个动作

【1.起手】--------------【2.攻击】--------------【3.准备收招转idle】---------------【4.转idle】

那么在 3 这个时间点,添加动画事件,如果可以连击,进入下一个攻击动作,没有的话则进入idle

添加事件:ComboCheck   参数:Int  如果需要2下进下个动作则填 2,   3下则填3

我们这里的attack01 填参数2     attack03填参数3

 

 脚本:

挂人物身上的

复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ComboAttack : MonoBehaviour
{
    public Animator anim;
    public int clickNum = 0;
    private float lastClickedTime = 0;
    //2下连击之间按键的最长延迟
    public float maxComboDelay = 0.9f;
    private static readonly int AttackCombo = Animator.StringToHash("attackCombo");

    // Start is called before the first frame update
    void Start()
    {
        anim = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Time.time - lastClickedTime > maxComboDelay)
        {
            clickNum = 0;
        }

        if (Input.GetMouseButtonDown(0))
        {
            lastClickedTime = Time.time;
            clickNum++;
            if (clickNum == 1)
            {
                anim.SetBool(AttackCombo, true);
            }

            clickNum = Mathf.Clamp(clickNum, 0, 3);
        }
    }

    public void ComboCheck(int num)
    {
        if (clickNum >= num)
        {
            anim.SetBool(AttackCombo, true);
        }
    }

    public void ClearComboClickNum()
    {
        clickNum = 0;
    }
}
复制代码

 

动画的Behaviour

复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AttackComboNumClear : StateMachineBehaviour
{
    // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        animator.GetComponent<ComboAttack>().ClearComboClickNum();
    }
}
复制代码
复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AttackComboBehaviour : StateMachineBehaviour
{
    private static readonly int Attack = Animator.StringToHash("attackCombo");

    // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        animator.SetBool(Attack, false);
    }
}
复制代码

 

posted @   三页菌  阅读(3937)  评论(1编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
历史上的今天:
2018-04-12 Unity c#反射查找类中符合条件的方法并执行
点击右上角即可分享
微信分享提示