Appearance
间接属性引用
加载资源的相关API。FSoftObjectPath是一个简单的结构体,用一个字符串包含资源的完整名称,可在编辑器中拾取资源但不加载。如需加载则添加额外的代码编写即可。
FSoftObjectPath能够拾取所有可序列化的资源。
cpp
UPROPERTY(EditAnywhere)
FSoftObjectPath SourcePath;
示例代码
cpp
// 直接设置资产路径(替代细节面板引用,如果在细节面板中引用可以忽略此步)
SourcePath.SetPath(TEXT("SoundWave'/Game/Font/coin.coin'"));
UObject* Source = SourcePath.TryLoad(); // 尝试加载 同步加载
USoundBase* Sound = Cast<USoundBase>(Source);
if(Sound)
{
UGameplayStatics::PlaySound2D(GetWorld(), Sound);
}
// ==================
// 加载类资产
SourcePath.SetPath(TEXT("Blueprint'/Game/NewBlueprint.NewBlueprint_C'"));
UObject* Source = SourcePath.TryLoad(); // 加载类资产
UClass* ObjClass = Cast<UClass>(Source);
if(ObjClass)
{
GetWorld()->SpawnActor<AActor>(ObjClass, FVector(100,100,100), FRotator::ZeroRotator);
}
异步加载
FStreamableManager可以帮助我们构建异步处理逻辑。需创建在全局游戏的单例对象中,结合FSoftObjectPath进行加载。
支持异步加载的同时也支持同步加载
cpp
FStreamableManager m_Streamable; // 构建为栈对象,需要引入头文件
模板数据加载
模板类帮助我们在进行资源操作时增加了类型安全检查,可以在细节面板中根据给定的模板类型拾取对应的资源,以获取更加高效的操作。
简单来说就是获取资源的时候能够限定类别,而不会罗列出一大堆不需要的东西了
可以用TSoftObjectPtr和TSoftClassPtr加载数据,同步异步都支持,但它们针对资源拾取类别不同。
cpp
// TSoftObjectPtr同步加载
FStreamableManager m_Streamable; // 构建为栈对象,需要引入头文件
UPROPERTY(EditAnywhere)
TSoftObjectPtr<class USoundBase> SoftSound;
SoftSound.ToSoftObjectPath(); // 可以转换为FSoftObjectPath对象
// 同步加载
UObject* Source = m_Streamable.LoadSynchronous(SoftSound);
USoundBase* Sound = Cast<USoundBase>(Source);
if(Sound)
{
UGameplayStatics::PlaySound2D(GetWorld(), Sound);
}
// 异步加载
m_Streamable.RequestAsyncLoad(SoftSound.ToSoftObjectPath(), FStreamableDelegate::CreateUObject(this, &AMyActor::LoadSourceCallBack));
void AMyActor::LoadSourceCallBack()
{
// 此函数调用,表明异步加载完成
// 加载完成后转换资产
USoundBase* Sound = Cast<USoundBase>(SoftSound.Get()); // Get加载资源
if(Sound)
{
UGameplayStatics::PlaySound2D(GetWorld(), Sound);
}
}
// =============================
// TSoftClassPtr加载
// 同步加载
TSubclassOf<ACharacter> CharacterClass = m_Streamable.LoadSynchronous(SoftCharacter);
if(CharacterClass)
{
GetWorld()->SpawnActor<ACharacter>(CharacterClass);
}
// 异步加载
m_Streamable.RequestAsyncLoad(SoftCharacter.ToSoftObjectPath(), FStreamableDelegate::CreateUObject(this, &AMyActor::LoadSourceCallBack));
void AMyActor::LoadSourceCallBack()
{
// 此函数调用,表明异步加载完成
UClass* CharacterClass = SoftCharacter.Get();
if(CharacterClass)
{
GetWorld()->SpawnActor(CharacterClass);
}
}