# 常见打包问题

# 由于UnrealEd

提示信息为:ERROR: Unable to instantiate module 'UnrealEd': Unable to instantiate UnrealEd module for non-editor targets.

解决方法:

在提示信息中找到使用UnrealEd的模块,比如"DatasmithImporter"。

# 使用ActorLabel

提示信息为:error C2039: 'GetActorLabel': is not a member of 'AActor'。

解决方法:

Actor labels 只在编辑器开发模式下有用,这种情况可以使用Actor Tags。

//检测是否有某个Tag
Actor->ActorHasTag(targetTag);

//添加某个Tag
Actor->Tags.Add(FName("added Tag"));
1
2
3
4
5

# 文件路径过长

提示信息为:Couldn't save package, filename is too long (268 >= 260)

解决办法:

把项目复制到根目录下重新打包,一般都可以通过。

# forceinline导致错误

forceinline会导致error LNK2019: unresolved external symbol。此时需要把inline函数放到其头文件中。

# 找不到蓝图

提示信息为:Error: COD Constructor (MyGameMode): Failed to find /Game/MyProject/MyBlueprint.MyBlueprint

上面的错误是由下面代码导致的:

static ConstructorHelpers::FClassFinder<AActor> UnitSelector(TEXT("Blueprint'/Game/MyProject/MyBlueprint.MyBlueprint'"));
TSubclassOf<AActor> UnitSelectorClass = UnitSelector.Class;
1
2

解决方法:

  1. 使用copy reference复制蓝图路径时,在末尾添加_C,比如:

    static ConstructorHelpers::FClassFinder<AActor> UnitSelector(TEXT("Blueprint'/Game/Blueprints/MyBlueprint.MyBlueprint_C'"));
    TSubclassOf<AActor> UnitSelectorClass = UnitSelector.Class;
    
    1
    2
  2. 移除路径前缀:

    static ConstructorHelpers::FClassFinder<AActor> UnitSelector(TEXT("/Game/Blueprints/MyBlueprint"));
    TSubclassOf<AActor> UnitSelectorClass = UnitSelector.Class;
    
    1
    2

注意FClassFinder<T>的模板名不能直接写UBlueprint,比如FClassFinder<UBlueprint>是不对的,该蓝图的父类是啥,模板名应该写该父类,如果它的父类是Actor,就应该写为FClassFinder<AActor>。

# 打包有调试信息

我们程序如果打包后崩溃,调试会比较麻烦,这个时候需要让打包的程序包含调试符号。设置方法在:

Project Settings->Packaging->Project->Include Debug Files。