using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class playerAttack : MonoBehaviour
{
public CapsuleCollider attackHitbox;
public InputAction attackAction;
public AudioSource audioSource;
public AudioClip[] attackClips;
private Animator weaponAnimator;
private float weaponCooldown = 0.4f;
public bool isAttacking;
private bool queuedAttack;
private string lastAnimationPlayed;
private HashSet<healthController> enemiesHit = new();
void Start()
{
// 绑定键盘和鼠标事件
attackHitbox.enabled = false;
attackAction = new InputAction("Attack");
attackAction.AddBinding("<Mouse>/leftButton");
attackAction.Enable();
// 获取武器和其动画
Transform equippedWeapon = transform.Find("Main Camera").Find("Sword10_Brown");
weaponAnimator = equippedWeapon.GetComponent<Animator>();
}
void Update()
{
// 检测攻击按键
if (attackAction.WasPressedThisFrame())
{
// 清空之前的攻击记录
enemiesHit.Clear();
// 检测是否正在攻击
if (!isAttacking)
{
// 开始新的攻击
StartCoroutine(RightToLeftAttack());
}
else
{
// 如果正在攻击,则设置队列攻击
queuedAttack = true;
}
}
}
System.Collections.IEnumerator RightToLeftAttack()
{
// 设置攻击动画
weaponAnimator.SetTrigger("RightToLeft");
lastAnimationPlayed = "RightToLeft";
audioSource.PlayOneShot(attackClips[Random.Range(0, attackClips.Length)]);
// 开始攻击
isAttacking = true;
attackHitbox.enabled = true;
// 等待攻击完成
yield return new WaitForSeconds(weaponCooldown);
// 检测队列攻击
if (queuedAttack)
{
// 取消队列攻击
queuedAttack = false;
// 开始新的攻击
StartCoroutine(LeftToRightAttack());
}
else
{
// 结束攻击
isAttacking = false;
attackHitbox.enabled = false;
weaponAnimator.SetTrigger("RightToIdle");
}
}
public bool RegisterHit(healthController enemyHealthController)
{
return enemiesHit.Add(enemyHealthController);
}
public IEnumerator LeftToRightAttack()
{
// 设置攻击动画
weaponAnimator.SetTrigger("LeftToRight");
lastAnimationPlayed = "LeftToRight";
audioSource.PlayOneShot(attackClips[Random.Range(0, attackClips.Length)]);
// 开始攻击
isAttacking = true;
attackHitbox.enabled = true;
// 等待攻击完成
yield return new WaitForSeconds(weaponCooldown);
// 结束攻击
isAttacking = false;
attackHitbox.enabled = false;
weaponAnimator.SetTrigger("LeftToIdle");
}
}
这是修复后的代码,添加了队列攻击的功能,当玩家点击攻击按钮时,如果正在攻击,则设置队列攻击,否则开始新的攻击。如果队列攻击被激活,则开始新的攻击并取消队列攻击。
评论 (0)