杂项

一些小方法

一些小方法

贴图设置属性

贴图设置属性

ReferenceViewer

ReferenceViewer

Commandlet

Commandlet

Redirector

Redirector

编译

编译

解析文件

解析文件

保存资产

https://georgy.dev/posts/save-uobject-to-package/

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
bool SaveToAsset(UObject* ObjectToSave)
{
	UPackage* Package = ObjectToSave->GetPackage();
	const FString PackageName = Package->GetName();
	const FString PackageFileName = FPackageName::LongPackageNameToFilename(PackageName, FPackageName::GetAssetPackageExtension());

	FSavePackageArgs SaveArgs;
	
	// This is specified just for example
	{
		SaveArgs.TopLevelFlags = RF_Public | RF_Standalone;
		SaveArgs.SaveFlags = SAVE_NoError;
	}
	
	const bool bSucceeded = UPackage::SavePackage(Package, nullptr, *PackageFileName, SaveArgs);

	if (!bSucceeded)
	{
		UE_LOG(LogTemp, Error, TEXT("Package '%s' wasn't saved!"), *PackageName)
		return false;
	}

	UE_LOG(LogTemp, Warning, TEXT("Package '%s' was successfully saved"), *PackageName)
	return true;
}

HTTP 请求

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
bool bHttpRequest = false;

FString RequestContent;
TSharedRef<TJsonWriter<TCHAR, TPrettyJsonPrintPolicy<TCHAR>>> JsonWriter = TJsonWriterFactory<TCHAR, TPrettyJsonPrintPolicy<TCHAR>>::Create(&RequestContent);
JsonWriter->WriteObjectStart();
JsonWriter->WriteValue("xxx", "xxx");
JsonWriter->WriteObjectEnd();
JsonWriter->Close();

FHttpModule& HttpModule = FModuleManager::LoadModuleChecked<FHttpModule>("HTTP");
TSharedRef<IHttpRequest, ESPMode::ThreadSafe> Request = HttpModule.Get().CreateRequest();
Request->SetVerb(TEXT("POST"));
Request->SetHeader("Content-Type", "application/json;charset=UTF-8");
Request->SetURL("xxxxxx");
Request->SetContentAsString(RequestContent);
Request->OnProcessRequestComplete().BindLambda(
    [&bHttpRequest](FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded)
    {
        bHttpRequest = true;
        if (bSucceeded)
        {
            // do some thing
        }
        else
        {
            // do some thing
        }
    });
Request->ProcessRequest();

while (!bHttpRequest)
{
    FHttpManager& HttpManager = FHttpModule::Get().GetHttpManager();
    HttpManager.Tick(0.0f);
    FPlatformProcess::Sleep(0.0f);
}

注意到,我们这里有一个 flag 标志位 bHttpRequest,是为了确保完成http请求再进行后续的操作(不放在回调里),此时需要使用 HttpManager.Tick

参考: https://blog.csdn.net/qq_51654332/article/details/131489044

启动时debug

当我们打了一个游戏包,希望断点调试,可以先启动游戏,然后attach到这个进程:

但是这样做游戏刚开始进行就无法调试到,我们可以增加参数 -WaitForDebugger:

(可以alt加鼠标左键拖动exe包,生成一个快捷方式,然后给快捷方式添加启动参数)

此时会无事发生,点击刚刚的attach按钮会看到这个进程,接着会挂在这里(Engine\Source\Runtime\Launch\Private\Launch.cpp):

点击continue继续就好了。

修改cpp不打包测试

编辑器运行和打包后运行环境不太一样,走的engine loop的地方也有差别(编辑器下似乎是 UUnrealEdEngine::Tick,打包后是 UGameEngine::Tick), 因此有时候测试需要打包后测,但是若是只改动部分cpp就要重新打个包会很漫长。

我们可以把配置改为 Development,然后编译项目(只需编译游戏项目就可以了),编译后在 Binaries\Win64 下,我们把编译后的游戏 exe 拷贝覆盖之前 打的游戏包(这里只替换exe就行)。但是注意,直接运行 Development 是不可以的,因为相对路径不太一样。

Console Variable

https://docs.unrealengine.com/5.3/zh-CN/console-varaibles-cplusplus-in-unreal-engine/

项目打开了 r.GenerateMeshDistanceFields,导致Static Mesh资源检查时都会生成一遍Distance Field,比较耗时,我们在编辑器下 console 里输入 r.GenerateMeshDistanceFields 1,可以发现是只读的:

是因为这个变量有这个flag:

这样写也是报这个read only的错:

1
2
FString Final = "r.GenerateMeshDistanceFields 0";
GEngine->Exec(GetWorld(), *Final);

但是根据注释我们仍然可以C++中更改:

1
UConsoleVariablesEditorFunctionLibrary::SetConsoleVariableByName_Bool("r.GenerateMeshDistanceFields", false);

但是commandlet下仍然报错:

1
LogConsoleVariablesEditor: Error: UConsoleVariablesEditorFunctionLibrary::SetConsoleVariableByName_String: FConsoleVariablesEditorCommandInfo was not foundwith given name: r.GenerateMeshDistanceFields.

在 RenderSettings.h 中,该变量如下:

read only 属性则对应在这:

可以改成 ECVF_Default 来作用。

问题合集

fatal error C1083: Cannot open compiler generated file

主要是打包的时候出现的:

1
fatal error C1083: Cannot open compiler generated file: 'xxxx': Permission denied

最后发现是这个 xxxx 文件是只读的,右键属性把只读勾掉就行。

Asset cannot be saved as it has only been partially loaded

根据UE4AnserHub的今年6月最新的回答,已经解决。

方法:修改文件命名即可。

缺失 XInput1_3.dll

运行 Engine\Extras\Redist\en-us\UEPrereqSetup_x64.exe 下载安装依赖项。

udp日志过多

log里全是这样的日志:

1
LogUdpMessaging: Warning: FUdpMessageProcessor::UpdateReassemblers Discarding 2/4 of stale message segements from Sender=xxx, Sequence=0

关闭这个插件就行:

页面文件太小

https://ue5wiki.com/wiki/5cc4f8a/

材质回退到默认方格块

打开关卡会对 map 进行检测,注意看消息日志。

我这里是出现某个材质需要勾选 bUsedWithStaticLighting 的选项,勾了就好了。

libcurl info message cache

log 中总弹这些内容,可以在编辑器偏好中选择不发送给 UE:

Go to Edit -> Editor Preferences -> Search for “Usage Data” -> select Don’t Send option

参考: https://forums.unrealengine.com/t/what-is-my-editor-trying-to-do/76707/21

xxx plugin was designed for build xxx. Attempt to load it anyway?

这是因为对应插件的 .uplugin 中有一个 EngineVersion 字段,里面的引擎版本号和当前引擎版本号不一致,启动就会弹窗警告。(常发生在 ugs 拉完,再用源码编译时)

可以把 Engine\Build\Build.version 这里面的 IsLicenseeVersion 字段从 1 改成 0

修复GPU驱动程序崩溃

https://dev.epicgames.com/documentation/zh-cn/unreal-engine/how-to-fix-a-gpu-driver-crash-when-using-unreal-engine

合集

https://zhuanlan.zhihu.com/p/80809567

https://docs.unrealengine.com/5.3/en-US/map-check-errors-in-unreal-engine/

Licensed under CC BY-NC-SA 4.0