1. 错误使用例子:
//该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;
}
  1. 经过测试发现,通过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;
}
  1. 判断资源是否指向一个真实的UObject对象: TSoftObjectPtr::IsNull
FORCEINLINE bool IsNull() const
	{
		return !ObjectID.IsValid();
	}
  1. 判断资源是否未被加载:TSoftObjectPtr::IsPending,当返回true时,资源未被加载,但是指向的是一个真实的Uobject;否则资源被加载或者不是指向的一个真实UObject,源代码:
FORCEINLINE bool IsPending() const
	{
		return Get() == nullptr && ObjectID.IsValid();
	}
  1. 判断指向的资源被加载:TSoftObjectPtr::IsValid,当返回true时,表示资源已加载,可以通过Get()的方式使用资源
FORCEINLINE bool IsValid() const
	{
		return !!Get();
	}

更多推荐