本文整理2019年收集到的,ue4杂乱的小知识点
1. 控制台设置分辨率
可以用于锁帧
t.maxfps 20
2. 获取spline控制点的distance
有个问题是,当spline很长时,这个方法不太准确。那就不要让一条spline太长了
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导入和导出fbx
ue4版本不一样时,可以从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]