《UE4游戏开发》之 《TSoftObjectPtr引用资源并使用的陷阱》

  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();
	}
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值