UE4 C++ 类的4种引用类型,和异步加载资产
4种引用类型
对象引用:引用 World 的实例对象。
就是直接定义
UPROPERTY(EditAnywhere,BlueprintReadOnly,Category="My")//对象引用
UWorld* LoadPackageSoftObjectPath4;
类引用:引用从 World 继承而来的类。
TSubclassOf 是提供 UClass 类型安全性的模板类
允许在类型安全的情况下传递 TClassType 的模板
UPROPERTY(EditAnywhere,BlueprintReadOnly,Category="My")//类引用
TSubclassOf<UWorld>LoadPackageSoftObjectPath3;
软类引用:从类型的 World 继承的类的路径,该类型可能不会被加载。可用于异步加载类。
TSoftClassPtr是 FSoftObjectPtr 的模板化包装器,其工作方式类似于TSubclassOf,它可以在 UProperties 中用于蓝图子类
UPROPERTY(EditAnywhere,BlueprintReadOnly,Category="My")//软类引用
TSoftClassPtr<UWorld> LoadPackageSoftObjectPath2;
软对象引用: 类型为 World 的实例Object的路径,该类型可能不会被加载。可用于异步加载资产。
TSoftObjectPtr是通用FSoftObjectPtr的模板化包装器,可以在 UProperties 中使用
UPROPERTY(EditAnywhere,BlueprintReadOnly,Category="My")//软对象引用
TSoftObjectPtr<UWorld> LoadPackageSoftObjectPath;
异步加载资产,这里异步加载关卡,打开关卡
C++类的游戏模式基础:
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "LoadLevelGameModeBase.generated.h"
/**
*
*/
UCLASS()
class LOADLEVEL_API ALoadLevelGameModeBase : public AGameModeBase
{
GENERATED_BODY()
public:
bool bIsLoaded;
UPROPERTY()
FString LoadPackagePath;
UPROPERTY(EditAnywhere,BlueprintReadOnly,Category="My")//软对象引用
TSoftObjectPtr<UWorld> LoadPackageSoftObjectPath;
UPROPERTY(EditAnywhere,BlueprintReadOnly,Category="My")//软类引用
TSoftClassPtr<UWorld> LoadPackageSoftObjectPath2;
UPROPERTY(EditAnywhere,BlueprintReadOnly,Category="My")//类引用
TSubclassOf<UWorld>LoadPackageSoftObjectPath3;
UPROPERTY(EditAnywhere,BlueprintReadOnly,Category="My")//对象引用
UWorld* LoadPackageSoftObjectPath4;
// 用于加载完成的回调
DECLARE_DYNAMIC_DELEGATE(FOnAsyncLoadFinished);
public:
UFUNCTION(BlueprintCallable,Category="My")
void MyAsyncLoad(const FOnAsyncLoadFinished& OnAsyncLoadFinished);
UFUNCTION(BlueprintCallable,Category="My")
float GetLoadProgress();
};
// Copyright Epic Games, Inc. All Rights Reserved.
#include "LoadLevelGameModeBase.h"
//开始异步加载
void ALoadLevelGameModeBase::MyAsyncLoad(const FOnAsyncLoadFinished& OnAsyncLoadFinished)
{
//不使用GetBaseFilename,编译 error C4458: LoadPackageAsync failed to begin to load a package···
LoadPackagePath = FPaths::GetBaseFilename(LoadPackageSoftObjectPath.ToString(), false);
bIsLoaded = false;
UE_LOG(LogTemp, Warning, TEXT("String: %s"), *LoadPackagePath);
LoadPackageAsync(
LoadPackagePath,
FLoadPackageAsyncDelegate::CreateLambda([=](const FName& PackageName, UPackage* LoadedPackage, EAsyncLoadingResult::Type Result)
{
//开始
if (Result == EAsyncLoadingResult::Failed)
{
UE_LOG(LogTemp, Warning, TEXT("Load Failed"));
}
else if (Result == EAsyncLoadingResult::Succeeded)//加载完毕
{
bIsLoaded = true;
UE_LOG(LogTemp, Warning, TEXT("Load Succeeded"));
OnAsyncLoadFinished.ExecuteIfBound();//调用绑定的事件,
}
}
), 0, PKG_ContainsMap);
}
//获取加载的进度 -1 —— 100
float ALoadLevelGameModeBase::GetLoadProgress()
{
float FloatPercentage = GetAsyncLoadPercentage(*LoadPackagePath);
if (!bIsLoaded)
{
FString ResultStr = FString::Printf(TEXT("Percentage: %f"), FloatPercentage);
GEngine->AddOnScreenDebugMessage(-1, 2.0f, FColor::Green, ResultStr);
UE_LOG(LogTemp, Warning, TEXT("Percentage: %f"), FloatPercentage);
}
else
{
FloatPercentage = 100;
}
return FloatPercentage;
}
这个是开始加载和加载完成
namespace EAsyncLoadingResult
{
enum Type
{
/** Package failed to load */
Failed,
/** Package loaded successfully */
Succeeded,
/** Async loading was canceled */
Canceled
};
}
主要看LoadPackageAsync这个函数的使用:
了解后用生成一个继承游戏模式基础的蓝图类
在蓝图类里调用和赋初值
加载完后打开关卡就行了