跳至主要內容

Error17. GameInstanceInit阶段过早触发异步加载导致崩溃

Mr.Si小于 1 分钟u++

问题描述

头像

UGameInstance::Init() 阶段过早触发异步加载,导致子系统或资源尚未就绪,引发内存访问冲突。

void UExorcistGameInstance::Init()
{
	Super::Init();
	if(Request.IsEmpty()) return;
	
	UAsyncMultiDataCollectionLoader* Loader = UAsyncMultiDataCollectionLoader::AsyncMultiDataCollectionLoader(this,Request,LoadBundles);
	if(!Loader) return;
	
	Loader->OnSuccess.AddDynamic(this, &UExorcistGameInstance::OnDataCollectionLoaded);
	Loader->Activate();
}
void UExorcistGameInstance::OnDataCollectionLoaded(const TArray<FDataCollectionInstance>& DefinitionCollections)
{
	if(DefinitionCollections.IsEmpty()) return;
	
	UExorcistSaveGame* SaveSettings = UExorcistDataStorageLibrary::LoadSaveData(this);
	if (!SaveSettings) return;
	
	UUserDataSubsystem *UserData = GetSubsystem<UUserDataSubsystem>();
	if(!UserData) return;

	for(auto DataCollection : DefinitionCollections)
	{
		if(DataCollection.DefinitionInstance && DataCollection.PrimaryAssetType == TEXT("Inventory"))
		{
			UExorcistSaveDataValidatorLibrary::ValidateInventoryData(SaveSettings, DataCollection.DefinitionInstance);
		}
		else if(DataCollection.DefinitionInstance && DataCollection.PrimaryAssetType == TEXT("Hero"))
		{
			UExorcistSaveDataValidatorLibrary::ValidateHeroData(SaveSettings, DataCollection.DefinitionInstance);
		}
		UserData->AddDefinitionCollection(DataCollection.PrimaryAssetType, DataCollection.DefinitionInstance);
	}
	
	UExorcistDataStorageLibrary::SaveGameData(this, SaveSettings);

	UserData->MarkDataReady();
}

修复方案

头像

将异步加载逻辑从 Init() 移至 OnStart(),确保依赖项已初始化。