景观创作 C++ UE4.27

Landscape Creation C++ UE4.27

我想在 unreal engine 4.27 中仅使用 C++ 从头开始​​创建景观。我对这个过程只有一个简单的概念,它围绕 GetWorld()->SpawnActor<ALandscape>ALandscapeProxy::Import(...) 和导入 height/weight 地图。


我使用LandscapeEditorDetailCustomization_NewLandscape::OnCreateButtonClicked()方法作为学习基础,但不幸的是我陷入了僵局。


从我的搜索中收集到的信息来看,关于这个问题的例子并不多。有人有建议或例子吗?

这是我想出的解决方案,非常感谢 ChenHP (or chpsemail) who gave me a solution to this. Firstly, declare the following variables. A better understanding can be found here

FQuat InRotation
FVector InTranslation
FVector InScale
FTransform LandscapeTransform{InRotation, InTranslation, InScale}
int32 QuadsPerSection
int32 SectionsPerComponent
int32 ComponentCountX
int32 ComponentCountY
int32 QuadsPerComponent
int32 SizeX
int32 SizeY

为景观的高度和 material 创建容器:

TArray<FLandscapeImportLayerInfo> MaterialImportLayers
TMap<FGuid, TArray<uint16>> HeightDataPerLayers
TMap<FGuid, TArray<FLandscapeImportLayerInfo>> MaterialLayerDataPerLayers

需要注意的是,UE4中的高度是uint16类型,0最深,65'534最高。因此对于平面地图,所有高度条目都应为 32768。 高度数是地图的分辨率,取决于SizeX和SizeY。

TArray<uint16> HeightData;
HeightData.SetNum(SizeX * SizeY);
for (int32 i = 0; i < HeightData.Num(); i++)
{
    HeightData[i] = 32768;
}

高度和material信息应该放在相应的容器中,并赋予一个有效的FGuid。

HeightDataPerLayers.Add(FGuid(), MoveTemp(HeightData))
MaterialLayerDataPerLayers.Add(FGuid(), MoveTemp(MaterialImportLayers))

此时景观的基本参数已经设置ALandscape* Landscape = SpawnActor<ALandscape>() 可以在任何时候调用,因为它只是生成一个实际上没有任何关于它的信息的对象。这也适用于设置景观的领域。需要设置的字段如下所示:

Landscape->bCanHaveLayersContent
Landscape->LandscapeMaterial
Landscape->SetActorTransform
Landscape->StaticLightingLOD
ULandscapeInfo* LandscapeInfo = Landscape->GetLandscapeInfo()
LandscapeInfo->UpdateLayerInfoMap(Landscape)
Landscape->RegisterAllComponents()
Landscape->GetClass()
Landscape->PostEditChangeProperty(MaterialPropertyChangedEvent)
Landscape->PostEditChange()

风景被赋予形式的实际部分发生在Landscape->Import(...)的调用中。


可以找到有关脚本外观的详细解释 here 以及有关景观的更多信息(查看 cpp 代码的答案)。