我们遇到了一个打包后引用丢失的问题。
简单来讲,有一个数据资产(DataAssetA)硬引用了另一个数据资产(DataAssetB)。
在编辑器中运行游戏时一切正常,但打出来的游戏包里,DataAssetA 对 DataAssetB 的引用丢失了。
但此时使用 DataAssetB 的完整路径来加载的话,依然能成功加载。也就是说 DataAssetB 确实已经正常打到游戏包里了。
进一步排查后,我们发现在Cook时,DataAssetA 引用的 DataAssetB 的值不为空,但对象的名字变成了 ‘REINST_’ 开头。
我们了解到“REINST”是蓝图编译生成实例时创建的临时对象。Cook结束时,临时对象会被丢弃掉,所以引用也就丢失了。
DataAssetB 确实被另外三个动画蓝图所硬引用。而我们把这些引用去掉后,引用丢失的情况也没再出现。
但是,我们不希望使用“把硬引用改成软引用”这种方式来解决这个问题,因为这会对很多流程造成比较大影响。
此外还有一个原因,我们当前出现问题的项目是在大约一年前从另一个项目中切出来的分支。那个原始项目也有类似的用法,但当时并没出现过这个引用丢失的问题。
我们希望能找到导致这一问题的根本原因。
具体引用关系如下:
· DA_Player_Melee_Hand 被以下4个资产引用:DA_Fist_EmptyHand, ABP_PlayerBase, ABP_PlayerBase_UI, ABP_PlayerBase_MeleeLayer
· 打包后,DA_Fist_EmptyHand 引用的 DA_Player_Melee_Hand 丢失了
· Cook时,DA_Fist_EmptyHand 引用的 DA_Player_Melee_Hand 不为空,但名字变成了 ‘REINST_DABP_Player_Melee_C_0’
· ABP_PlayerBase 和 ABP_PlayerBase_MeleeLayer 对 DA_Player_Melee_Hand 的引用会造成引用丢失问题,但是 ABP_PlayerBase_UI 却不会
类继承结构如下:
DA_Player_Melee_Hand 是蓝图类 DABP_Player_Melee 的实例
DABP_Player_Melee 继承自另一个蓝图类 DABP_Player_ALS
DABP_Player_ALS 继承自C++类 UMyAnimationHub
DA_Fist_EmptyHand 是C++类 UMyWeaponDataAsset 的实例
ABP_PlayerBase, ABP_PlayerBase_UI, ABP_PlayerBase_MeleeLayer 继承自 UAnimInstance(省略了一些中间的动画蓝图基类)
UENUM(BlueprintType)
enum class EBodyShape : uint8
{
Default = 0,
Male = 1,
Female = 2,
};
UCLASS(Abstract, BlueprintType, Blueprintable)
class UMyAnimationHub : public UPrimaryDataAsset
{
};
UCLASS(NotBlueprintable, Abstract)
class UMyWeaponDataAsset : public UPrimaryDataAsset
{
TMap<EBodyShape, UMyAnimationHub*> CommonWeaponAnims;
}
[Attachment Removed]