蓝图中的SM component是否可以继承模型的collision presets

Hi,

<br/>

一个工具向的问题,目前我们项目的场景制作,是采用了拆分的模块化模型,再用蓝图手动拼接为一个完整的大型模型/房间。

<br/>

不同用途/区域的静态模型有自己的collision presets,但是目前我们的项目使用中,把静态模型加入到蓝图后,SM component的collision presets会被重置为block all dynamic,而不是继承静态模型本身已有设置的collision presets,因此对于我们的美术而言,需要重新在蓝图内再设置一次,难免会有疏忽 遗漏,并且额外耗时。

<br/>

请问是否有直接点的方式,可以先继承模型自己的设置,如果有需要再手动overlap,就和material的逻辑一致? (希望尽量不改引擎)

collision preset是否有类似actor coloration的可视化检测方式?

<br/>

Thanks!

Hi 其实是有一个选项的,但是这个选项不知道为什么在界面上被设置为不可见了,因此要修改这个选项,必须修改一下代码

在 FStaticMeshComponentDetails::CustomizeDetails 中,将 UseDefaultCollision->MarkHiddenByCustomization(); 注释掉,就可以在蓝图界面上选择了

或者在 UStaticMeshComponent的构造函数中,在 ​SetCollisionProfileName(UCollisionProfile::BlockAllDynamic_ProfileName); 后加一行 bUseDefaultCollision = true

关于 coloration,给您写了一段代码,可以放在某个editor subsystem启动的时候注册调用

#if ENABLE_ACTOR_PRIMITIVE_COLOR_HANDLER if (!bPrimitiveColorHandlerRegistered) { FActorPrimitiveColorHandler::Get().RegisterPrimitiveColorHandler(TEXT("CollisionPresetColoration"), LOCTEXT("CollisionPresetColoration", "Collision Preset Coloration"), [](const UPrimitiveComponent* InPrimitiveComponent) { FName ProfileName = InPrimitiveComponent->GetCollisionProfileName(); if (ProfileName == UCollisionProfile::NoCollision_ProfileName) { return FLinearColor::Red; } else if (ProfileName == UCollisionProfile::BlockAll_ProfileName) { return FLinearColor::Yellow; } else if (ProfileName == UCollisionProfile::PhysicsActor_ProfileName) { return FLinearColor::Blue; } else if (ProfileName == UCollisionProfile::BlockAllDynamic_ProfileName) { return FLinearColor::Black; } else if (ProfileName == UCollisionProfile::Pawn_ProfileName) { return FLinearColor::Gray; } else if (ProfileName == UCollisionProfile::Vehicle_ProfileName) { return FLinearColor::White; } else if (ProfileName == UCollisionProfile::DefaultProjectile_ProfileName) { return FLinearColor::White; } return FLinearColor::White; }, []() {}, LOCTEXT("CollisionPresetColoration_ToolTip", "Colorize static mesh collison preset.")); bPrimitiveColorHandlerRegistered = true; } #endif