9#include "Engine/StaticMeshActor.h"
10#include "Components/InstancedStaticMeshComponent.h"
11#include "Engine/StaticMesh.h"
15#include "Kismet/KismetSystemLibrary.h"
19using tag_size_t = std::underlying_type<ECityMapMeshTag>::type;
30 : Super(ObjectInitializer)
33 PrimaryActorTick.bCanEverTick =
false;
37 ObjectInitializer.CreateDefaultSubobject<USceneComponent>(
this, TEXT(
"SceneComponent"));
63 Super::OnConstruction(Transform);
70 Super::PostInitializeComponents();
73 if(
IsValid(GetLevel())&&!GetLevel()->IsPendingKill())
76 TArray<AActor*> roadpieces;
78 GetAttachedActors(roadpieces);
80 if(roadpieces.Num()==0)
83 UE_LOG(LogCarla, Error, TEXT(
"Please regenerate the road in edit mode for '%s' actor"), *UKismetSystemLibrary::GetDisplayName(
this));
95void ACityMapMeshHolder::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)
98 Super::PostEditChangeProperty(PropertyChangedEvent);
99 if (PropertyChangedEvent.Property)
128 if (Mesh !=
nullptr) {
153 return (Tag !=
nullptr ? *Tag : ECityMapMeshTag::INVALID);
167 const FQuat rotation(FVector(0.0f, 0.0f, 1.0f), Angle);
178 FActorSpawnParameters params;
180 params.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
182 FVector location = Transform.GetLocation();
184 FRotator rotation = Transform.Rotator();
186 AStaticMeshActor* StaticMeshActor = Cast<AStaticMeshActor>(GetWorld()->SpawnActor(AStaticMeshActor::StaticClass(),&location,&rotation,params));
188 StaticMeshActor->AttachToActor(
this,FAttachmentTransformRules::KeepRelativeTransform);
190 StaticMeshActor->SetMobility(EComponentMobility::Static);
192 UStaticMeshComponent* staticmeshcomponent = StaticMeshActor->GetStaticMeshComponent();
194 staticmeshcomponent->SetMobility(EComponentMobility::Static);
200 StaticMeshActor->bEnableAutoLODGeneration =
true;
214 TArray<UInstancedStaticMeshComponent*> oldcomponents;
216 GetComponents(oldcomponents);
218 for(int32 i=0;i<oldcomponents.Num();i++)
220 oldcomponents[i]->DestroyComponent();
224 TArray<AActor*> roadpieces;
226 GetAttachedActors(roadpieces);
229 for(int32 i=roadpieces.Num()-1; i>=0; i--)
235 roadpieces[i]->Destroy();
249 if (mesh ==
nullptr) {
254 TEXT(
"Cannot find mesh \"%s\" for computing tile size"),
260 FVector size = mesh->GetBoundingBox().GetSize();
UE_LOG(LogCarla, Log, TEXT("UActorDispatcher::Destroying actor: '%s' %x"), *Id, Actor)
static constexpr tag_size_t NUMBER_OF_TAGS
std::underlying_type< ECityMapMeshTag >::type tag_size_t
ECityMapMeshTag
用于标识ProceduralMapGenerator所使用的网格的标签
static bool IsValid(const ACarlaWheeledVehicle *Vehicle)
TMap< ECityMapMeshTag, UStaticMesh * > StaticMeshes
virtual void PostInitializeComponents() override
FVector GetTileLocation(uint32 X, uint32 Y) const
void SetStaticMesh(ECityMapMeshTag Tag, UStaticMesh *Mesh)
USceneComponent * SceneRootComponent
TMap< UStaticMesh *, ECityMapMeshTag > TagMap
void AddInstance(ECityMapMeshTag Tag, uint32 X, uint32 Y)
ECityMapMeshTag GetTag(const UStaticMesh &StaticMesh) const
UStaticMesh * GetStaticMesh(ECityMapMeshTag Tag)
ACityMapMeshHolder(const FObjectInitializer &ObjectInitializer)
virtual void OnConstruction(const FTransform &Transform) override
static ECityMapMeshTag FromUInt(uint8 Value)
将 标签转换为无符号整数类型
static constexpr uint8 GetNumberOfTags()
返回标签的数量
static FString ToString(ECityMapMeshTag Tag)
获取一个标签名称作为 FString
static ECityMapMeshTag GetBaseMeshTag()
返回基础网格。基础网格定义了地图缩放的单位图块
static const FName CARLA_ROAD_TAG
CARLA_ROAD 名称用于标记道路网格参与者。