MONSTER_DETECTION_IMPROVEMENTS.md 7.1 KB

Monster Detection & Behavior Improvements

Summary

Applied minimal, targeted fixes to improve monster detection, rotation smoothness, and attack consistency based on analysis of the existing system.


Changes Made

1. ✅ Added Configurable Rotation Speed (MonsterController.cs)

Location: Lines 15, 83

What Changed:

// NEW: Added public field
public float rotationSpeed = 8f; // Higher = smoother rotation

// UPDATED: FaceTarget() now uses configurable speed
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * rotationSpeed);

Why:

  • Previous hardcoded value of 5f was okay but not customizable
  • New default of 8f provides smoother rotation
  • Can be adjusted per-monster in Unity Inspector
  • Makes direction changes feel more natural during movement

Impact: 🟢 Low - Improves visual smoothness, no gameplay impact


2. ✅ Added Per-Monster Distance Check (MonsterFormationGroup.cs)

Location: Lines 397-403

What Changed:

// NEW: Check if each specific monster is close enough before attacking
float distanceToPlayer = Vector3.Distance(monster.transform.position, player.position);
if (distanceToPlayer > effectiveAttackRange)
{
    Debug.Log($"[Combat] {monster.name} too far to attack ({distanceToPlayer:F1}m > {effectiveAttackRange:F1}m)");
    continue;
}

Why:

  • Previous system only checked if ANY monster was in range
  • Caused distant monsters in formation to attack when they shouldn't
  • Now each monster validates their own distance before attacking
  • Prevents "teleporting attacks" from back-row monsters

Impact: 🟡 Medium - Fixes major combat issue, improves realism


3. ✅ Standardized Attack Range Checks (MonsterFormationGroup.cs)

Location: Lines 20-22, 303, 368

What Changed:

// NEW: Consistent attack range calculation
private const float ATTACK_RANGE_BUFFER = 0.5f;
private float effectiveAttackRange => attackRange + ATTACK_RANGE_BUFFER;

// UPDATED: All checks now use effectiveAttackRange
if (monsterToPlayerDist <= effectiveAttackRange)  // Line 303
if (...Distance(...) <= effectiveAttackRange)    // Line 368

Before (Inconsistent): | Location | Range Used | |----------|------------| | Update() | attackRange + 0.5f | | LoopAttack() | attackRange + 0.5f | | ChaseRoutine() | attackRange (no buffer) |

After (Consistent):

  • All checks use effectiveAttackRange (6.5f by default)
  • Single source of truth for attack range
  • Easy to adjust if needed

Why:

  • Inconsistent ranges caused confusing behavior
  • Monsters would chase/stop/attack at different distances
  • Now all combat logic uses same range definition

Impact: 🟢 Low - Fixes consistency issue, makes behavior predictable


4. ✅ Prevented Update() State Interference (MonsterFormationGroup.cs)

Location: Lines 280-281

What Changed:

// NEW: Early return if already in active state
if (isChasing || attackLoopCoroutine != null) return;

Why:

  • Update() runs every frame (60+ times/second)
  • Could restart chase/attack while already running
  • Created race conditions and duplicate coroutines
  • Now guards against interfering with active states

Impact: 🟡 Medium - Prevents potential bugs and duplicate behaviors


5. ✅ Removed Redundant Facing Check (MonsterFormationGroup.cs)

Location: Line 408 (removed lines 396-400)

What Removed:

// REMOVED: This check was always true after instant rotation
// if (!monster.IsFacingTarget(player.position, 45f))
// {
//     Debug.LogWarning($"[Combat] {monster.name} is not properly facing player, skipping attack");
//     continue;
// }

Why:

  • Line 393 does instant rotation: FaceTarget(player.position, instant: true)
  • Immediately after, line 396 checked if facing (always true)
  • Redundant check that never fails
  • Removed unnecessary performance overhead

Impact: 🟢 Low - Cleanup, minor performance improvement


Testing Checklist

Detection System

  • Monsters start chasing when player enters 20f detection radius
  • Monsters stop when player exits detection zone
  • Detection triggers consistently

Direction/Rotation

  • Monsters rotate smoothly toward player during movement
  • Rotation feels natural and not jerky
  • Instant rotation works in combat (monsters face player before attacking)

Attack System

  • Only front-row monsters in range attack
  • Distant monsters in formation don't attack
  • Attack range is consistent (6.5f)
  • Monsters stop attacking when player moves away

Formation

  • Formation maintains during combat
  • No "teleporting attacks" from distant monsters
  • Back-row replacements work correctly

State Management

  • No duplicate chase/attack behaviors
  • Update() doesn't interfere with active coroutines
  • Smooth transitions between idle/chase/attack states

Configuration Options

You can now adjust in Unity Inspector:

MonsterController

  • rotationSpeed (default: 8f) - Higher = smoother turning

MonsterFormationGroup

  • attackRange (default: 6f) - Base attack range
  • ATTACK_RANGE_BUFFER (hardcoded: 0.5f) - Buffer added to attack range
    • Effective range = 6.5f

Known Limitations (Not Changed)

These were identified but NOT modified per "don't change much" requirement:

  1. No Line-of-Sight: Monsters detect through walls (simple sphere collider)
  2. Sequential Attacks: Monsters attack one-by-one with delays (not parallel)
  3. Formation Gaps: 2-second delay when replacing dead front-row monsters
  4. No Terrain Awareness: Monsters don't check for obstacles during movement

These can be addressed in future updates if needed.


Summary of Impact

Change Priority Impact Risk
Rotation Speed Low Visual None
Per-Monster Distance High Gameplay None
Standardized Range High Consistency None
Update() Guard Medium Stability None
Remove Redundant Check Low Performance None

Total Changes: 5 targeted fixes Lines Modified: ~15 lines across 2 files Risk Level: 🟢 Low - All changes are conservative and backwards compatible


Files Modified

  1. /Assets/Scripts/Monsters/MonsterController.cs

    • Added rotation speed field
    • Updated FaceTarget() to use configurable speed
  2. /Assets/Scripts/Monsters/MonsterFormationGroup.cs

    • Added attack range consistency helpers
    • Added per-monster distance check
    • Added Update() state guards
    • Removed redundant facing check
    • Standardized all range checks
  3. /MONSTER_DETECTION_AND_BEHAVIOR_ANALYSIS.md (NEW)

    • Comprehensive analysis document
    • Identified issues and recommendations

Conclusion

Detection: Now validates individual monster proximity before attacking
Direction: Smoother, configurable rotation
Consistency: Unified attack range across all checks
Stability: Prevented state interference

All changes are minimal, focused, and maintain existing behavior while fixing specific issues.