Overview
Built for UMA-based avatars with dynamic, skinned meshes.
Projects 2D textures onto 3D characters while respecting UVs, animation, and blendshapes.
Supports multiple projection modes (per-pixel raycast, single-tile UV remap, render-feature based).
My Role
Designed the projection pipeline from initial whiteboard concepts to in-engine implementation.
Implemented core C# systems for texture projection, mesh sampling, and jobified raycasting.
Integrated the tool into the UMA avatar pipeline and URP renderer for production use.
Technical Highlights
Unity, C#, URP ScriptableRendererFeature, Burst, Jobs, NativeArray.
Custom projection component (Tattooenator) that:
- Generates and manages projector/output textures.
- Launches raycasts from a procedural “cylinder” mesh onto the avatar.
- Writes results back into avatar materials and UMA overlays.
Job chain that:
- Builds RaycastCommands for non-zero decal pixels.
- Uses triangle indices + barycentric coordinates to reconstruct UVs inside jobs.
- Writes premultiplied color into a byte buffer for the final texture.
External controller (TexturePlacementBehavior) that:
- Finds the correct UMA avatar, SkinnedMeshRenderer, and builds a matching MeshCollider.
- Sets up the procedural rayguide geometry and projection mode.
- Handles enter/exit “free placement” mode and collision-mesh baking.
URP UVProjectRenderPassFeature for GPU-based UV remap passes when using single-tile projection paths.