Wildlife Rendering System
Framework: Unreal Engine, Niagara, AnimToTexture Plugin

Objective: populate game environments with ambient wildlife without incurring the heavy CPU cost of traditional Skeletal Meshes and AI pathfinding
Result: a scalable system using Niagara and Vertex Animation Textures (VATs) capable of rendering over 100 creatures simultaneously with minimal performance overhead
Architecture
Custom State Machine: Developed a custom node-based state machine within Niagara's Scratchpad. The system dynamically reads a creature's angle and position along a Spline to determine its state (e.g., a bird flying straight vs. gliding down vs. entering a 90-degree fall).
Seamless Blending: Implemented custom interpolation logic to ensure smooth transitions between animation states without hard visual cuts
DevEx & Tooling
- Designer-Facing Controls: Created a custom Blueprint Actor utilizing a Spline and a custom Niagara component. Level designers can simply drag the Blueprint into the level, draw the path, and tweak exposed parameters (like speed and creature type) without touching the underlying logic
-
- Scalability: Designed the animation logic using dynamic arrays. Adding a new animation state requires only a 2D vector input (start and end frame index), allowing the system to scale and adapt to new creature types instantly
-
- Workflow Optimization: Authored internal documentation and built editor utility functions to streamline the otherwise manual process of generating and assigning the Vertex Animation Textures

Performance & Optimization
- GPU Offloading: reduced CPU bottlenecks by bypassing standard animation blueprints and skeletal mesh tick costs.
-
- Distance Culling & LODs: Implemented particle LODs and distance-based logic. At far distances, animations are entirely disabled via the material, falling back to static textures to reclaim rendering milliseconds
Challenges
Learning & Adapting: Architected the entire Niagara Scratchpad logic from the ground up as a first-time user of the tool
Animation State Logic: Successfully managed complex logic rules, such as forcing unique animations to complete their playback loop before transitioning, while allowing looping animations (like flying to gliding) to blend immediately
Animation State Logic: Successfully managed complex logic rules, such as forcing unique animations to complete their playback loop before transitioning, while allowing looping animations (like flying to gliding) to blend immediately