/**
* Super::StartInitialLoading()
* Super호출해서 DefaultEngine.ini or Project Settings의 Primary Asset 타입/경로 읽기
*/
void UEDAssetManager::StartInitialLoading()
{
Super::StartInitialLoading();
// TODO : 프로젝트 커스텀 초기화 작성
UE_LOG(LogTemp, Log, TEXT("[EDAssetManager] StartInitialLoading 실행완료"));
}
void ATestActor::BeginPlay()
{
Super::BeginPlay();
// Singleton 검증
UEDAssetManager& AM = UEDAssetManager::Get();
UE_LOG(LogTemp, Log, TEXT("AssetManager 타입: %s"), *AM.GetClass()->GetName());
FSoftObjectPath TestPath(TEXT("/Game/ED/Levels/NewDataAsset.NewDataAsset"));
TArray<FSoftObjectPath> Paths = { TestPath };
TArray<UObject*> OutAssets;
AM.LoadAssetsSync(Paths, OutAssets);
for (UObject* Obj : OutAssets)
{
if (Obj)
UE_LOG(LogTemp, Log, TEXT("동기 로드 성공: %s"), *Obj->GetName());
else
UE_LOG(LogTemp, Warning, TEXT("동기 로드 실패"));
}
}
// .h
TSharedPtr<FStreamableHandle> AsyncHandle;
void OnAsyncLoaded();
// .cpp
void AAssetManagerTestActor::BeginPlay()
{
Super::BeginPlay();
UEDAssetManager& AM = UEDAssetManager::Get();
UE_LOG(LogTemp, Log, TEXT("AssetManager 타입: %s"), *AM.GetClass()->GetName());
FSoftObjectPath TestPath(TEXT("/Game/ED/Levels/NewDataAsset.NewDataAsset"));
AsyncHandle = UEDAssetManager::Get().LoadAssetAsync(
TestPath,
FStreamableDelegate::CreateUObject(this, &AAssetManagerTestActor::OnAsyncLoaded)
);
}
void AAssetManagerTestActor::OnAsyncLoaded()
{
UE_LOG(LogTemp, Log, TEXT("비동기 로드 콜백 실행 완료"));
if (AsyncHandle.IsValid() && AsyncHandle->HasLoadCompleted())
{
UObject* Loaded = AsyncHandle->GetLoadedAsset();
UE_LOG(LogTemp, Log, TEXT("로드된 에셋: %s"), Loaded ? *Loaded->GetName() : TEXT("nullptr"));
}
}
Lyra에서 보고서 사용하려고 했었음
용도는 게임 시작시점에 실행할 작업들을 구조체로 묶어서 관리할 수 있었는데 보통 게임 설정을 한다고 한다. 공통적으로 사용하는 GameplayEffect를 정의하는데 공부하면 할 수록 StartUpJob이 너무 오버엔지니어링인거같아서 우선은 뒤로 미뤄야 할 것같다.
게임 시작시 필요한 모든 데이터 에셋 ID목록을 수집하고, UEDAssetManager의 비동기 로드를 호출하고, 완료 시 각 게임 시스템(캐릭터, AI, GAS등)에 데이터를 배포하는 역할