Wizard_Of_Wak/Assets/1_Script/Player/PlayerAttack.cs

98 lines
2.8 KiB
C#

using System.Collections;
using UnityEngine;
using static PlayerController;
public class PlayerAttack : MonoBehaviour
{
Animator animator;
PlayerController controller;
public float attackTime = 0.5f; // 공격 후 쿨다운
private int attackCount = 0; // 현재 공격 횟수
private float lastAttackTime;
private bool canAttack = true;
private int attackIdx = 0; // 공격 애니메이션 인덱스 (0,1 반복)
private string[] anim_Strings = { "AttackIdx", "AttackState", "idleState" };
private void Start()
{
controller = GetComponent<PlayerController>();
animator = GetComponentInChildren<Animator>();
PlayManager.Instance.leftMouve += Attack;
}
private void Update()
{
if (controller.playerState == PlayerState.Dash) return;
if (attackCount > 0 && Time.time - lastAttackTime >= attackTime)
{
AttackStop(); // 일반적인 경우는 그냥 AttackStop()
}
}
void Attack()
{
if(!canAttack) return;
controller.playerState = PlayerState.Attack;
lastAttackTime = Time.time;
attackCount++;
Debug.Log($"Attack Count: {attackCount}, Attack Index: {attackIdx}");
animator.SetInteger(anim_Strings[0], attackIdx);
attackIdx = (attackIdx + 1) % 2;
AttackRot();
animator.SetFloat(anim_Strings[1], controller.idleState);
if (attackCount >= 3)
{
StartCoroutine(AttackCooldown()); // 마지막 공격이면 쿨다운 실행
}
}
public void AttackStop()
{
attackCount = 0;
controller.playerState = PlayerState.Idle;
animator.SetInteger(anim_Strings[0], -1);
}
IEnumerator AttackCooldown()
{
canAttack = false;
yield return new WaitForSeconds(attackTime);
AttackStop(); // 마지막 공격 후 Stop
canAttack = true;
}
private void AttackRot()
{
Vector3 playerScreenPos = Camera.main.WorldToScreenPoint(transform.position);
Vector3 mouseScreenPos = Input.mousePosition;
bool isLeft = mouseScreenPos.x < playerScreenPos.x;
if (Mathf.Abs(mouseScreenPos.x - playerScreenPos.x) > Mathf.Abs(mouseScreenPos.y - playerScreenPos.y))
{
transform.GetChild(0).localEulerAngles = isLeft ? new Vector3(0, 180, 0) : new Vector3(0, 0, 0);
animator.SetFloat(anim_Strings[2], 1);
controller.idleState = 1f;
}
else
{
if (mouseScreenPos.y > playerScreenPos.y)
{
animator.SetFloat(anim_Strings[2], 0.5f);
controller.idleState = 2f / 3f;
}
else
{
animator.SetFloat(anim_Strings[2], 0);
controller.idleState = 1f / 3f;
}
}
}
}