【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段变成了三段

目录
相关文章
|
1月前
|
C# 图形学 开发者
【Unity3D实例-功能-镜头】俯视角
本文介绍了Unity中常用的俯视角镜头实现方法,涵盖模型添加、角色Tag设置、摄像机脚本编写及测试运行,帮助开发者快速掌握俯视角在策略与模拟类游戏中的应用技巧。
201 0
|
1月前
|
人工智能 定位技术 C#
【Unity3D实例-功能-移动】通过鼠标点击进行角色移动
本文介绍了如何在Unity中实现鼠标点击控制角色移动的功能。通过安装导航网格、设置地图与角色、烘焙路径及编写脚本,带领读者一步步构建角色自动寻路系统,增强游戏交互体验。
100 0
|
2月前
|
C# 图形学 开发者
【Unity3D实例-功能-移动】复杂移动(Blend Tree方式)
本文介绍了使用Unity中Blend Tree实现角色移动控制的完整教程,涵盖动画器设置、Blend Tree创建、CharacterController组件添加及代码控制,帮助开发者实现流畅自然的角色动画效果。
74 0
|
2月前
|
图形学 开发者
【Unity3D实例-功能-移动】角色移动-通过WSAD(CharacterController方式)
本文介绍了如何在Unity中使用CharacterController组件实现角色灵活移动。内容包括模型准备、动画处理、添加组件、编写移动脚本及测试运行,帮助开发者快速掌握角色控制技巧,打造流畅的游戏体验。
139 0
|
2月前
|
C# 图形学 开发者
【Unity3D实例-功能-移动】角色移动-通过WSAD(Rigidbody方式)
本文介绍了如何在Unity中使用Rigidbody组件实现角色自由移动,包括模型准备、组件添加、脚本编写与测试运行,帮助开发者快速掌握基础角色控制技巧。
163 0
|
2月前
|
C# 图形学
【Unity3D实例-功能-移动】角色移动-通过WSAD(Transform方式)
本文介绍了如何在Unity中实现角色移动功能,使用Transform组件控制角色基础移动,并详细讲解了模型导入、动画设置、动画控制器配置及移动脚本编写等内容,适合Unity初学者学习角色控制的基础知识。
104 0
|
7月前
|
图形学 UED
unity Tab键实现切换输入框功能
该脚本用于简化输入框之间的Tab键切换操作。只需将脚本挂载在InputField上,无需其他设置。脚本通过监听Tab键和Shift键组合,自动选择下一个或上一个可交互的InputField,提升用户体验。
|
图形学 C++ C#
Unity插件开发全攻略:从零起步教你用C++扩展游戏功能,解锁Unity新玩法的详细步骤与实战技巧大公开
【8月更文挑战第31天】Unity 是一款功能强大的游戏开发引擎,支持多平台发布并拥有丰富的插件生态系统。本文介绍 Unity 插件开发基础,帮助读者从零开始编写自定义插件以扩展其功能。插件通常用 C++ 编写,通过 Mono C# 运行时调用,需在不同平台上编译。文中详细讲解了开发环境搭建、简单插件编写及在 Unity 中调用的方法,包括创建 C# 封装脚本和处理跨平台问题,助力开发者提升游戏开发效率。
1151 0
|
图形学 开发者 UED
Unity游戏开发必备技巧:深度解析事件系统运用之道,从生命周期回调到自定义事件,打造高效逻辑与流畅交互的全方位指南
【8月更文挑战第31天】在游戏开发中,事件系统是连接游戏逻辑与用户交互的关键。Unity提供了多种机制处理事件,如MonoBehaviour生命周期回调、事件系统组件及自定义事件。本文介绍如何有效利用这些机制,包括创建自定义事件和使用Unity内置事件系统提升游戏体验。通过合理安排代码执行时机,如在Awake、Start等方法中初始化组件,以及使用委托和事件处理复杂逻辑,可以使游戏更加高效且逻辑清晰。掌握这些技巧有助于开发者更好地应对游戏开发挑战。
578 0
|
图形学 C# 开发者
Unity粒子系统全解析:从基础设置到高级编程技巧,教你轻松玩转绚丽多彩的视觉特效,打造震撼游戏画面的终极指南
【8月更文挑战第31天】粒子系统是Unity引擎的强大功能,可创建动态视觉效果,如火焰、爆炸等。本文介绍如何在Unity中使用粒子系统,并提供示例代码。首先创建粒子系统,然后调整Emission、Shape、Color over Lifetime等模块参数,实现所需效果。此外,还可通过C#脚本实现更复杂的粒子效果,增强游戏视觉冲击力和沉浸感。
953 0