Foliage usually follows when the Transform of the placed ground or floor changes. However, if the ground or floor is a Level Instance Actor, it will not follow.
The cause is in the code below.
void AInstancedFoliageActor::OnLevelActorMoved(AActor* InActor) { UWorld* InWorld = InActor->GetWorld(); if (!InWorld || !InWorld->IsGameWorld()) { for (UActorComponent* Component : InActor->GetComponents()) { if (Component) { MoveInstancesForMovedComponent(Component); } } ... } void AInstancedFoliageActor::MoveInstancesForMovedComponent(UActorComponent* InComponent) { ... const auto BaseId = InstanceBaseCache.GetInstanceBaseId(InComponent); if (BaseId == FFoliageInstanceBaseCache::InvalidBaseId) { return; } ...
Instance of Foliage has the information of the placed Component. This component is a component of the Actor in LevelInstance. But since the Component of LevelInstanceActor itself is used in the check of the tracking process, the tracking process is not executed.
To solve this, you need to save the RootComponent of LevelInstanceActor in Instance like following code.
Engine\Source\Editor\FoliageEdit\Private\FoliageEdMode.cpp // add #include "LevelInstance/LevelInstanceSubsystem.h" #include "LevelInstance/LevelInstanceActor.h" // bool FEdModeFoliage::AddInstancesImp(UWorld* InWorld, const UFoliageType* Settings, const TArray<FDesiredFoliageInstance>& DesiredInstances, const TArray<int32>& ExistingInstanceBuckets, const float Pressure, LandscapeLayerCacheData* LandscapeLayerCachesPtr, const FFoliageUISettings* UISettings, const FFoliagePaintingGeometryFilter* OverrideGeometryFilter, bool InRebuildFoliageTree) { ... { SCOPE_CYCLE_COUNTER(STAT_FoliageSpawnInstance); TArray<FFoliageInstance> PlacedInstances; PlacedInstances.Reserve(AdditionalInstances); // add ULevelInstanceSubsystem* LevelInstanceSubsystem = InWorld->GetSubsystem<ULevelInstanceSubsystem>(); ///// for (int32 Idx = 0; Idx < AdditionalInstances; Idx++) { FPotentialInstance& PotentialInstance = PotentialInstances[Idx]; FFoliageInstance Inst; if (PotentialInstance.PlaceInstance(InWorld, Settings, Inst)) { Inst.ProceduralGuid = PotentialInstance.DesiredInstance.ProceduralGuid; Inst.BaseComponent = PotentialInstance.HitComponent; // add if (LevelInstanceSubsystem) { ALevelInstance* LevelInstanceActor = LevelInstanceSubsystem->GetParentLevelInstance(Inst.BaseComponent->GetOwner()); if (LevelInstanceActor) { Inst.BaseComponent = LevelInstanceActor->GetRootComponent(); } } ///// PlacedInstances.Add(MoveTemp(Inst)); bPlacedInstances = true; } } SpawnFoliageInstance(InWorld, Settings, UISettings, PlacedInstances, InRebuildFoliageTree); } } return bPlacedInstances; }
expect : Foliage follow 3
result : foliage does not follow 3. Therefore, foliage and 3 appear to be separated
Why does the REMOVE method of map container remove elements have memory leaks?
How does TextureRenderTarget2D get TArray<uint8> type data?
What is the cause of the packaging error falling back to 'GameUserSettings' in ue5?
How do I set a material as a post-processing material?
What is the difference between Camera and CineCamera?
How to delete some elements correctly when deleting an array loop?
There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-157536 in the post.
3 |
Component | UE - World Creation - Worldbuilding Tools - Foliage |
---|---|
Affects Versions | 5.0 |
Target Fix | 5.6 |
Created | Jun 24, 2022 |
---|---|
Updated | Oct 11, 2024 |