Free
Texture Placement Tool
Have you ever wanted to stamp yourself with stickers like you're a high school locker? Well look no further!
A Unity tool for free placement of tattoos, decals, and textures onto animated avatars’ skin and clothing, using raycast-based projection and URP render passes.
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.
  • Challenges & Solutions
  • Accurate UV sampling on animated, skinned meshes
    • Issue: RaycastHit.textureCoord is not job-safe.
    • Solution: Rebuilt texture coordinates manually via triangle indices and barycentric interpolation in Burst jobs.
  • Performance with high-resolution decals
    • Issue: Naive per-pixel raycast locks the main thread.
    • Solution: Jobified raycast command building, batched Unity RaycastCommands, and incremental, frame-budgeted result processing.
  • Clean integration with UMA and live materials
    • Issue: Need both baked overlays and live-updated preview.
    • Solution: Wrote UMA overlay/asset creation pipeline plus direct material texture updates on the avatar’s SkinnedMeshRenderer.
  • this website was made with love by me!