【unity小技巧】Unity中实现一个战斗连击连招系统,可以动态添加减少连击连招段数功能

简介: 【unity小技巧】Unity中实现一个战斗连击连招系统,可以动态添加减少连击连招段数功能

攻击动画配置

配置不同的连击动画

新增AttackSO

[CreateAssetMenu(menuName = "Attacks/Normal Attack")]
public class AttackSO : ScriptableObject
{
    // 动画覆盖控制器,用于在不同的攻击之间切换动画
    public AnimatorOverrideController animatorOV;

    // 攻击造成的伤害值
    public float damage;
}

配置不同的连击动画,新增动画覆盖控制器

配置不同段的连击攻击动画和伤害

武器脚本

新增Weapon 武器脚本

public class Weapon : MonoBehaviour
{
    public float damage;

    private Collider2D triggerBox;

    private void Start()
    {
        triggerBox = GetComponent<Collider2D>();
    }

    private void OnTriggerEnter2D(Collider2D other)
    {
        var enemy = other.gameObject.GetComponent<Enemy>();

        if (enemy != null)
        {
            enemy.currentHealth -= damage;

            if (enemy.currentHealth <= 0)
            {
                Destroy(enemy.gameObject);
            }
        }
    }

    // 激活触发器碰撞盒
    public void EnableTriggerBox()
    {
        triggerBox.enabled = true;
    }

    // 禁用触发器碰撞盒
    public void DisableTriggerBox()
    {
        triggerBox.enabled = false;
    }
}

新增角色攻击连击控制

public class PlayerCombo : MonoBehaviour
{
    public List<AttackSO> combo; // 攻击组合列表
    float lastClickedTime; // 上次点击时间
    float lastComboEnd; // 上次连击结束时间
    int comboCounter; // 连击计数
    Animator anim; // 动画控制器
    [SerializeField] Weapon weapon; // 武器

    void Start()
    {
        anim = GetComponent<Animator>();
    }

    void Update()
    {
        if (Input.GetButtonDown("Fire1"))
        {
            Attack();
        }
        ExitAttack();
    }

    // 处理攻击逻辑
    void Attack()
    {
        
        // 如果距离上次连击结束超过0.5秒且连击计数未超过最大值,取消当前的连击结束调用
        if (Time.time - lastComboEnd > 0.5f && comboCounter <= combo.Count)
        // if (comboCounter <= combo.Count)
        {
            CancelInvoke("EndCombo");


            // 如果距离上次点击攻击按钮超过0.2秒,执行新的攻击动作
            if (Time.time - lastClickedTime >= 0.2f)
            {
                // 设置动画覆盖控制器为当前连击阶段的动画
                anim.runtimeAnimatorController = combo[comboCounter].animatorOV;

                // 播放攻击动画
                anim.Play("Attack", 0, 0);

                // 设置武器的伤害值为当前连击阶段的伤害
                weapon.damage = combo[comboCounter].damage;

                // 增加连击计数
                comboCounter++;

                // 更新上次点击时间
                lastClickedTime = Time.time;

                // 如果连击计数超过最大值,重置连击计数
                if (comboCounter >= combo.Count)
                {
                    comboCounter = 0;
                }
            }
        }
    }

    // 检查并处理攻击退出逻辑
    void ExitAttack()
    {
        // 如果当前动画的播放进度超过90%并且动画为“Attack”,调用 EndCombo 方法
        if (anim.GetCurrentAnimatorStateInfo(0).normalizedTime > 0.9f && anim.GetCurrentAnimatorStateInfo(0).IsName("Attack"))
        {
            // Debug.Log(111);
            Invoke("EndCombo", 1);
        //    EndCombo();
        }
    }

    // 连击结束处理方法
    void EndCombo()
    {
        // 重置连击计数
        comboCounter = 0;

        // 更新上次连击结束时间
        lastComboEnd = Time.time;
    }
}

比如我先配置段攻击

攻击脚本

效果,两段攻击

动态添加另外一段攻击

比如拾取物品,新增一段攻击

新增物品脚本

public class AddToCombo : MonoBehaviour
{
    // 连击参数
    [SerializeField] AttackSO attack;

    private void OnTriggerEnter2D(Collider2D other)
    {
        var player = other.GetComponent<PlayerCombo>();

        if (player != null)
        {
            // 将新的连击参数添加到玩家的连击列表中
            player.combo.Add(attack);
            Destroy(gameObject);
        }
    }
}

配置

效果,拾取之后,玩家多添加了一段攻击

可以看到攻击从开始的2段变成了三段

目录
相关文章
|
4天前
|
存储 JSON 关系型数据库
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
12 2
|
4天前
|
图形学
【unity实战】Unity中基于瓦片的网格库存系统——类似《逃离塔科夫》的库存系统(下)
【unity实战】Unity中基于瓦片的网格库存系统——类似《逃离塔科夫》的库存系统
9 0
|
4天前
|
图形学 容器
【unity实战】Unity中基于瓦片的网格库存系统——类似《逃离塔科夫》的库存系统(上)
【unity实战】Unity中基于瓦片的网格库存系统——类似《逃离塔科夫》的库存系统
7 0
|
4天前
|
存储 JSON 图形学
【unity实战】制作unity数据保存和加载系统——小型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——小型游戏存储的最优解
6 0
|
4天前
|
存储 图形学
【unity小技巧】unity事件系统创建通用的对象交互的功能
【unity小技巧】unity事件系统创建通用的对象交互的功能
7 0
|
4天前
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版3(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版3(附带项目源码)
14 2
|
4天前
|
图形学
【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)
【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)
13 0
|
4天前
|
图形学
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(上)
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)
10 2
|
4天前
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版2(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版2(附带项目源码)
8 1
|
4天前
|
图形学
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(下)
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(下)
8 0