《UE4游戏开发》之 《TSoftObjectPtr引用资源并使用的陷阱》
错误使用例子://该if条件永远为falseif (anim_info->PreviewBorn && anim_info->PreviewBorn.IsValid()){AnimSeq.PreviewBorn = Cast<UAnimSequenceBase>(anim_info->PreviewBorn.LoadSynchronous());}el
·
- 错误使用例子:
//该if条件永远为false
if (anim_info->PreviewBorn && anim_info->PreviewBorn.IsValid())
{
AnimSeq.PreviewBorn = Cast<UAnimSequenceBase>(anim_info->PreviewBorn.LoadSynchronous());
}
else
{
AnimSeq.PreviewBorn = AnimSeq.Born;
}
//该if条件永远为false
if (anim_info->PreviewBorn)
{
AnimSeq.PreviewBorn = Cast<UAnimSequenceBase>(anim_info->PreviewBorn.LoadSynchronous());
}
else
{
AnimSeq.PreviewBorn = AnimSeq.Born;
}
- 经过测试发现,通过LoadSynchronous函数后,即先把资源加载到内存后,if条件才会为true
auto PreviewBorn = Cast<UAnimSequenceBase>(anim_info->PreviewBorn.LoadSynchronous());
//当anim_info->PreviewBorn有软引用资源时,if条件为true,否则为false
if (anim_info->PreviewBorn)
{
AnimSeq.PreviewBorn = PreviewBorn;
}
else
{
AnimSeq.PreviewBorn = AnimSeq.Born;
}
- 判断资源是否指向一个真实的UObject对象: TSoftObjectPtr::IsNull
FORCEINLINE bool IsNull() const
{
return !ObjectID.IsValid();
}
- 判断资源是否未被加载:TSoftObjectPtr::IsPending,当返回true时,资源未被加载,但是指向的是一个真实的Uobject;否则资源被加载或者不是指向的一个真实UObject,源代码:
FORCEINLINE bool IsPending() const
{
return Get() == nullptr && ObjectID.IsValid();
}
- 判断指向的资源被加载:TSoftObjectPtr::IsValid,当返回true时,表示资源已加载,可以通过Get()的方式使用资源
FORCEINLINE bool IsValid() const
{
return !!Get();
}
更多推荐
已为社区贡献2条内容
所有评论(0)