Professional UE5 editor plugin for editing multiple Material Instances simultaneously.
Bulk Parameter Editing: Edit scalar, vector, and texture parameters across multiple material instances at once
Auto-Texture Assignment: Automatically assign textures based on customizable naming conventions
Visual Folder Browser: Navigate and select folders using familiar Content Browser interface
Smart Search & Filter: Filter by material parent and search by name
Persistent Settings: Naming rules are saved and remembered between sessions
Undo/Redo Support: All operations fully support undo (Ctrl+Z)
Real-time Notifications: Clear feedback for every operation
Type: Unreal Engine 5 Editor Plugin (C++)
Role: Lead Developer & Technical Designer
Duration: Development cycle one week complete, ready for marketplace distribution
Engine Version: UE 5.3 - 5.7
Status: Production-ready, punlished on FAB
Challenge: Technical artists waste hours manually opening and editing hundreds of material instances one-by-one after asset imports. Common pain points include:
Importing asset packs with 100+ meshes, each generating individual material instances
Manually assigning textures to each instance (BaseColor, Normal, ORM, etc.)
Updating material parameters across entire libraries
No bulk editing capabilities in default Unreal Editor
Repetitive, error-prone workflow costing studios significant production time
Solution: A production-grade bulk editing interface that allows simultaneous editing of unlimited material instances with smart automation features.
Pattern Matching: Customizable naming rules (e.g., _BaseColor → BaseColor parameter)
Intelligent Algorithm: Strict matching prevents wrong assignments
wood_1 matches only wood_1_BaseColor, not wood_2 or wood_crate
Persistent Rules: Saved per-project, remembered between sessions
Multi-Strategy Discovery: Direct path → Parent folder → Project-wide search
19 Default PBR Patterns: Industry-standard naming conventions included
Strategy A: Exact Prefix Match
Instance: "wood_1" + Pattern: "_BaseColor" = "wood_1_BaseColor"
✓ Matches: "wood_1_BaseColor"
✗ Rejects: "wood_2_BaseColor", "wood_crate_BaseColor"
Strategy B: Clean Name Fallback
"dosimeter_1" → "dosimeter" (strips trailing numbers)
Matches "dosimeter_BaseColor" when exact not found
Strategy C: Prefix-Stripped
"T_wood_1_BaseColor" → Remove "T_" → Match "wood_1"
C++ Editor-Only Plugin (Zero Runtime Overhead)
├── 7 Classes
├── Slate UI Framework (declarative widgets, smart pointers)
├── Asset Registry Integration (texture/instance discovery)
└── Config System (persistent storage)
TSharedPtr for UI widget lifetime
TWeakObjectPtr for UObject references (prevents crashes)
Smart pointers throughout (no manual new/delete)
Tested with 500+ instances simultaneously
1000 textures scanned in <1 second
Cached parameter introspection
Batch viewport updates
Version-agnostic config API usage
Handled breaking changes in FConfigFile system
Public API preference for long-term stability