using UnityEngine; public class PlayerAttack : MonoBehaviour { [Header("Chop Settings")] public float chopRange = 2.5f; // ระยะฟันตัดไม้ public int chopDamage = 1; // ความเสียหายที่ทำกับต้นไม้ต่อการฟัน 1 ครั้ง public float attackCooldown = 0.8f; // [เพิ่ม] ระยะเวลาคูลดาวน์การฟัน (ปรับตามความยาวแอนิเมชัน) [Header("Layer Mask")] public LayerMask treeLayer; // Layer ของต้นไม้ (เช่น Tree) [Header("References")] public Animator animator; public Transform attackPoint; private bool canAttack = true; // [เพิ่ม] ตัวแปรเช็คสถานะว่าฟันได้หรือไม่ void Start() { // หากไม่ได้ลาก Animator มาใส่ ให้ค้นหาจากตัว Player อัตโนมัติ if (animator == null) animator = GetComponentInChildren(); if (attackPoint == null) attackPoint = transform; } void Update() { // กดคลิกซ้าย (Mouse 0) เพื่อฟันตัดไม้ (เพิ่มเงื่อนไข && canAttack) if (Input.GetMouseButtonDown(0) && canAttack) { ChopTree(); } } void ChopTree() { canAttack = false; // [เพิ่ม] ล็อกไม่ให้ฟันซ้ำระหว่างเล่นท่าฟัน // 1. เล่นแอนิเมชันฟัน if (animator != null) { animator.SetTrigger("Attack"); } // 2. ตรวจหาและทำความเสียหายกับต้นไม้ในระยะ Collider[] hitTrees = Physics.OverlapSphere(attackPoint.position, chopRange, treeLayer); foreach (Collider treeObj in hitTrees) { // ดึงสคริปต์ TreeHealth จากต้นไม้ที่โดนฟัน TreeHealth tree = treeObj.GetComponent(); if (tree != null) { tree.TakeDamage(chopDamage); } } // [เพิ่ม] คืนค่าให้กลับมาฟันได้ใหม่เมื่อหมดเวลาคูลดาวน์ Invoke(nameof(ResetAttack), attackCooldown); } // [เพิ่ม] ฟังก์ชันปลดล็อกการฟัน void ResetAttack() { canAttack = true; } // วาดวงกลมระยะฟันในหน้า Scene void OnDrawGizmosSelected() { if (attackPoint == null) attackPoint = transform; Gizmos.color = Color.green; Gizmos.DrawWireSphere(attackPoint.position, chopRange); } }