2025-12-04 08:22:30 +01:00

124 lines
2.9 KiB
C#

using UnityEngine;
[RequireComponent(typeof(Rigidbody2D))]
[RequireComponent(typeof(Health))]
[RequireComponent(typeof(Animator))]
public class Player : MonoBehaviour
{
[SerializeField] private float attackRadius = 2f;
[SerializeField] private float attackDistance = 2f;
[SerializeField] private float speed = 2f;
[SerializeField] LayerMask foodLayers;
Health health;
Rigidbody2D rb;
Animator anim;
private Vector3 lastMoveDirection = Vector2.down;
private bool isDef = false;
private bool isAttacking = false;
private bool isMoving = false;
private Vector3 AttackPosition
{
get
{
return transform.position + lastMoveDirection * attackDistance;
}
}
private bool CanProcessInput()
{
return !health.IsDead;
}
void Start()
{
health = GetComponent<Health>();
rb = GetComponent<Rigidbody2D>();
anim = GetComponent<Animator>();
}
// Update is called once per frame
void Update()
{
if(GameManager.Instance.IsWinScore)
return;
if(!isMoving)
HandleDefendMode();
if (!isDef && !isAttacking)
{
HandleAttack();
HandleCharacterMovement();
}
}
void HandleAttack()
{
if (CanProcessInput() && Input.GetKeyDown(KeyCode.Space))
{
isAttacking = true;
anim.SetTrigger("Attack");
}
}
void HandleDefendMode()
{
if (CanProcessInput() && Input.GetKeyDown(KeyCode.C))
{
isDef = !isDef;
anim.SetBool("Def", isDef);
}
}
void HandleCharacterMovement()
{
rb.MovePosition(rb.position + GetMoveInput() * (speed * Time.fixedDeltaTime));
}
public Vector2 GetMoveInput()
{
if (CanProcessInput())
{
Vector2 move = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
move = move.normalized;
isMoving = move.sqrMagnitude > 0.01f;
if (isMoving)
{
lastMoveDirection = move;
anim.SetFloat("Horizontal", move.x);
anim.SetFloat("Vertical", move.y);
}
anim.SetBool("Movement", move.sqrMagnitude > 0.01f);
return move;
}
return Vector2.zero;
}
public void Attack()
{
Collider2D[] hitEnemies = Physics2D.OverlapCircleAll(AttackPosition, attackRadius, foodLayers);
foreach (Collider2D enemy in hitEnemies)
{
enemy.GetComponent<Health>()?.TakeDamage(10);
}
}
public void OnAttackAnimationEnd()
{
Attack();
isAttacking = false;
}
private void OnDrawGizmosSelected()
{
Gizmos.color = Color.red;
Gizmos.DrawWireSphere(AttackPosition, attackRadius);
}
}