using UnityEngine; /// /// Basic player combat controller: right-click an enemy to chase and attack in range. /// public class PlayerCombatController : MonoBehaviour { [Header("Combat")] public int attackDamage = 1; public float attackRange = 1.5f; public float attackCooldown = 0.6f; [Tooltip("Maximum chase distance. Clear target if enemy gets farther than this.")] public float maxChaseDistance = 20f; [Header("Movement")] public bool useMovementController = true; [Header("Debug")] public bool enableDebugLogs = false; private Enemy targetEnemy; private float nextAttackTime = 0f; private NavMeshMovementController movementController; private void Awake() { movementController = GetComponent(); } private void Update() { if (targetEnemy == null) return; if (targetEnemy.GetCurrentHP() <= 0) { Log("Target enemy is dead, clearing combat target"); ClearCombatTarget(); return; } float distance = Vector3.Distance(transform.position, targetEnemy.transform.position); // Auto-clear if enemy goes out of chase range if (distance > maxChaseDistance) { Log($"Enemy out of chase range (distance: {distance:F2}, max: {maxChaseDistance:F2}), clearing target"); ClearCombatTarget(); return; } if (useMovementController && movementController != null) { if (distance > attackRange) { Log($"Moving to enemy (distance: {distance:F2} > attackRange: {attackRange})"); movementController.MoveTo(targetEnemy.transform.position); } else { Log($"In attack range, stopping (distance: {distance:F2})"); movementController.Stop(); movementController.SetLookTarget(targetEnemy.transform.position); } } if (distance <= attackRange && Time.time >= nextAttackTime) { Log($"ATTACKING! Distance: {distance:F2}, Cooldown ready: {Time.time >= nextAttackTime}"); nextAttackTime = Time.time + attackCooldown; Character character = GetComponent(); if (character != null) { character.TriggerAttack(); } targetEnemy.TakeDamage(attackDamage); } } public void SetTargetEnemy(Enemy enemy) { if (enemy == null) return; Log($"Setting target: {enemy.enemyName}"); targetEnemy = enemy; nextAttackTime = Time.time; // Set weapon type to Melee for combat Character character = GetComponent(); if (character != null) { character.SetWeaponType(Character.WeaponType.Melee); } } public void ClearCombatTarget() { if (targetEnemy != null) Log($"Clearing target: {targetEnemy.enemyName}"); targetEnemy = null; // Return to idle weapon state Character character = GetComponent(); if (character != null) { character.SetWeaponType(Character.WeaponType.None); } } public Enemy GetTargetEnemy() => targetEnemy; private void Log(string message) { if (enableDebugLogs) { Debug.Log($"[PlayerCombat] {message}", gameObject); } } private void OnDrawGizmosSelected() { // Draw attack range Gizmos.color = Color.red; Gizmos.DrawWireSphere(transform.position, attackRange); // Draw max chase distance Gizmos.color = Color.yellow; Gizmos.DrawWireSphere(transform.position, maxChaseDistance); } }