【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月前
|
定位技术 C# 图形学
从零开始的unity3d入门教程(二)----基本功能讲解
这是一篇Unity3D入门教程,详细介绍了Unity界面操作、游戏物体创建修改、场景搭建、玩家控制、音效添加以及游戏测试和导出的全过程。
从零开始的unity3d入门教程(二)----基本功能讲解
|
4月前
|
图形学
小功能⭐️Unity UnityEvent实现代码的选择
小功能⭐️Unity UnityEvent实现代码的选择
|
3月前
|
图形学 C++ C#
Unity插件开发全攻略:从零起步教你用C++扩展游戏功能,解锁Unity新玩法的详细步骤与实战技巧大公开
【8月更文挑战第31天】Unity 是一款功能强大的游戏开发引擎,支持多平台发布并拥有丰富的插件生态系统。本文介绍 Unity 插件开发基础,帮助读者从零开始编写自定义插件以扩展其功能。插件通常用 C++ 编写,通过 Mono C# 运行时调用,需在不同平台上编译。文中详细讲解了开发环境搭建、简单插件编写及在 Unity 中调用的方法,包括创建 C# 封装脚本和处理跨平台问题,助力开发者提升游戏开发效率。
296 0
|
3月前
|
图形学 开发者 UED
Unity游戏开发必备技巧:深度解析事件系统运用之道,从生命周期回调到自定义事件,打造高效逻辑与流畅交互的全方位指南
【8月更文挑战第31天】在游戏开发中,事件系统是连接游戏逻辑与用户交互的关键。Unity提供了多种机制处理事件,如MonoBehaviour生命周期回调、事件系统组件及自定义事件。本文介绍如何有效利用这些机制,包括创建自定义事件和使用Unity内置事件系统提升游戏体验。通过合理安排代码执行时机,如在Awake、Start等方法中初始化组件,以及使用委托和事件处理复杂逻辑,可以使游戏更加高效且逻辑清晰。掌握这些技巧有助于开发者更好地应对游戏开发挑战。
160 0
|
4月前
|
图形学 C# 开发者
Unity粒子系统全解析:从基础设置到高级编程技巧,教你轻松玩转绚丽多彩的视觉特效,打造震撼游戏画面的终极指南
【8月更文挑战第31天】粒子系统是Unity引擎的强大功能,可创建动态视觉效果,如火焰、爆炸等。本文介绍如何在Unity中使用粒子系统,并提供示例代码。首先创建粒子系统,然后调整Emission、Shape、Color over Lifetime等模块参数,实现所需效果。此外,还可通过C#脚本实现更复杂的粒子效果,增强游戏视觉冲击力和沉浸感。
276 0
|
4月前
|
开发者 图形学 前端开发
绝招放送:彻底解锁Unity UI系统奥秘,五大步骤教你如何缔造令人惊叹的沉浸式游戏体验,从Canvas到动画,一步一个脚印走向大师级UI设计
【8月更文挑战第31天】随着游戏开发技术的进步,UI成为提升游戏体验的关键。本文探讨如何利用Unity的UI系统创建美观且功能丰富的界面,包括Canvas、UI元素及Event System的使用,并通过具体示例代码展示按钮点击事件及淡入淡出动画的实现过程,助力开发者打造沉浸式的游戏体验。
116 0
|
4月前
|
图形学
Unity动画☀️Unity动画系统Bug集合
Unity动画☀️Unity动画系统Bug集合
|
4月前
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
220 6
|
4月前
|
图形学 缓存 算法
掌握这五大绝招,让您的Unity游戏瞬间加载完毕,从此告别漫长等待,大幅提升玩家首次体验的满意度与留存率!
【8月更文挑战第31天】游戏的加载时间是影响玩家初次体验的关键因素,特别是在移动设备上。本文介绍了几种常见的Unity游戏加载优化方法,包括资源的预加载与异步加载、使用AssetBundles管理动态资源、纹理和模型优化、合理利用缓存系统以及脚本优化。通过具体示例代码展示了如何实现异步加载场景,并提出了针对不同资源的优化策略。综合运用这些技术可以显著缩短加载时间,提升玩家满意度。
295 5