UDecalActor initializes a Movable although that is not supported per documentation

The UE documentation states that only static Decals are supported

"Current limitations

  • We currently only support deferred decals and they only work on static objects."

https://dev.epicgames.com/documentation/en\-us/unreal\-engine/decal\-actors\-in\-unreal\-engine?application\_version\=5\.6

However UDecalActor disables the Mobility fields from being modified in editor and inherits the

Mobility from:

USceneComponent::USceneComponent(const FObjectInitializer& ObjectInitializer /*= FObjectInitializer::Get()*/)

: Super(ObjectInitializer)

, CachedLevelCollection(nullptr)

{

Mobility = EComponentMobility::Movable;

I am tempted to override the Mobility value in the UDecalComponent constructor and to set it to EComponentMobility::Static. However, is there a desired side effect from the fact that it is Movable, e.g. no shadow casting or some thing like that?

[Attachment Removed]

Steps to Reproduce

Create a DecalActor in a level and inspect the Mobility property in the debugger and notice it is set to Movable.

[Attachment Removed]

Note this problem also exists for:

UInstancedStaticMeshComponent

[Attachment Removed]

Hi,

The way decals work can be a bit confusing. The “they only work on static objects” note in the documentation refers to the receiving mesh (the geometry the decal is projected onto), not the Decal Actor itself.

Decals do actually work on movable objects (e.g. a skeletal mesh) as well via the DBuffer, but they can “slip” or look incorrect if the underlying mesh deforms too much, because the decal is projected as a 3D volume, not a 2D texture.

It’s recommended to keep the decal’s mobility to Movable, to preserve flexibility w.r.t. how the decal is transformed: decals are frequently moved or spawned at runtime (for example bullet holes). If they were Static by default, you would see Mobility mismatch warnings or be unable to move them once spawned. You could consider making the decal’s mobility static, if you don’t care about being able to spawn or move it at runtime, and lose that flexibility.

I hope that helps, but let me know if you have more questions.

Regards,

Sam

[Attachment Removed]