diff --git a/Config/DefaultEngine.ini b/Config/DefaultEngine.ini index be05846e..0583d2a7 100644 --- a/Config/DefaultEngine.ini +++ b/Config/DefaultEngine.ini @@ -1,7 +1,7 @@ [/Script/EngineSettings.GameMapsSettings] -EditorStartupMap=/Game/Test/Maps/TestLevel.TestLevel +EditorStartupMap=/Game/Test/Maps/L_Test.L_Test LocalMapOptions= TransitionMap=None bUseSplitscreen=True diff --git a/Content/BeachBoys/Mesh/ABP_BeachBoy.uasset b/Content/BeachBoys/Mesh/ABP_BeachBoy.uasset new file mode 100644 index 00000000..75198909 --- /dev/null +++ b/Content/BeachBoys/Mesh/ABP_BeachBoy.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ec9e42e13926b3ca7b075156fe6c8b457bc3b138302ba8feccc29ac7493220d8 +size 44285 diff --git a/Content/BeachBoys/Mesh/IK_BeachBoy_01.uasset b/Content/BeachBoys/Mesh/IK_BeachBoy_01.uasset new file mode 100644 index 00000000..424acac7 --- /dev/null +++ b/Content/BeachBoys/Mesh/IK_BeachBoy_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e240423ceb14398c2fcc1fbc201d2089a97e437edfba6c074d5126ada49e5830 +size 104709 diff --git a/Content/BeachBoys/Mesh/RTG_BeachBoy_01.uasset b/Content/BeachBoys/Mesh/RTG_BeachBoy_01.uasset new file mode 100644 index 00000000..726c0525 --- /dev/null +++ b/Content/BeachBoys/Mesh/RTG_BeachBoy_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:13670b968209a44884c8846ae52526fc5b95f97fb25c9a61c32962c1cc3b6a49 +size 27595 diff --git a/Content/BeachGirls/Mesh/ABP_BeachGirl.uasset b/Content/BeachGirls/Mesh/ABP_BeachGirl.uasset new file mode 100644 index 00000000..4f835be8 --- /dev/null +++ b/Content/BeachGirls/Mesh/ABP_BeachGirl.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4fe8f98f92d8b82bd5671d3d257ebaba0a3a5d76145586d9fabed7f9629cc62a +size 44290 diff --git a/Content/BeachGirls/Mesh/IK_BeachGirl_01.uasset b/Content/BeachGirls/Mesh/IK_BeachGirl_01.uasset new file mode 100644 index 00000000..6a8e7676 --- /dev/null +++ b/Content/BeachGirls/Mesh/IK_BeachGirl_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6cddf379d866bfaa0dcdd084d1b38a9ff9bbb4213a0ead561d9825c0abcc9f5b +size 98021 diff --git a/Content/BeachGirls/Mesh/RTG_BeachGirl_01.uasset b/Content/BeachGirls/Mesh/RTG_BeachGirl_01.uasset new file mode 100644 index 00000000..5209c2d8 --- /dev/null +++ b/Content/BeachGirls/Mesh/RTG_BeachGirl_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ce1c4de19d24bffa73397d36c2eee886982c60f2f734ab4eee94815f00528b1 +size 24039 diff --git a/Content/Blueprints/NPC/BP_NPC_BeachBoy.uasset b/Content/Blueprints/NPC/BP_NPC_BeachBoy.uasset new file mode 100644 index 00000000..1552e80f --- /dev/null +++ b/Content/Blueprints/NPC/BP_NPC_BeachBoy.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a088e58ada7aeb2e08cb22eaf7233468ccbeb9edba4b8eedddc61928a8d5a07b +size 27499 diff --git a/Content/Blueprints/NPC/BP_NPC_BeachGirl.uasset b/Content/Blueprints/NPC/BP_NPC_BeachGirl.uasset new file mode 100644 index 00000000..d7775c40 --- /dev/null +++ b/Content/Blueprints/NPC/BP_NPC_BeachGirl.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eb688f99e678bb9cf2ee92be88da8ff9e810c8a298d56ff85027f39f5fbce27b +size 27303 diff --git a/Content/Blueprints/NPC/BP_NPC_GamerGirl.uasset b/Content/Blueprints/NPC/BP_NPC_GamerGirl.uasset new file mode 100644 index 00000000..c93de7ac --- /dev/null +++ b/Content/Blueprints/NPC/BP_NPC_GamerGirl.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4cff52d7c93d2406c995e07dec6a313094e68891ac611e4ea5a613f202156ece +size 27462 diff --git a/Content/Blueprints/NPC/BP_NPC_GymBoy.uasset b/Content/Blueprints/NPC/BP_NPC_GymBoy.uasset new file mode 100644 index 00000000..6c6fa9bc --- /dev/null +++ b/Content/Blueprints/NPC/BP_NPC_GymBoy.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad7fe4eccf05897cd87181b53bcb01d98d7539d35bb3ea11892f0e441a84448d +size 22755 diff --git a/Content/Blueprints/NPC/BP_NPC_GymGirl.uasset b/Content/Blueprints/NPC/BP_NPC_GymGirl.uasset new file mode 100644 index 00000000..9c2a057f --- /dev/null +++ b/Content/Blueprints/NPC/BP_NPC_GymGirl.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ced3a97d18645115f0a8681c22de7c21edb9b6f20def6422d6c093c0e085ee31 +size 27102 diff --git a/Content/Blueprints/NPC/BP_NPC_Stalker.uasset b/Content/Blueprints/NPC/BP_NPC_Stalker.uasset deleted file mode 100644 index 692d3bf0..00000000 --- a/Content/Blueprints/NPC/BP_NPC_Stalker.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:586d9f7f6e1557f1010653b7164b6db3605aed2c827a5b1575ebdeaa7044b90e -size 28628 diff --git a/Content/Blueprints/NPC/BP_NPC_Walker.uasset b/Content/Blueprints/NPC/BP_NPC_Walker.uasset deleted file mode 100644 index 1844d69a..00000000 --- a/Content/Blueprints/NPC/BP_NPC_Walker.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f421c247a5b85fd6f1d1afcc3ebb89ba27c12d47e66e55dae728258ca0105b68 -size 29012 diff --git a/Content/Blueprints/NPC/NPCDirectorConfig.uasset b/Content/Blueprints/NPC/NPCDirectorConfig.uasset index 354bc8f6..c2433ec1 100644 --- a/Content/Blueprints/NPC/NPCDirectorConfig.uasset +++ b/Content/Blueprints/NPC/NPCDirectorConfig.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5426c6ffa5bed281697e10e0e76c4d914f2338f13f5a47af3ecf3bf8c5ec5455 -size 2041 +oid sha256:44ce2cbcdcb9f419637d144f9a14a119bc4a5d8fd5e10596dfff69bb590edcc1 +size 2764 diff --git a/Content/Gamer_Girl/Mesh/ABP_GamerGirl.uasset b/Content/Gamer_Girl/Mesh/ABP_GamerGirl.uasset new file mode 100644 index 00000000..b1a22270 --- /dev/null +++ b/Content/Gamer_Girl/Mesh/ABP_GamerGirl.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8fb0654da44d922d3e7c611209d387cae990510ccf019c10ddd1ac1434b9aaae +size 44464 diff --git a/Content/Gamer_Girl/Mesh/IK_GamerGirl_01.uasset b/Content/Gamer_Girl/Mesh/IK_GamerGirl_01.uasset new file mode 100644 index 00000000..03c03fa0 --- /dev/null +++ b/Content/Gamer_Girl/Mesh/IK_GamerGirl_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d939059a0f074eb97c9d95667ae982fd83e982807279b93fe8d6739cd03ce07c +size 98054 diff --git a/Content/Gamer_Girl/Mesh/RTG_GamerGirl_01.uasset b/Content/Gamer_Girl/Mesh/RTG_GamerGirl_01.uasset new file mode 100644 index 00000000..7f2f5fe9 --- /dev/null +++ b/Content/Gamer_Girl/Mesh/RTG_GamerGirl_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2728e0c0d0f34b905202be31d08bf2f7b03bccb0d353e8a51deae063c070eb49 +size 24099 diff --git a/Content/GymBoys/Mesh/ABP_GymBoy.uasset b/Content/GymBoys/Mesh/ABP_GymBoy.uasset new file mode 100644 index 00000000..0aac2a03 --- /dev/null +++ b/Content/GymBoys/Mesh/ABP_GymBoy.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b6b5eb0855597592342627c5a2ff34c4bb6d66799b25e257e773f4ea07130937 +size 43464 diff --git a/Content/GymBoys/Mesh/ABP_GymBoys.uasset b/Content/GymBoys/Mesh/ABP_GymBoys.uasset deleted file mode 100644 index e3470a58..00000000 --- a/Content/GymBoys/Mesh/ABP_GymBoys.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:67162faca54de1fe8e2c1c9e8fd6220a09edbaeb9fc4d9ee76e14b2c82ccda99 -size 43539 diff --git a/Content/GymBoys/Mesh/RTG_GYMBOY_01.uasset b/Content/GymBoys/Mesh/RTG_GYMBOY_01.uasset index 29a08485..40d37d24 100644 --- a/Content/GymBoys/Mesh/RTG_GYMBOY_01.uasset +++ b/Content/GymBoys/Mesh/RTG_GYMBOY_01.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:34c4eff1b856ca223d90d71bd8d20387ecc87d169f8078665d60306990ec8634 -size 27363 +oid sha256:5880db1fb29539526e3c132992a156a187dc052ca6a88e468eb27916e9a62d2d +size 29786 diff --git a/Content/GymGirls/Materials/Body/M_GYMGIRLS_HEAD.uasset b/Content/GymGirls/Materials/Body/M_GYMGIRLS_HEAD.uasset index db6ce42c..51ab9d3d 100644 --- a/Content/GymGirls/Materials/Body/M_GYMGIRLS_HEAD.uasset +++ b/Content/GymGirls/Materials/Body/M_GYMGIRLS_HEAD.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1f70b062cdef56cbc3061c39ffef4280afe1b8065cd2422175f57826344b6958 -size 142059 +oid sha256:d00800d83cd22076eb9483b660e231895b0f12bd860c2c63b8679d1a8f383fd7 +size 27726 diff --git a/Content/GymGirls/Mesh/ABP_GymGirl.uasset b/Content/GymGirls/Mesh/ABP_GymGirl.uasset new file mode 100644 index 00000000..1b498009 --- /dev/null +++ b/Content/GymGirls/Mesh/ABP_GymGirl.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1dc46add5dee1f9b3dc4d1579b4acaa984a6ee60c23af7d56d39955f82937d1f +size 43756 diff --git a/Content/GymGirls/Mesh/IK_GYMGIRL_01.uasset b/Content/GymGirls/Mesh/IK_GYMGIRL_01.uasset new file mode 100644 index 00000000..a4d4d9d1 --- /dev/null +++ b/Content/GymGirls/Mesh/IK_GYMGIRL_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c0cd3a8e43d552b3affbfdab9af9bd862e556c32bc6f41871a4569c73ec8fa59 +size 109441 diff --git a/Content/GymGirls/Mesh/RTG_GYMGIRL_01.uasset b/Content/GymGirls/Mesh/RTG_GYMGIRL_01.uasset new file mode 100644 index 00000000..4b43c66a --- /dev/null +++ b/Content/GymGirls/Mesh/RTG_GYMGIRL_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:30c8aaf3dea5cb2b966529c4dbf23a40a16f8f6bc033641db8dc23b58a95bcc6 +size 23707 diff --git a/Content/Test/Maps/TestLevel.umap b/Content/Test/Maps/TestLevel.umap deleted file mode 100644 index b0ae84b2..00000000 --- a/Content/Test/Maps/TestLevel.umap +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:10e9325562564550973b3b95300e26cc44a40c0f22af89836756876dabff770e -size 2187 diff --git a/Source/NakedDesire/NPC/NPC.cpp b/Source/NakedDesire/NPC/NPC.cpp index 6c26e805..3de3cb82 100644 --- a/Source/NakedDesire/NPC/NPC.cpp +++ b/Source/NakedDesire/NPC/NPC.cpp @@ -7,6 +7,7 @@ #include "NPCTypeDefinition.h" #include "NPCAIController.h" #include "NPCTargetLocation.h" +#include "NPCVisualsConfig.h" #include "BehaviorTree/BlackboardComponent.h" #include "Components/SkeletalMeshComponent.h" #include "GameFramework/CharacterMovementComponent.h" @@ -33,22 +34,22 @@ ANPC::ANPC() ENPCType ANPC::GetNPCType() const { - return NPCTypeDefinition ? NPCTypeDefinition->Type : ENPCType::Walker; + return TypeDefinition ? TypeDefinition->Type : ENPCType::Walker; } float ANPC::GetObservationWeight() const { - return NPCTypeDefinition ? NPCTypeDefinition->ObservationWeight : 1.0f; + return TypeDefinition ? TypeDefinition->ObservationWeight : 1.0f; } bool ANPC::ShouldStopToObserve() const { - return NPCTypeDefinition ? NPCTypeDefinition->bStopsToObserve : false; + return TypeDefinition ? TypeDefinition->bStopsToObserve : false; } float ANPC::GetObserveDuration() const { - return NPCTypeDefinition ? NPCTypeDefinition->ObserveDurationSeconds : 0.0f; + return TypeDefinition ? TypeDefinition->ObserveDurationSeconds : 0.0f; } void ANPC::ActivateFromPool(const FVector& Location, const FRotator& Rotation) @@ -97,4 +98,21 @@ void ANPC::DeactivateToPool() SetActorHiddenInGame(true); SetActorEnableCollision(false); -} \ No newline at end of file +} + +void ANPC::Init(ENPCType InType) +{ + if (InType == ENPCType::None) + return; + + Type = InType; + + if (!NPCTypeDefinitions.Contains(Type)) + return; + + UNPCTypeDefinition* Definition = NPCTypeDefinitions[Type]; + if (!Definition) + return; + + TypeDefinition = Definition; +} diff --git a/Source/NakedDesire/NPC/NPC.h b/Source/NakedDesire/NPC/NPC.h index ad449c7c..000bd4b6 100644 --- a/Source/NakedDesire/NPC/NPC.h +++ b/Source/NakedDesire/NPC/NPC.h @@ -7,6 +7,7 @@ #include "NPCType.h" #include "NPC.generated.h" +class UNPCVisualsConfig; class ANPCTargetLocation; class UNPCTypeDefinition; @@ -21,7 +22,7 @@ public: // Behavioral template for this NPC (Walker / Stalker / …). Author one DA_* per type and assign // here (or on the NPC blueprint). Null falls back to Walker-ish defaults (GDD §10.2, §17.4). UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "NPC") - TObjectPtr NPCTypeDefinition; + TMap> NPCTypeDefinitions; UFUNCTION(BlueprintPure, Category = "NPC") ENPCType GetNPCType() const; @@ -43,8 +44,16 @@ public: // layer restart and pick a fresh destination (BT startup lives in BP, §17.5). void ActivateFromPool(const FVector& Location, const FRotator& Rotation); void DeactivateToPool(); + void Init(ENPCType InType); protected: UPROPERTY(BlueprintReadWrite, Category = "NPC") TObjectPtr TargetLocationActor; + +private: + UPROPERTY() + ENPCType Type = ENPCType::None; + + UPROPERTY() + TObjectPtr TypeDefinition; }; \ No newline at end of file diff --git a/Source/NakedDesire/NPC/NPCDirectorConfig.h b/Source/NakedDesire/NPC/NPCDirectorConfig.h index b87ce046..de148181 100644 --- a/Source/NakedDesire/NPC/NPCDirectorConfig.h +++ b/Source/NakedDesire/NPC/NPCDirectorConfig.h @@ -14,9 +14,9 @@ USTRUCT(BlueprintType) struct FNPCSpawnEntry { GENERATED_BODY() - + UPROPERTY(EditDefaultsOnly, Category = "NPC") - TSubclassOf NPCClass; + ENPCType Type = ENPCType::Walker; UPROPERTY(EditDefaultsOnly, Category = "NPC", meta = (ClampMin = "0.0")) float Weight = 1.0f; @@ -59,4 +59,7 @@ public: // Weighted classes drawn into the pool at prewarm. Empty = director spawns nothing. UPROPERTY(EditDefaultsOnly, Category = "Population") TArray SpawnTable; + + UPROPERTY(EditDefaultsOnly, Category = "NPC") + TArray> NPCClasses; }; \ No newline at end of file diff --git a/Source/NakedDesire/NPC/NPCDirectorSubsystem.cpp b/Source/NakedDesire/NPC/NPCDirectorSubsystem.cpp index d8af3489..8f61bdc4 100644 --- a/Source/NakedDesire/NPC/NPCDirectorSubsystem.cpp +++ b/Source/NakedDesire/NPC/NPCDirectorSubsystem.cpp @@ -67,11 +67,13 @@ void UNPCDirectorSubsystem::PrewarmPool() for (int32 i = 0; i < Config->MaxNPCs; ++i) { - const TSubclassOf NPCClass = PickWeightedClass(); - if (!NPCClass) + const ENPCType NPCType = PickWeightedClass(); + if (NPCType == ENPCType::None) continue; - ANPC* NPC = World->SpawnActor(NPCClass, FVector::ZeroVector, FRotator::ZeroRotator, Params); + TSubclassOf SelectedNPCClass = GetRandomNPCClass(Config->NPCClasses); + ANPC* NPC = World->SpawnActor(SelectedNPCClass, FVector::ZeroVector, FRotator::ZeroRotator, Params); + NPC->Init(NPCType); if (!NPC) continue; @@ -169,31 +171,31 @@ void UNPCDirectorSubsystem::ReturnToPool(ANPC* NPC) } } -TSubclassOf UNPCDirectorSubsystem::PickWeightedClass() const +ENPCType UNPCDirectorSubsystem::PickWeightedClass() const { const UNPCDirectorConfig* Config = GetConfig(); if (!Config) - return nullptr; + return ENPCType::None; float TotalWeight = 0.0f; for (const FNPCSpawnEntry& Entry : Config->SpawnTable) { - if (Entry.NPCClass && Entry.Weight > 0.0f) + if (Entry.Type != ENPCType::None && Entry.Weight > 0.0f) TotalWeight += Entry.Weight; } if (TotalWeight <= 0.0f) - return nullptr; + return ENPCType::None; float Roll = FMath::FRandRange(0.0f, TotalWeight); for (const FNPCSpawnEntry& Entry : Config->SpawnTable) { - if (!Entry.NPCClass || Entry.Weight <= 0.0f) + if (Entry.Type == ENPCType::None || Entry.Weight <= 0.0f) continue; Roll -= Entry.Weight; if (Roll <= 0.0f) - return Entry.NPCClass; + return Entry.Type; } - return nullptr; + return ENPCType::None; } bool UNPCDirectorSubsystem::FindSpawnPoint(const FVector& Around, FVector& OutLocation) const @@ -219,6 +221,12 @@ bool UNPCDirectorSubsystem::FindSpawnPoint(const FVector& Around, FVector& OutLo return false; } +TSubclassOf UNPCDirectorSubsystem::GetRandomNPCClass(TArray> InNPCClasses) +{ + const int32 RandomIndex = FMath::RandRange(0, InNPCClasses.Num() - 1); + return InNPCClasses[RandomIndex]; +} + APawn* UNPCDirectorSubsystem::GetPlayerPawn() const { return UGameplayStatics::GetPlayerPawn(GetWorld(), 0); diff --git a/Source/NakedDesire/NPC/NPCDirectorSubsystem.h b/Source/NakedDesire/NPC/NPCDirectorSubsystem.h index 369d9718..e1f340db 100644 --- a/Source/NakedDesire/NPC/NPCDirectorSubsystem.h +++ b/Source/NakedDesire/NPC/NPCDirectorSubsystem.h @@ -3,6 +3,7 @@ #pragma once #include "CoreMinimal.h" +#include "NPCType.h" #include "Subsystems/WorldSubsystem.h" #include "NakedDesire/Global/TimeOfDaySubsystem.h" #include "NPCDirectorSubsystem.generated.h" @@ -40,8 +41,9 @@ private: ANPC* TakeFromPool(); void ReturnToPool(ANPC* NPC); - TSubclassOf PickWeightedClass() const; + ENPCType PickWeightedClass() const; bool FindSpawnPoint(const FVector& Around, FVector& OutLocation) const; + TSubclassOf GetRandomNPCClass(TArray> InNPCClasses); APawn* GetPlayerPawn() const; UNPCDirectorConfig* GetConfig() const; diff --git a/Source/NakedDesire/NPC/NPCType.h b/Source/NakedDesire/NPC/NPCType.h index a65e0676..ee99ecc8 100644 --- a/Source/NakedDesire/NPC/NPCType.h +++ b/Source/NakedDesire/NPC/NPCType.h @@ -11,6 +11,7 @@ UENUM(BlueprintType) enum class ENPCType : uint8 { + None UMETA(DIsplayName = "None"), Walker UMETA(DisplayName = "Walker"), Stalker UMETA(DisplayName = "Stalker"), Blogger UMETA(DisplayName = "Blogger"), diff --git a/Source/NakedDesire/NPC/NPCVisualsConfig.cpp b/Source/NakedDesire/NPC/NPCVisualsConfig.cpp new file mode 100644 index 00000000..fa945128 --- /dev/null +++ b/Source/NakedDesire/NPC/NPCVisualsConfig.cpp @@ -0,0 +1,4 @@ +// © 2025 Naked People Team. All Rights Reserved. + + +#include "NPCVisualsConfig.h" diff --git a/Source/NakedDesire/NPC/NPCVisualsConfig.h b/Source/NakedDesire/NPC/NPCVisualsConfig.h new file mode 100644 index 00000000..f679035e --- /dev/null +++ b/Source/NakedDesire/NPC/NPCVisualsConfig.h @@ -0,0 +1,17 @@ +// © 2025 Naked People Team. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "Engine/DataAsset.h" +#include "NPCVisualsConfig.generated.h" + +UCLASS() +class NAKEDDESIRE_API UNPCVisualsConfig : public UPrimaryDataAsset +{ + GENERATED_BODY() + +public: + UPROPERTY(EditDefaultsOnly, Category = "Visuals") + TArray> BodyMeshes; +};