μ–Έλ¦¬μ–Όμ—μ„œ 에셋 λ©”λ‹ˆμ €μ— νŠΉμ • ν•˜μœ„ν΄λ”λ₯Ό κΈ°μ€€μœΌλ‘œ PrimaryAsset 리슀트λ₯Ό λΆˆλŸ¬μ˜€λŠ”? 그런 μž‘μ—…μ„ ν•˜κ³ μžˆλŠ”λ° 에디터 & StandAlone μ‹€ν–‰μ—μ„œλŠ” 잘 μž‘λ™ν•˜λŠ”λ°


νŒ¨ν‚€μ§• μ‹œμ—, ν•΄λ‹Ή 에셋듀을 뢈러올 수 μ—†μ–΄ μ—λŸ¬κ°€ λ°œμƒν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€



ν˜„μž¬ 진행상황이 


1. Primary Asset (AccessoryItem) μ œμž‘


UCLASS() class PHYSICSUK_API UAccessoryItem : public UGameItem, public IUseableItem { GENERATED_BODY() public: UAccessoryItem(); virtual void InitializeItem(FItemInformation ItemInformation) override; virtual void BeginDestroy() override; virtual FPrimaryAssetId GetPrimaryAssetId() const override; virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override; virtual void UseItem_Implementation() override; UFUNCTION(BlueprintCallable) void MakeRandomAccessoryAttribute(); virtual void SetItemAttributeToSpecHandle(FGameplayEffectSpecHandle SpecHandle) const override; UPROPERTY(Replicated, BlueprintReadOnly, EditAnywhere, Category = "AccessoryItem") FAccessoryItemInformation AccessoryItemInformation; virtual bool operator==(const FItemInformation& Rhs) const override; };

λŒ€μΆ© κ΅¬ν˜„μ€ μ΄λ ‡κ²ŒμƒκΉ€ (AccessoryItem)


GameItem = UPrimaryDataAsset을 κ³„μŠΉν•œ μ•„μ΄ν…œ



2. ν”„λ‘œμ νŠΈ 섀정에 에셋 λ§€λ‹ˆμ €μ— 폴더 μ§€μ •


24b0d121e09c28a8699fe8b115ef046f5848999a


ν•΄λ‹Ή μ•„μ΄ν…œμ„ Directories에 보면 ν•˜μœ„ 폴더λ₯Ό μ§€μ •ν•΄μ„œ ν•΄λ‹Ή 폴더 내에 DataAsset을 생성해두고 C++μ—μ„œ ν•΄λ‹Ή 리슀트λ₯Ό 뢈러올 수 μžˆλ„λ‘ μ œμž‘ν•¨.


μ΄λ ‡κ²Œ ν•˜λ‹ˆκΉ 에디터 & StandAlone μ‹€ν–‰μ—μ„œ ν•΄λ‹Ή 에셋듀을 μ œλŒ€λ‘œ μ°Έμ‘°ν•˜κ³  μžˆλŠ”λ°

λ¬Έμ œλŠ” νŒ¨ν‚€μ§•μ‹œμ— ν•΄λ‹Ή 에셋듀이 μ œλŒ€λ‘œ λΆˆλŸ¬μ™€μ§€μ§€ μ•Šκ³  μžˆμŠ΅λ‹ˆλ‹€.




//에셋 λ‘œλ“œ μ½”λ“œ c++


UGameItem* UPS_AssetManager::LoadRandomGameItem() { FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry"); TArray<FAssetData> AssetData; const UClass* GameItemClass = UGameItem::StaticClass(); const UClass* AccessoryItemClass = UAccessoryItem::StaticClass(); const UClass* ConsumableItemClass = UConsumableItem::StaticClass(); AssetRegistryModule.Get().GetAssetsByClass(FTopLevelAssetPath(GameItemClass->GetPathName()), AssetData); AssetRegistryModule.Get().GetAssetsByClass(FTopLevelAssetPath(AccessoryItemClass->GetPathName()), AssetData); AssetRegistryModule.Get().GetAssetsByClass(FTopLevelAssetPath(ConsumableItemClass->GetPathName()), AssetData); int32 RandomIndex = FMath::RandRange(0, AssetData.Num() - 1); if(RandomIndex < 0 || AssetData.Num() == 0) { return nullptr; } // μ„ νƒλœ 에셋 λ‘œλ“œ UObject* SelectedAsset = AssetData[RandomIndex].GetAsset(); // 원본 μ—μ…‹μ˜ 볡사본 생성 UGameItem* LoadedItem = Cast<UGameItem>(SelectedAsset); if (LoadedItem != nullptr) { UGameItem* ItemInstance = DuplicateObject<UGameItem>(LoadedItem, nullptr); if(UAccessoryItem* AccessoryItem = Cast<UAccessoryItem>(ItemInstance)) { AccessoryItem->MakeRandomAccessoryAttribute(); } //else if(UConsumableItem* ConsumableItem = Cast<UConsumableItem>(ItemInstance)) //{ // ConsumableItem->MakeRandomConsumableAttribute(); //} return ItemInstance; // μˆ˜μ •μ„ μœ„ν•œ μΈμŠ€ν„΄μŠ€ λ°˜ν™˜ } return nullptr; }
AssetRegistryModule.Get().GetAssetsByClass(FTopLevelAssetPath(GameItemClass->GetPathName()), AssetData);

이 λΌμΈμ—μ„œ 에디터 & StandAlone Launchμ—μ„œλŠ” μ œλŒ€λ‘œ 된 AssetDataκ°€ μΆ”κ°€κ°€λ˜λŠ”λ°

νŒ¨ν‚€μ§•μ‹œμ— ν•΄λ‹Ή λΌμΈμ—μ„œ 에셋을 μ œλŒ€λ‘œ λΆˆλŸ¬μ˜€μ§€ λͺ»ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.



뭐가 λ¬Έμ œμΌκΉŒμš”..?