一些小方法
一些小方法
贴图设置属性
贴图设置属性
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月最新的回答,已经解决。
方法:修改文件命名即可。
运行 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/