Patch Notes - Changelog
Version 1.5.0
10th Jan 2026
Added
Wall Placement Zone System: New component for positioning agents at specific spots (wall defenses, tower positions, siege scenarios).
New
EnemyMassesWallPlacementZonecomponent for defining placement formations in the sceneSpot Arrangement Types: Line, Grid, Circle, or Manual (child transforms)
Configurable dimensions: width/height for Line/Grid, radius/count for Circle
Distance-based auto-assignment: Agents within trigger radius auto-assign to nearest available spot
Placement Modes:
Instant- Teleport directly to spot (if within max distance; otherwise pathfinds until within range, then warps)Pathfind- Agent walks to the spot from any distance
Facing Options: Face center or custom facing direction, with smooth per-agent facing enforcement
Editor gizmos showing spots, trigger radii, and formation bounds
Public API:
AssignAgentsToSpots(),RemoveAgentFromSpot(),GetAssignedAgents(),FindNearestAvailableSpot(),IsPositionInZone(),RegenerateSpots()Full custom editor with spot arrangement UI and runtime status display
RTS Controller Wall Placement Integration: Command-clicking on wall placement zones assigns selected agents to spots.
New settings:
enableWallPlacementZones,wallPlacementZones,autoDiscoverWallPlacementZonesZones auto-discovered at startup when enabled
Public API:
DiscoverWallPlacementZones(),RegisterWallPlacementZone(),UnregisterWallPlacementZone(),WallPlacementZonesproperty
Wall Placement Zone - Runtime Visualization: Optional runtime display of zone outline and spot markers.
Zone Outline: Optional LineRenderer draws outer shape (Line, Grid, Circle, or Manual convex hull)
Spot Markers: Optional sphere indicators show spot positions at runtime (available vs occupied markers/materials)
Custom marker prefab support, configurable marker size and outline width
Public methods:
SetRuntimeOutlineVisible(),SetRuntimeSpotMarkersVisible()
Wall Placement Zone - Status Effects On Arrival: Apply status effects when agents arrive at assigned spots.
New settings:
applyStatusEffectOnArrival,arrivalStatusEffectType,statusEffectValue,statusEffectLingerDurationSupports buffs and debuffs (ArmorBuff, DamageBuff, SpeedBuff, etc.)
Status persists while at spot; removed (or lingers) when leaving
VFX Support: ParticleSystem or VFX Graph, zone-centered or per-agent VFX
Audio Support: Arrival/departure sounds with volume, pitch variation, spatial blend
Audio Pooling: Limits concurrent sounds (configurable, oldest interrupted if pool exhausted)
Wall Placement Zone - Combat Stance On Arrival: Auto-set stance on spot arrival (Offensive, Defensive, HoldPosition, Passive).
New settings:
setStanceOnArrival,arrivalStance,rtsControllerStance applied via RTSController (fallback to direct assignment)
Spawn Around Target - Max Waves Limit: Limit total waves for interval spawn modes.
New
maxWaves(0 = unlimited) forIntervalWavesandIndividualAtIntervalsNew properties:
WavesSpawned,RemainingWaves(-1 when unlimited)New methods:
ResetWaveCounter(),ResetAllCounters()Stops automatically at limit with warning message; editor/runtime controls updated
Free Roam for EnemyMassesSpawnAroundTarget: Optional random patrol after spawning within a configurable radius.
New
FreeRoamCenterMode:SpawnPosition,TargetPositionAtSpawn,CustomTransform,FollowTargetNew settings:
enableFreeRoam,freeRoamCenterMode,freeRoamCenterTransform,freeRoamRadius,freeRoamArrivalDistance,freeRoamMinTargetDistance,freeRoamWaitTime,freeRoamUpdateInterval,pauseFreeRoamWhenEngaged,useFormationForFreeRoamGizmo visualization for radius and patrol targets
RTS AI Group Splitting & Flanking System: AI can split forces into tactical groups for multi-direction attacks.
New settings:
enableGroupSplitting,maxGroupSize,minGroupSize,maxGroups,flankingDistance,flankingAngle,flankingDelay,attackDistributionNew
TacticalGrouproles: MainForce, LeftFlank, RightFlank, RearGuard, Reserve, BaitNew
RTSAIState.FlankingstateAuto-split/merge behavior based on size/casualties; difficulty affects flanking likelihood
Public API:
ForceSplitGroups(),ForceConsolidateGroups(),ForceFlankingAttack(),GetTacticalGroup(),GetGroupAgentIndices()Runtime buttons and gizmo visualization for tactical groups
Improved
EnemyCrowd Inspector - Attack Range Settings: Attack range fields are now always visible in the Inspector.
Now shown in the main "Combat Engagement" section regardless of template selection
Fields include: Combat Range Type, Melee Min/Max Distance, Ranged Min/Max Distance, Ranged Preferred Distance
Wall Placement Zone - Free Rotation During Combat: Agents assigned to spots can rotate freely to face enemies during combat.
Skips facing enforcement while in combat/has a target (Attacking, Approach, Blocking, Charging)
Returns to assigned facing direction when combat ends
GPUI Patchers - Conditional Compilation: GPUI patchers compile only when needed (GPUI Pro < 0.12.9).
GPUIPrefabManagerPatcher,GPUICameraPatcher,GPUIShaderPatcherwrapped with#if EM_GPUIP_NEEDS_PATCHSetup Wizard shows patchers as "not needed" for GPUI Pro 0.12.9+
Reduces compilation and avoids unnecessary references on newer GPUI versions
Changed
Spawn Around Target - Simplified Interval Mode Logic:
Breaking Change: Interval modes (
IntervalWaves,IndividualAtIntervals) now use onlyMax WavesTotal Agentsis now only shown forAllAtOnceMax Waves = 0enables unlimited wavesHelp text updated with clear examples; runtime controls show wave progress when limited
Wall Placement Zone Editor - Faction Filter: Replaced toggle list with dropdown
MaskField.Uses
EditorGUILayout.MaskFieldmulti-select dropdownShows "Everything" when all factions allowed (empty list internally)
Populates factions from CrowdController or discovers EnemyCrowd assets in project
Fixed
HoldPosition Stance Attack Bug: HoldPosition agents now correctly attack enemies that come within range.
Fix: HoldPosition now uses engagement radius (or max attack range) instead of strict melee/ranged distance checks
Fix: HoldPosition now participates in positioning/slot assignment so attacks can trigger
Hybrid factions automatically switch
activeHybridModeby distance (ranged if far, melee if close)Attack cooldown resets when entering HoldPosition stance to prevent stale cooldowns
Offensive Agents Stop After Being Hit: Offensive agents no longer stop after ranged hit-stun in developer mode.
Fix: Preserves attack targets during
HitandBlockingso agents resume combat after hit stunRoot cause:
EnterCombatStateclearedattackTargetTransformandattackTargetAgentIndexfor non-Attackingstates
CrowdController CombatSystem Accessor: Added public
CombatSystemproperty toEnemyMassesCrowdController.Enables access to
EnemyMassesCombatSystemand subsystems (e.g.,StatusEffectSystem)Note:
EnemyMassesCombatSystemis a plain C# class, soGetComponent<>()cannot be used
Spawn Around Target - Free Roam Flickering: Fixed idle/walk/run flicker during free roam patrol.
Fix: Sets destinations with
useManualCommand: trueto prevent formation overridesFix: Adds minimum travel time check before arrival detection
Fix: Uses NavMeshAgent
remainingDistanceandpathPendingfor robust arrival detectionMatches proven implementation from
EnemyMassesSpawnPatrol
Fixed CS0108 warning in
NavMeshLinkClimbableEditor.cs(DrawHeader()hidingEditor.DrawHeader()) by adding thenewkeyword.Fixed missing
#endregioninEnemyMassesRTSAI.cscausing CS1038 compiler error.
Version 1.4.1
9th Jan 2026
Fixed minor editor issue:
Fixed CS0108 compiler warning in `NavMeshLinkClimbableEditor.cs` where `DrawHeader()` was hiding inherited member `Editor.DrawHeader()`. Added `new` keyword to explicitly indicate intentional hiding.
Version 1.4.0
9th Jan 2026
Navigation & Climbing
New NavMeshLink-based climbing (replaces custom system) for better performance + reliability. New: NavMeshLinkClimbable (unified climbable; auto-generates NavMeshLinks) New: NavMeshLinkTraversalHandler (agent traversal + animation support) New: NavMeshLinkCrowdAnimationHandler (GPU Instancer Pro animation integration) Removed: ClimbingManager, ClimbCommandHandler Replaced: ClimbingController → NavMeshLinkTraversalHandler, ClimbableLadder/Wall → NavMeshLinkClimbable Inspector upgrades: modern custom inspector with organized foldouts
Combat Targeting (Vertical + LOS)
Vertical targeting: agents can properly target enemies at different heights (better multi-level combat).
Optional line-of-sight (LOS) validation: prevents attacking through walls/obstacles.
New combat settings (Combat Settings > Vertical Targeting): maxTargetHeightDifference (0 disables; recommended ~3–5 for ground units) requireLineOfSight losCheckMode: EveryCheck, ClosestCandidatesOnly (recommended), Probabilistic (best for very large crowds) lineOfSightBlockingLayers (raycast layer mask)
RTS AI System
New spawner: EnemyMassesSpawnAroundTarget (spawn within radius around a target Transform; supports waves/ambushes).
New AI opponent controller: EnemyMassesRTSAI State machine: Idle → Attacking → Retreating → Baiting AoE threat detection + configurable aggression/retreat/rally behavior
Spawner menu cleanup: moved to GameObject → Enemy Masses → Spawners
Networking
Late-joiner sync: SendFullStateToClient() + automatic sync on OnClientConnected (batched RPCs) Full snapshot includes position, rotation, health, faction, owner
Position sync upgrades: SyncCriticalState() now syncs position + health AgentFullState struct for complete transfers Configurable correction threshold to reduce jitter
Relaxed co-op validation: distance tolerance option for hit validation (useful for co-op/horde vs competitive)
Docs expanded: Game mode considerations (RTS vs Co-op/Horde) NavMeshAgent position synchronization Late-joiner synchronization Clearer guidance: command-based vs position-sync approaches
NGO (Netcode for GameObjects) P2P Host-Client Guide
Added comprehensive NGO 2.7.0 P2P Host-Client integration documentation
Covers: architecture overview, built-in network events, command events, NetworkBridge pattern, CrowdAgent network properties
Documents event structs in Arawn.EnemyMasses.Runtime.Networking (Spawn/Damage/Death/Command/HealthChange/StateChange)
Combat Stance
New stance: CombatStance.Passive No aggro, no attacking even when attacked Still moves/navigates/climbs normally Will attack only when given an explicit attack command
API/UI: EnemyMassesRTSController.SetSelectedAgentsPassive() CrowdAgent.hasManualAttackCommand RTS selection panel: passiveButton, passiveClickSfx, HandlePassiveClicked()
Performance & Animation
New performance preset tuned for 1000+ agents.
Animation stability for large crowds: fixed glitch at 1000+ agents; improved GPU Instancer Pro batching.
Animation/visibility improvements: Fog-hidden agents treated as offscreen (prevents stale animation state) Prioritized refresh queue to avoid starvation under throttling Throttling respected; disabled when preset is None New preset: Prioritized (visible-only animation rotation when throttling)
Fixes
Fixed collection-modified exception when agents complete climbing.
Fixed StuckRecoverySystem incorrectly triggering pathPending timeouts for climbing agents.
Mecanim animator fallback is now try-catch wrapped (prevents crashes if parameters don’t exist).
GPU Instancer animation path now correctly used when climb clips are assigned.
EnemyCrowd integration (Climbing Animations)
New EnemyCrowd field: climbingAnimationConfig
New editor foldout: Animations → Climbing Animations Compute Animator clips (up/down/left/right, mount/dismount, idle, fall) Mecanim parameters (bool/float/triggers) Timing (mount/dismount durations) Workflow-aware visibility (shows only fields relevant to the selected Animator workflow)
Version 1.3.0
5th Jan 2026
🌐 Multiplayer Networking Groundwork
This release adds comprehensive networking infrastructure that allows developers to integrate their preferred multiplayer solution (Netcode for GameObjects, Mirror, Photon, FishNet, etc.) with Enemy Masses.
Setup Wizard - Network Configuration
The Setup Wizard now includes a dedicated Network Setup page:
Multiplayer Mode Selection - Choose from:
1v1 (500 units per player)
2v2 (250 units per player)
1v1v1 (333 units per player)
FFA 4/6/8 players
Custom player count
Soft Cap Explanation - Clear guidance on the ~1000 networked unit recommendation
Anti-Cheat Toggle - Optional server-side cheat detection
Network Solution Info - Links to integration guides for NGO, Mirror, Photon, FishNet
Automatic Component Setup - Adds
LocalNetworkAuthorityandAntiCheatComponentwhen enabled
Network Interfaces (Runtime/Networking/)
Seven new interfaces provide clean integration points for any networking library:
INetworkAuthorityProvider- Central hub for network state queriesIsServer,IsClient,IsHostpropertiesLocalPlayerIdfor identifying the local playerIsNetworkAuthoritative(agent)for authority checksAccess to all other authority interfaces
INetworkDamageAuthority- Server-authoritative damage validationValidateDamage()for server-side damage verificationOnDamageApplied/OnDamageRejectedeventsSupport for client-side prediction with rollback
INetworkCommandAuthority- RTS command validationValidateMoveCommand(),ValidateAttackCommand(),ValidateStopCommand()Rate limiting and ownership validation
Command sequence tracking for ordering
INetworkSpawnAuthority- Spawn/despawn synchronizationRequestSpawn()/RequestDespawn()patternsNetwork ID assignment
Spawn validation callbacks
INetworkStateSync- State synchronizationSyncAgentState()for periodic syncDelta compression support
Priority-based sync frequency
INetworkProjectileAuthority- Projectile network eventsOnProjectileFired/OnProjectileHiteventsProjectileNetworkDatastruct for serialization
INetworkOwnership- Player ownership trackingGetOwner()/SetOwner()for agentsOwnership transfer support
Network Events on Controllers
EnemyMassesCrowdControllernow fires:NetworkEventAgentSpawnedwith fullSpawnEventDataNetworkEventAgentDiedwithDeathEventDataNetworkEventAgentsDespawnedfor batch despawns
EnemyMassesRTSControllernow fires:NetworkEventMoveCommandwith formation dataNetworkEventAttackCommandwith target infoNetworkEventStopCommand
EnemyMassesCombatSystemnow fires:NetworkEventProjectileFiredNetworkEventProjectileHit
Sample Implementation
LocalNetworkAuthority- Reference implementation for single-player/testingPre-configured for local authority (all operations approved)
Demonstrates proper interface implementation
Custom editor with Network Settings tab
Documentation
multiplayer-integration-guide.md - Complete integration guide
multiplayer-security-hardening.md - Security best practices
🛡️ Security Hardening (Anti-Cheat)
Comprehensive security hardening to protect competitive multiplayer games from common cheats.
Phase 1: Field Encapsulation (CrowdAgent)
Critical fields converted to properties with security guards:
health
Blocks unauthorized health increases
isDead
Prevents resurrection hacks
isInvulnerable
Blocks god mode on non-authoritative clients
ownerPlayerId
Prevents ownership hijacking
enemyCrowdIndex
Blocks team/faction switching
nextAttackTime
Prevents attack speed hacks
Server-authoritative bypass methods added:
SetHealthAuthoritative()SetDeadAuthoritative()SetInvulnerableAuthoritative()SetOwnerAuthoritative()SetFactionAuthoritative()
Phase 2: Request/Validate/Apply Pattern
Damage System (EnemyMassesCombatSystem):
RequestDamage()- Routes through network authorityApplyServerDamage()- Authoritative server applicationRollbackDamage()- Corrects mispredicted damage
Command System (EnemyMassesRTSController):
RequestMoveCommand()- Validated move requestsRequestAttackCommand()- Validated attack requestsRequestStopCommand()- Validated stop requestsExecuteServerXxxCommand()- Remote command execution
Phase 3: Anti-Cheat Systems (Runtime/Networking/)
NetworkDamageValidator
Per-agent DPS rate limiting
Attack range validation
Cooldown enforcement
Dead attacker rejection
NetworkCommandValidator
Commands-per-second rate limiting
Ownership verification
Agent count limits per command
Command range validation
SpeedHackDetector
Movement speed validation
Teleport detection
Server/client position delta checks
Violation tracking with decay
AllowTeleport()API for legitimate teleports
StateReconciliationSystem
Periodic server state snapshots
Delta compression (only changed fields)
Urgent reconciliation on critical divergence
Client state correction
AntiCheatManager
Unified coordinator for all subsystems
Per-player suspicion tracking with decay
Configurable sensitivity presets (Default/Strict/Lenient)
Events:
OnCheatDetected,OnPlayerFlaggedAsCheaterComprehensive statistics tracking
AntiCheatComponent (MonoBehaviour)
Inspector-configurable anti-cheat settings
Runtime manager wrapper
Singleton access pattern
Cheat Types Detected
SpeedHack
Velocity exceeds max speed × tolerance
Teleport
Instant large position change
DamageHack
DPS exceeds configured maximum
GodMode
Taking no damage / instant heal
CommandFlooding
Too many commands per second
OwnershipViolation
Controlling unowned units
RangeHack
Attacking from impossible range
AttackSpeedHack
Attacking faster than cooldown
🔧 Editor Tooling
Anti-Cheat Monitor Window (Debug Tool)
Tools > Enemy Masses > Network > Anti-Cheat Monitor
Editor-only debugging tool for development - not included in builds.
Overview Tab - Live statistics dashboard
Detection count, flagged players, tracked players
Subsystem breakdown with reject rates
Recent activity feed
Players Tab - Per-player suspicion visualization
Color-coded suspicion bars (green→yellow→orange→red)
Reset/Flag buttons per player
Search filtering
Detection Log Tab - Complete detection history
Filterable by cheat type
Severity-based coloring
Timestamps and details
Settings Tab - Quick preset application
AntiCheatComponent Inspector
Modern header with status indicator
Quick preset buttons (Default/Strict/Lenient)
Live statistics during Play Mode
Player suspicion visualization
Subsystem status indicators
Network Tab in CrowdControllerEditor
Network event configuration
Authority provider assignment
Network Events Section in RTSControllerEditor
Command event visualization
Network callback configuration
📁 New Files
⚠️ Breaking Changes
None. All changes are additive and backward-compatible with existing single-player implementations.
🔜 Future Considerations
Lag compensation for hit detection
Server-side replay validation
Encrypted network traffic support
Match result verification system
📝 Migration Guide
For Single-Player Games: No changes required. The system defaults to local authority mode.
For Multiplayer Integration:
Implement the
INetworkAuthorityProviderinterfaceAssign your implementation to
NetworkAuthorityProvider.InstanceSubscribe to network events on controllers
(Optional) Add
AntiCheatComponentfor server-side protection
Version 1.2.0
4th Jan 2026
Camera System: Presets, Control Handoffs, Editor UX
Added
New RTSCameraPreset ScriptableObject system (replaces hardcoded schemes) with: User-created preset list support in RTSCameraController Factory presets: Classic RTS, Modern RTS, Third Person, Total War, Supreme Commander Focus and Follow settings moved into presets: enableFocus, smoothFocusTransition, focusTransitionSpeed Per-preset initial setup: Initial Zoom, Pitch, Yaw
Runtime preset switching and management: TransitionToPreset by index, name, or reference AddPreset and RemovePreset Public preset accessors: CameraPresets, ActivePresetIndex, ActivePreset, ActivePresetName, PresetCount
Camera control enable/disable integration hooks: Inspector option: 'Control Active On Start' (useful for GC2) API: SetControlActive(bool) API: SyncFromCameraTransform() Properties: IsControlActive, CurrentPosition, CurrentRotation, CurrentZoom Events: OnControlEnabled, OnControlDisabled
Editor UX improvements: RTSCameraPreset now shows the CamEnemyMasses icon in Unity editor and inspector RTS camera editor info box when presets list is empty Drag and drop support for adding RTSCameraPreset assets into the presets list
Changed
Removed CameraControlScheme enum usage, camera is now preset-asset driven.
Focus and Follow section in the RTS camera editor now only shows the Follow Target field. Behavior settings are in the preset.
Scheme transition settings renamed to preset transition settings: enablePresetTransitions, presetTransitionDuration, presetTransitionCurve
Transition behavior updates: Transitions now use preset initialZoom and initialPitch Yaw resets to preset initialYaw when transitioning to presets with rotation disabled
RTS camera now skips Update processing when control is disabled.
Removed
CameraControlScheme enum.
Redundant preset fields: transitionTargetZoom, transitionTargetPitch.
Game Creator 2: Camera Transitions
Added
GC2 instruction: 'Transition to GC2 Camera' (disable RTS camera, enable GC2 MainCamera, transition to Shot Camera)
GC2 instruction: 'Transition to RTS Camera' (disable GC2 MainCamera, enable RTS camera, optional transform sync)
Changed
GC2 instruction InstructionTransitionRTSCameraScheme updated to use RTSCameraPreset (by reference or name lookup)
Spawning: Interval Waves and Patrol Spawners
Added
EnemyMassesSpawnInterval runtime component: Interval or wave spawning, start delay, max waves, and post-spawn behavior
EnemyMassesSpawnIntervalEditor: Modern inspector layout, runtime controls, gizmo and formation preview settings
EnemyMassesSpawnPatrol runtime component: Patrol spawning with free roam or waypoint patrol Formation-aware movement Option to force spawner formation even if crowd 'Override Formation' is enabled
EnemyMassesSpawnPatrolEditor: Patrol settings, waypoint settings, and runtime controls
Changed
Patrol stability improvements: Arrival checks validate distance to last patrol target to reduce retarget flicker Minimum patrol point distance and short travel-time guard Optional debug logging for patrol arrival, retargeting, navigation, overrides Staggered initial patrol updates to avoid synchronized spikes Central scheduler option to spread patrol updates across frames
Combat: Effect Zones, Range Overrides, Sight Range
Added
EnemyMassesCombatEffectZone: Cyclic AoE effects (status or healing), faction filters, VFX/audio cues, gizmos Optional animated radius via LineRenderer
Combat range override API for Hybrid crowds: Force melee, ranged, or default behavior by faction, enemy type, or agent selection
GC2 instruction to set combat range overrides (by faction, type, agent, or RTS selected agents)
EnemyCrowd editor now exposes 'Sight Range' in the Combat tab (for fog reveal radius config)
Changed
Effect zone radius line renders only while active, fades in/out on activation
Effect zone pooled particle VFX are stopped before disabling on stop/disable
RTS: World Anchors, Markers, Waypoint Patrol, Commands
Added
EnemyMassesRTSWorldAnchor: Faction, minimap color, fog reveal radius
Custom inspectors with modern layout and quick actions: EnemyMassesRTSWorldAnchor EnemyMassesRTSWorldMarker
Hierarchy context menu entries for: Spawners (Interval, Trigger, Start, Patrol, Combat Effect Zone) RTS world anchors
Waypoint Patrol System (RTS controller): Hold Shift (configurable) while clicking to queue waypoints Loop closing by clicking near first waypoint Ping-pong paths when not looped Auto-pause on combat, resume after combat ends Visualization with waypoint markers and connecting lines (blue paths, green loops) Formation-aware patrol movement (type and spacing) AgentPatrolPath stores formation index, count, formation type, spacing APIs: HasPatrolPath(agentIndex), GetPatrolPath(agentIndex), ClearPatrolPath(agentIndex)
Changed
EnemyMassesRTSWorldMarker refactored to provide rules for anchors (fog reveal and minimap visibility per faction type)
Anchors auto-discover markers from parents or root children, cache results, and refresh when markers appear at runtime
Anchors now draw gizmos for position and fog reveal radius
Setup Wizard now adds EnemyMassesRTSWorldMarker when adding required scene components
Normal move commands now clear patrol paths for selected agents
Stop command clears patrol paths for stopped agents
RTS move command toggle and InstructionCrowdMoveInFormation option: Match formation speed to the slowest selected agent
Faction battle mode no longer disables NavMeshAgents with active paths, enabling patrol-like movement when no targets are assigned
UI: Health Bars and Status Effects
Added
EnemyMassesRTSHealthBarUI: Show per-agent health or average crowd health via UI Sliders Player and non-player faction filtering Optional labels per bar
EnemyMassesRTSStatusEffectUI: Show active buffs/debuffs/DOT/CC on selected agents or always-visible agents
Health-driven UI update events: EnemyMassesCrowdController.EventAgentHealthChanged EnemyMassesCombatSystem.OnAgentHealthChanged
Changed
Health bar behavior and scalability: Averages can include dead agents and preserve dead selection totals Cached aggregates with event-driven updates for large crowds Bars turn transparent at zero health Spawn group labels support tokens: {faction}, {type}, {index} Inspector includes placeholder reference and label usage guidance
Audio: Charge Attack Improvements
Changed
Charge attack audio respects per-faction 'Max Concurrent Sounds per Clip' for start, loop, and impact
Charge loop audio now uses pooled CrowdAudioManager sources instead of creating per-agent AudioSource GameObjects
Setup Wizard and Editor Maintenance
Changed
Setup Wizard camera section now reuses preset assets from Assets/Plugins/EnemyMasses/CameraPresets/ instead of generating new ones
Setup Wizard now properly references EnemyMassesRTSController in EnemyMassesCrowdController when crowd type is RTS
Civil waypoint hierarchy menu moved under Enemy Masses
Player Targets help text changed from warning to info and clarified as optional
Fixes
RTS command panel now correctly triggers post-combat reformation when: Strict Mode is toggled off during combat Combat stance is changed (Offensive or Defensive) during combat
Editor domain reload safety: EnemyMassesCrowdControllerEditor.OnEnable validates target to prevent InvalidCastException EnemyMassesRTSControllerEditor.OnEnable validates target to prevent InvalidCastException
RTS waypoint patrol agents properly engage enemies when targets enter aggro range (patrol pauses during combat)
Version 1.1.0
30th Dec 2025 Added
Player Targets list support in EnemyMassesCrowdController (multi-target, runtime add/remove helpers, list-aware accessors) + Setup Wizard UI and GC2 instructions.
New demo scene: RTS-Feature-Demo-CrystalSave.
Crystal Save integration: new Remember components to persist Enemy Masses runtime state:
RememberEnemyMassesCrowd,
RememberEnemyMassesRTSCommands,
RememberRTSSelectionCommandPanel,
RememberFogOfWarLite.
Attack raycasts can pick props; attack events report targetIndex = -1 for props.
Damageable props support (doors/objectives) via RTS attack commands:
IEnemyMassesDamageable + EnemyMassesDamageableObject (health, events, optional disable/destroy).
More GC2 events for RTS flow: Selection Changed, Agent Deselected, Selection Cleared, Move Command, plus a distance-based "On Agent In Range" event for colliderless agents.
WebGPU GPUI shader patcher (TreeProxy vertex requirement) + Setup Wizard integration.
Civil waypoints: new Lean and Sit waypoint types with reservable spots, interaction playback, durations, optional outro, editor support, and quick-create actions.
Formation cycling while holding the command button (scroll wheel optional, dpad/keys, or axis).
Social Interactions: optional start/end SFX and VFX per interaction.
RTS UI: RTSSelectionCommandPanel with toggle + stance/stop buttons (Offensive/Defensive/Hold strict, Stop).
Exposed renderer-binding controls in EnemyCrowd inspector (name field hidden when auto-find is enabled).
Death VFX renderer binding (better pooled spawns + skinned/mesh support):
Bind death VFX shape to cached SkinnedMeshRenderer / MeshRenderer.
Extended death FX config with renderer-binding options (bind toggle, prefer skinned, auto-find, optional name).
Cache per-agent renderer selection during spawn for efficient binding.
Changed
Auto-targeting for non-player factions now evaluates the nearest player target (not a single fixed target). Combat/spawn/trigger targeting is list-aware.
RTS attack command events also report non-agent targets (prop attacks).
RTS UI toggle renamed to "Strict Mode" (no legacy alias). Scenes/prefabs may need field reassignment.
Formation preview improvements: better sampling for hollow shapes and spacing-aware density (still capped at 200 markers).
Switching Hold to Offensive/Defensive force-exits ManualCommand.Stance behavior cleanup:
Switching to Offensive/Defensive clears hold/manual/formation locks so units re-engage properly.
Stop defaults selected agents back to non-strict Offensive.
Attack clears hold/manual flags before chase so units engage immediately.
Hold no longer cancels movement: units finish marching, then lock position and hold there.
NavMesh safety: only resume (isStopped=false) when agents are on the NavMesh.
Debug cleanup: removed HOLD DEBUG force navigation logs.
Fixed
Aggroed agents can retarget to a closer player target within range (reduces ignored nearby players).
Civil Waypoint "Add Activity" button now properly inserts a default activity entry (undo/dirty/refresh works).
Last updated