一.出现错误
献上代码,在我自己的PlayerController里。加载继承了我C++类的Widget
void AMyPlayerController::BeginPlay()
{
Super::BeginPlay();
FString WidgetClassLoadPath = FString(TEXT("/Script/UMGEditor.WidgetBlueprint'/Game/GameUI/UMG_Widget.UMG_Widget_C'"));
UClass* widgetClass = LoadClass<UUserWidget>(NULL,*WidgetClassLoadPath); //动态加载
UUserWidget* MyWidgetClss = nullptr;
if (widgetClass)
{
MyWidgetClss = CreateWidget<UUserWidget>(GetWorld(), widgetClass); //创建UUserWidget
if (MyWidgetClss)
{
MyWidgetClss->AddToViewport();
}
else
{
GEngine->AddOnScreenDebugMessage(-1,5.0f,FColor::Red,TEXT("d"));
}
}
else
{
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("c"));
}
}
为什么这个代码,编译时正常加载,打包后一直打印c。如果不写if判断一下空指针,在编译状态下好好的。然后在打包好,就会崩溃。而网上这种动态加载类的方式,很常见。先加载UClass,在用CreateWidget<T>,创建你自己的widget类。
二.分析原因
写法肯定是没有问题的。说明指针空了,而且打包以后空了。后来查过相关资料,发现打包只会将蓝图引用过的资源打进去。怪不得,但我按网上查的做法,都没有解决。
主要思路,就是在打包的时候,将想要多打的文件夹打进去。
三.解决方案
1.Packaging Settings(也可以在ProjectSetting里找)
2.好多,都说用其他的。但用to Cook 我这个项目的问题,才解决。
试过下面这种,并没有解决。上面这个可以,实现动态加载,多打包的资源。