За генерацию воксельного ладншафта отвечает класс UTerrainGeneratorComponent
.
Для изменения параметров генерации или добавления новых структур необходимо создать 2 класса:
-
создать свой класс контроллера (родитель
ASandboxTerrainController
) см. примерATerrainController
в файлеTerrainController.h
-
создать свой класс генератора (родитель
UTerrainGeneratorComponent
) см. примерUMainTerrainGeneratorComponent
в файлеMainTerrainGeneratorComponent.h
-
переопределить метод
ATerrainController::NewTerrainGenerator()
(см.TerrainController.cpp
) так чтобы он возвращал ссылку на новый генератор созданный в пункте 2
UTerrainGeneratorComponent* ATerrainController::NewTerrainGenerator() { UMainTerrainGeneratorComponent* Generator = NewObject<UMainTerrainGeneratorComponent>(this, TEXT("TerrainGenerator")); return Generator; }
Изменение генерации происходит посредством переопредеоения виртуальных методов класса UTerrainGeneratorComponent
см. пример MainTerrainGeneratorComponent.cpp
virtual float DensityFunctionExt(float InDensity, const TFunctionIn& In) const override;
Управляет генерацией плотности в данной конкретной точке. М.б. для генерации пустот, тоннелей или огранияения генерации мира по размеру 6
virtual FSandboxFoliage FoliageExt(const int32 FoliageTypeId, const FSandboxFoliage & FoliageType, const TVoxelIndex & ZoneIndex, const FVector & WorldPos) override;
Управляет генерацией растительности
virtual void OnBatchGenerationFinished() override;
Вызывается после окончании генерации пачки зон (не используется в данный момент)
virtual bool IsForcedComplexZone(const TVoxelIndex& ZoneIndex) override;
Переопределяет тип генерации зоны на Complex. Д.б. применено вместе с DensityFunctionExt
virtual void PrepareMetaData() override;
Не доделано
virtual void PostGenerateNewInstanceObjects(const TVoxelIndex& ZoneIndex, const TZoneGenerationType ZoneType, const TVoxelData* Vd, TInstanceMeshTypeMap& ZoneInstanceMeshMap) const override;
Вызвается после генерации зоны в фазе когда можно расставлять по зоне меши. Используется для раскидывания камней, бревен, других объектов
virtual TMaterialId MaterialFuncionExt(const TGenerateVdTempItm* GenItm, const TMaterialId MatId, const FVector& WorldPos, const TVoxelIndex VoxelIndex) const override;
Переопределяет материал в данной точке. Д.б. использовано вместе с IsForcedComplexZone
virtual void ExtVdGenerationData(TGenerateVdTempItm& VdGenerationData) override;
Вызывается перед началом генерации зоны. Используется для переопределения параметров генерации. Добавления объектов, пещер и т.п.
virtual void GenerateRegion(TTerrainRegion& Region);
Не доделано.
virtual TChunkDataPtr NewChunkData() override;
Используется чтобы заменить тип данных ChunkData. Добавить в него поля и т.д.
virtual void GenerateChunkDataExt(TChunkDataPtr ChunkData, const TVoxelIndex& Index, int X, int Y, const FVector& WorldPos) const override;
Вызывается перед началом генерации ChunkData
virtual float GroundLevelFunction(const TVoxelIndex& ZoneIndex, const FVector& WorldPos) const;
Переопределяет параметры генерации карты высот ландшафта. Использует шумы перлина. Здесь можно менять параметры и получать плоский или более холмистый ландшафт