本文整理2019年日常记录的,UE4细碎的小常识。
1. 控造台设置分辩率能够用于锁帧
t.maxfps 20 2. 获取spline控造点的distance有个问题是,当spline很长时,那个办法不太准确。那就不要让一条spline太长了。
(20210116:仍然没有找到很好的,获取spline间隔的办法。若何通过肆意点的世界坐标,找到它在某条spline上对应的distance呢?有一个办法是获取spline上比来点的坐标,然后得到它的InputKey,通过那个Key前一点和后一点的distance,计算那点的间隔,但仍然禁绝确!)
3. Spline Mesh Runtime参考https://answers.unrealengine.com/questions/261136/add-spline-mesh-component-doesnt-work-at-runtime.html
利用SplineMeshComponent办法时,会报如下错误
处理办法是在蓝图里,将那个组件的挪动性改为可挪动
4. 性能阐发参考https://www.cnblogs.com/ghl_carmack/p/5481763.html起首要确定瓶颈是在CPU仍是GPU,为了找到是谁,以非debug版本启动你的法式,而且在控造台上输入stat unit号令,若是是在android平台上能够同时按下四个手指,翻开控造台,输入stat unit,它会显示如下图所示:
Frame时间是产生一帧花的总时间,因为逻辑线程(Game)和衬着线程(Draw)在一帧完毕的时候需要同步,一帧花的时间经常跟此中的一个线程花的时间附近。GPU时间丈量了显卡衬着当前场景花的时间。因为GPU时间是跟当前帧同步的,所以它跟一帧花的时间也根本差不多。
若是一帧花的时间跟逻辑线程的时间比力接近,那么瓶颈在逻辑线程,相反若是跟衬着线程的时间比力接近,那么瓶颈在衬着线程。若是两个时间都不接近,但跟GPU时间比力接近,那么瓶颈在显卡上。
当然也能够利用一些第三方东西,好比intel vtume、aqtime等,挪动平台上能够利用Apple Instruments、NVIDIA Tegra System Profiler、ARM DS-5等。
5. Create Widget能够用如下办法创建控件,重点是要添加到视口AddToViewport
6. FString 换行在蓝图中FString换行的办法是Shift+Enter
7. c++蓝图函数库要利用静态办法加个static,否则蓝图中找不到
UFUNCTION(BlueprintCallable, meta = (DisplayName = "SaveRenderTargetToFile", Keywords = "SaveRenderTargetToFile"), Category = "ADAS_SaveToFile") static bool SaveRenderTargetToFile(UTextureRenderTarget2D* rt, const FString& fileDestination); 8. 打包win64编译时报错参考https://blog.csdn.net/zhangxiaofan666/article/details/79567017
参考https://answers.unrealengine.com/questions/751683/systemargumentexception-path-fragment-content35123.html?sort=oldest
编译时报错如下
System.ArgumentException: Path fragment "ADAS/Content/ADAS/Texture/\346\226\271\345\235\227.uasset" contains invalid directory separators.在cmd中运行以下号令,就能够通过编译了
git config --global core.quotepath false 9. c++保留图像蓝图库函数C++类,实现将RanderTexture2D写入文件保留。那个参考了Rama的Victory插件,只撑持rgb888的rt
hpp: #pragma once #include "Runtime/Engine/Public/ImageUtils.h" #include "CoreMinimal.h" #include "Kismet/BlueprintFunctionLibrary.h" #include "MyBlueprintFunctionLibrary.generated.h" UCLASS() class ADAS_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary { GENERATED_BODY() UFUNCTION(BlueprintCallable, meta = (DisplayName = "SaveRenderTargetToFile", Keywords = "SaveRenderTargetToFile"), Category = "SaveToFile") static bool SaveRenderTargetToFile(UTextureRenderTarget2D* rt, const FString& fileDestination); }; cpp: #include "MyBlueprintFunctionLibrary.h" #include "FileHelper.h" #include "Engine/TextureRenderTarget2D.h" bool UMyBlueprintFunctionLibrary::SaveRenderTargetToFile(UTextureRenderTarget2D* rt, const FString& fileDestination) { FTextureRenderTargetResource* rtResource = rt->GameThread_GetRenderTargetResource(); FReadSurfaceDataFlags readPixelFlags(RCM_UNorm); TArray<FColor> outBMP; outBMP.AddUninitialized(rt->GetSurfaceWidth() * rt->GetSurfaceHeight()); rtResource->ReadPixels(outBMP, readPixelFlags); for (FColor& color : outBMP) color.A = 255; FIntPoint destSize(rt->GetSurfaceWidth(), rt->GetSurfaceHeight()); TArray<uint8> CompressedBitmap; FImageUtils::CompressImageArray(destSize.X, destSize.Y, outBMP, CompressedBitmap); bool imageSavedOk = FFileHelper::SaveArrayToFile(CompressedBitmap, *fileDestination); return imageSavedOk; return true; } 10. c++编译时报错贫乏*.generated.h UnrealHeaderTool failed for target CompilerResultsLog: ERROR: D:/project/adas-simulator/ADAS/Intermediate/Build/Win64/UE4Editor/Inc/ADAS/ADAS.init.gen.cpp: Changes to generated code are not allowed - conflicts written to D:/project/adas-simulator/ADAS/Intermediate/Build/Win64/UE4Editor/Inc/ADAS/ADAS.init.gen.cpp.conflict CompilerResultsLog: Error: UnrealHeaderTool failed for target ADASEditor (platform: Win64, module info: D:\project\adas-simulator\ADAS\Intermediate\Build\Win64\ADASEditor\Development\ADASEditor.uhtmanifest, exit code: OtherCompilationError (5)). LogMainFrame: MainFrame: Module compiling took 21.413 seconds创建C++类
一般来说都是在Editor中add new c++,如许加完后会主动参加到vs工程中并编译主动生成 XXX.generated.h 头文件。
也能够手动创建c++的XXX.h 和XXX.cpp,然后利用UBT间接参加vs工程中,然后编译生成XXX.generated.h 头文件。
(ps:#inclued “XXX.generated.h”编译前是不存在的,但是也要参加到XXX.h中)
编译情况DebugGame和DebugDevelopment来回切,也是有效的
11. 显示鼠标运行时默认是隐藏鼠标的,蓝图中以下节点显示鼠标
12. 高分辩率截图蓝图中利用高分辩率截图,很卡。高分辩率截图在编纂时利用比力好
13. 挪动spline控造点按住alt能够增加控造点,其实ue4中按住alt和3dmax中按住shift一样,能够复造
14. 动态创建spawn参考https://blog.csdn.net/ln_polaris/article/details/54346319
SpawnActor。若是是Character类,还要继续挪用Spawn Default Controller办法,否则生成的Character不会动
15. 设置character速度若是间接设置Movement组件里的速度,会卡,招致动画播放不不变。能够通过AddMovementInput节点设置
16. 利用手柄参考http://www.52vr.com/thread-30834-1-1.html
我用的手柄是rapoo v10 那款手柄,毗连无线USB之后,在“控造面板\硬件和声音\设备和打印机”里找关于手柄手柄的设备,然后输入,能够看到一些值的反应。需要下载 x360ce.exe下载vld-2.5-setup.exe,我也忘记那是什么工具了。下载手柄驱动,用什么下什么。在手柄接入后,翻开se360x,需要联网下载一些动态库,然后点击保留会生成动态库“xinput1_3.dll”,“x360ce.ini”编纂器内运行时,若想得到手柄的输入,需要在设置手柄按键后把“xinput1_3.dll”,“x360ce.ini”,拷贝到“Epic Games\4.13\Engine\Binaries\Win64...”途径下。
打包后运行时把“xinput1_3.dll”,“x360ce.ini”,拷贝到“WindowsNoEditor\YourProject\Binaries\Win64...”目次下。
别的,控造台号令,show debug input 能够看到输入,申明输入是准确的。
记得重启ue4,那个确实有效。但不确定里面下载的工具是不是都有用 17. 设置默认关卡设置开启editor时默认翻开的关卡,和打包后运行时默认翻开的关卡。项目设置->地图
18. ui蓝图表露变量其他类要挪用的话,勾上Is Variable
19. 差别版本切换时无法保留高版本导入到低版本时,低版本有的工具显示不出来
若是碰到类似“因为时高版本保留的,所以无法保留”的问题,把高版本的UASSET文件删除,然后再导入fbx或者贴图等尝尝
20. 3dmax导入和导出fbxue4版本纷歧样时,能够从ue4导出fbx,然后从3dMax导出,再导入到ue4
3dMax导出设置,留意勾选涡轮光滑,单元改为cm,轴改为z向上
21. 定序器player不勾选show player就没有player的
22. ui对camera可见性设置Widget的此选项,能够让其他摄像头拍不到那个UI,不然所有物体都能看到(?)
23. 射线检测LineTraceByChannel办法,对应unity中RayCast
24. 世界设置中的Lightmass不是原创,参考的链接找不到了
世界光照设置中第一个决定了在计算静态光要详细到几厘米,那个参数越小精细,但相对的会大大提拔构建时间,留意是针对静态光照。我给出的建议是小场景若是逃求十分精细的话建议在0.3-0.2,中大型场景的话4.0-1.0摆布都能够。
第二个是计算间接光的反弹次数,越高反弹次数和间接光效果越好,但是超越50后提拔不在明显或者会变差,越高构建的时间越长。建议是逃求画量的情况下最末要做出效果时在进步到30-50摆布。(间接光对场景实在度影响很大)
第三个是间接光照的量量 能削减噪点和一些污渍的暗影,但其实不能处理光照UV呈现问题的污渍暗影,和上面一样,越高越好时间越久。建议逃求高效果的话在8-10摆布,若是是通俗的游戏那2-5就能够。
第四个决定了间接光照的光滑度,但越高会对间接暗影有细节丧失,若是上一个参数调整比力高的话,那个参数不克不及超越0.65-0.75
25. 光照贴图分辩率那个现实上用的不多(雾)
26. uv堆叠参考http://90cg.com/wordpress/ue4_mesh%E6%A8%A1%E5%9E%8B%E5%AF%BC%E5%85%A5%E9%97%AE%E9%A2%98%E4%B9%8Buvw%E4%BA%8C%E6%AC%A1uv/
此次碰到的问题是没有2次UV。把模子导入3dmax,修改器-uvw展开,挪动,新建一个通道,再导给ue就行
思疑只需要导入3dmax,再导给ue就行
27. 导入资本后引用不准确导入资本经常会引用不准确,就是途径不准确
右键导入的资本,查看引用。将文件夹改成对应的途径能够修复
28. 异常处置在Unity中,您可能习惯于当发作问题是抛出异常。虚幻4则其实不处置异常。取而代之的做法是,利用 “check()” 函数来触发严峻的错误。能够传入一个错误信息提醒。若是只是想陈述一个错误,但其实不希望打断整个法式,能够利用 “ensure()”。那将会记录一个完好仓库的日记信息,但法式会继续施行。若是当前附加了调试器,那么那两个函数城市暂定并进入调试器。
29. .NET Framework去哪里了unity和ue4的对应关系
30. 调整VIVE眼镜的明晰度 r.screenpercentage 200 r.screenpercentage[30-300]