攻击动画配置
配置不同的连击动画
新增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段变成了三段