That warning isn’t coming from your material/DMI logic — it’s about component mobility.
Unreal won’t let you attach a Static component to a parent that is Movable (or “not static”):
- Parent:
DefaultSceneRoot → not static (Movable)
- Child you’re trying to attach:
A_8X8___8_POINTS → Static
- Result: attach is aborted.
So somewhere (often during FBX import / construction / Blueprint setup), the static mesh components are being attached under a root whose mobility isn’t Static.
Make the root at least as “static” as the children.
In the actor Blueprint:
- Select DefaultSceneRoot
- In Details → Mobility
- Set to Static (or Stationary)
If the root is a DefaultSceneRoot and you can’t change it easily, replace it with a SceneComponent you control:
- Add a Scene Component
- Right-click it → Make Root
- Set that new root’s Mobility = Static
- Ensure your imported tile components are attached under it.
If you actually need to move the actor at runtime, then the children can’t be Static.
Select your tile StaticMeshComponents (or do it in construction script):
This will silence the warning, but it changes lighting behavior (static lighting, HISM batching assumptions, etc.).
FBX “scene import” often produces:
- one root (movable default scene root)
- many mesh components marked Static
As soon as the blueprint tries to attach/organize those components, Unreal complains.
In your top loop you are calling Set Material and then Create Dynamic Material Instance.
You don’t need both, and doing both can cause confusion about what’s actually assigned.
Do this instead (per component):
- Create Dynamic Material Instance (Target = mesh component, Element Index = 0, Source Material = your base material)
- Store the returned MID
- Don’t call Set Material separately unless you’re not using “Create DMI” on the component.
Then in Tick (or whenever), set parameter on the stored MID.
Also: make sure the array index you use to GET from MIDs matches the component in the loop (use the loop index consistently).
BeginPlay:
ForEach (TileMeshes):
- MID = CreateDynamicMaterialInstance(Target = TileMesh, Element 0, Source = ScalerMat)
- Add MID to MIDs array (same order as TileMeshes)
Tick (or update):
For i in range:
- SetScalarParameterValue(Target = MIDs[i], Name=“Scale”, Value=TileScale[i] or TileScale)
If you tell me whether your actor needs to be movable in-game (yes/no), I’ll tell you which mobility option to use so you don’t break lighting or performance.