unreal4 调试代码

2016-11-15 09:25:05 pizi0475 阅读数 0

http://blog.csdn.net/shangguanwaner/article/details/42002711

UE4中提供了很多预定义的调试绘制函数,在做调试的时候还是比较方便的。可以在场景里绘制点、线、圆、球、箭头、椎体、胶囊、甚至样条线、字符串、网格等等,基本上该有的都有了。比较赞的是,你能控制线条的厚度,调试的时候就比较直观了。

要使用这些函数,只需要包含DrawDebugHelpers.h 头文件即可。下面介绍几个主要的绘制函数:

1.绘制点

[cpp] view plain copy
  1. ENGINE_API void DrawDebugPoint(const UWorld* InWorld, FVector const& Position, float Size, FColor const& PointColor, bool bPersistentLines = falsefloat LifeTime=-1.f, uint8 DepthPriority = 0);  

可选参数里面,我们可以控制点的尺寸、颜色、持续时间等。bPersistentLines表示,当前绘制的整个对象,是不是持久对象,设为true,它会一直显示当前World,直到你调用下面这个方法,释放它:
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. void FlushPersistentDebugLines(const UWorld* InWorld);  
其他的绘制函数,此参数意义都是一样的。

2.绘制线

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. ENGINE_API void DrawDebugLine(const UWorld* InWorld, FVector const& LineStart, FVector const& LineEnd, FColor const& Color, bool bPersistentLines = falsefloat LifeTime=-1.f, uint8 DepthPriority = 0, float Thickness = 0.f);  

注意Thickness这个参数,它控制线条的厚度。

3.绘制箭头

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. ENGINE_API void DrawDebugDirectionalArrow(const UWorld* InWorld, FVector const& LineStart, FVector const& LineEnd, float ArrowSize, FColor const& Color, bool bPersistentLines = falsefloat LifeTime=-1.f, uint8 DepthPriority = 0);  
这个函数绘制一个有向箭头,和绘制线差不多,ArrowSize是箭头的尺寸。

4.绘制Box

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. ENGINE_API void DrawDebugBox(const UWorld* InWorld, FVector const& Center, FVector const& Extent, FColor const& Color, bool bPersistentLines = falsefloat LifeTime=-1.f, uint8 DepthPriority = 0);  
  2. /** Draw a debug box with rotation */  
  3. ENGINE_API void DrawDebugBox(const UWorld* InWorld, FVector const& Center, FVector const& Box, const FQuat & Rotation, FColor const& Color, bool bPersistentLines = falsefloat LifeTime=-1.f, uint8 DepthPriority = 0);  

第一个根据Box的尺寸绘制,第二个额外的可以按照一定的旋转绘制。

5.绘制球体

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. ENGINE_API void DrawDebugSphere(const UWorld* InWorld, FVector const& Center, float Radius, int32 Segments, FColor const& Color, bool bPersistentLines = falsefloat LifeTime=-1.f, uint8 DepthPriority = 0);  
Segments控制球体的分段,越大越精细。

6.其他

还有很多不太常用的,可以绘制2D圆、圆柱、椎体、平截头体、胶囊等。这里只列出来,具体见DrawDebugHelpers.h
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. ENGINE_API void DrawDebugCoordinateSystem(const UWorld* InWorld, FVector const& AxisLoc, FRotator const& AxisRot, float Scale, bool bPersistentLines = falsefloat LifeTime=-1.f, uint8 DepthPriority = 0);  
  2. /** Draw Debug Circle */  
  3. ENGINE_API void DrawDebugCircle(const UWorld* InWorld, const FMatrix& TransformMatrix, float Radius, int32 Segments, const FColor& Color, bool bPersistentLines = falsefloat LifeTime=-1.f, uint8 DepthPriority = 0);  
  4. /** Draw Debug 2D donut */  
  5. ENGINE_API void DrawDebug2DDonut(const UWorld* InWorld, const FMatrix& TransformMatrix, float InnerRadius, float OuterRadius, int32 Segments, const FColor& Color, bool bPersistentLines = falsefloat LifeTime=-1.f, uint8 DepthPriority = 0);  
  6. /** Draw a debug sphere */  
  7. ENGINE_API void DrawDebugSphere(const UWorld* InWorld, FVector const& Center, float Radius, int32 Segments, FColor const& Color, bool bPersistentLines = falsefloat LifeTime=-1.f, uint8 DepthPriority = 0);  
  8. /** Draw a debug cylinder */  
  9. ENGINE_API void DrawDebugCylinder(const UWorld* InWorld, FVector const& Start, FVector const& End, float Radius, int32 Segments, FColor const& Color, bool bPersistentLines = falsefloat LifeTime=-1.f, uint8 DepthPriority = 0);  
  10. ENGINE_API void DrawDebugCone(const UWorld* InWorld, FVector const& Origin, FVector const& Direction, float Length, float AngleWidth, float AngleHeight, int32 NumSides, FColor const& Color, bool bPersistentLines=falsefloat LifeTime=-1.f, uint8 DepthPriority = 0);  
  11. /** Used by gameplay when defining a cone by a vertical and horizontal dot products. */  
  12. ENGINE_API void DrawDebugAltCone(const UWorld* InWorld, FVector const& Origin, FRotator const& Rotation, float Length, float AngleWidth, float AngleHeight, FColor const& DrawColor, bool bPersistentLines=falsefloat LifeTime=-1.f, uint8 DepthPriority=0);  
  13. ENGINE_API void DrawDebugString(const UWorld* InWorld, FVector const& TextLocation, const FString& Text, class AActor* TestBaseActor = NULL, FColor const& TextColor = FColor::White, float Duration = -1.000000);  
  14. ENGINE_API void DrawDebugFrustum(const UWorld* InWorld, const FMatrix& FrustumToWorld, FColor const& Color, bool bPersistentLines = falsefloat LifeTime=-1.f, uint8 DepthPriority = 0);  
  15. /** Draw a capsule using the LineBatcher */  
  16. ENGINE_API void DrawDebugCapsule(const UWorld* InWorld, FVector const& Center, float HalfHeight, float Radius, const FQuat & Rotation, FColor const& Color, bool bPersistentLines=falsefloat LifeTime=-1.f, uint8 DepthPriority = 0);  
  17. /** Draw a debug camera shape.  FOV is full angle in degrees. */  
  18. ENGINE_API void DrawDebugCamera(const UWorld* InWorld, FVector const& Location, FRotator const& Rotation, float FOVDeg, float Scale=1.f, FColor const& Color=FColor::White, bool bPersistentLines=falsefloat LifeTime=-1.f, uint8 DepthPriority = 0);  
  19. ENGINE_API void FlushDebugStrings(const UWorld* InWorld);  
  20.   
  21. ENGINE_API void DrawDebugSolidBox(const UWorld* InWorld, FVector const& Center, FVector const& Box, FColor const& Color, bool bPersistent=falsefloat LifeTime=-1.f, uint8 DepthPriority = 0);  
  22. ENGINE_API void DrawDebugSolidBox(const UWorld* InWorld, FVector const& Center, FVector const& Extent, FQuat const& Rotation, FColor const& Color, bool bPersistent=falsefloat LifeTime=-1.f, uint8 DepthPriority = 0);  
  23. ENGINE_API void DrawDebugMesh(const UWorld* InWorld, TArray<FVector> const& Verts, TArray<int32> const& Indices, FColor const& Color, bool bPersistent=falsefloat LifeTime=-1.f, uint8 DepthPriority = 0);  
  24. ENGINE_API void DrawDebugSolidPlane(const UWorld* InWorld, FPlane const& P, FVector const& Loc, float Size, FColor const& Color, bool bPersistent=falsefloat LifeTime=-1, uint8 DepthPriority = 0);  
  25.   
  26. /* Draws a 2D Histogram of size 'DrawSize' based FDebugFloatHistory struct, using DrawTransform for the position in the world. */  
  27. ENGINE_API void DrawDebugFloatHistory(UWorld const & WorldRef, FDebugFloatHistory const & FloatHistory, FTransform const & DrawTransform, FVector2D const & DrawSize, FColor const & DrawColor, bool const & bPersistent = falsefloat const & LifeTime = -1.f, uint8 const & DepthPriority = 0);  
  28.   
  29. /* Draws a 2D Histogram of size 'DrawSize' based FDebugFloatHistory struct, using DrawLocation for the location in the world, rotation will face camera of first player. */  
  30. ENGINE_API void DrawDebugFloatHistory(UWorld const & WorldRef, FDebugFloatHistory const & FloatHistory, FVector const & DrawLocation, FVector2D const & DrawSize, FColor const & DrawColor, bool const & bPersistent = falsefloat const & LifeTime = -1.f, uint8 const & DepthPriority = 0);  


2017-09-12 10:45:00 OnafioO 阅读数 186

unreal4特性介绍


原文地址:   https://www.unrealengine.com/products/unreal-engine-4     unreal enginer介绍


我的UE4学习(一)


你曾想过用连线的形式来编写程序么;
你曾想过通过编辑工具就可以来创建类,并在vs中自动生成类和函数,头文件和cpp文件么;
你曾想过粒子效果可以成千上万的渲染,并且牛逼的粒子还可以反射光线么;
你做的效果可以能会超越电影画质的游戏;
你曾想象和意淫一下,C++不用编译可以实时的在编辑图形界面上调试和添加断点么;

我看了UE4代码的一个小小的角落,就觉得自己来到了一个无知的世界。你的想象,别人已经实现了。
自惭形秽的同时,希望能学到人家的一二。

Welcome To  The Future! 牛逼闪闪的UE4 来了!

ue4需要的基本电脑配置:
Win7 64位系统或Mac OSX10.9.2以上版本
Intel 或AMD处理器 2.5GHZ以上。
兼容DX11 的GPU。
8G内存,不够的请自动升级!
 

一、特性说明

特性

Ue4是一款专业开发高质量游戏的平台开发工具。Ue4的渲染加快可以满足开发者完成出色的画面,同时也可以匹配低端系统。

全新工作流的特性和深度的工具箱可让开发者快速的实现想法,并可以看到效果,同时c++开源带来了全新的体验。

Ue技术支持几百种游戏,实时3D电影,训练仿真,可视化等。在过去的15年中,成千上万的个人和团体围绕者ue开发技术建立了公司,成为了一种职业。

二、 具体特性

(一)

UE4支持更高级的DX11的渲染特性,比如:全屏的HDR映像,每个场景上千种动态光照,artis-可编程镶嵌技术和disPlacement(位移)技术,基于物理特性的阴影和材质,IES光照轮廓等等。

(二)

颗粒特效·

颗粒特效编辑器VFX为我们提供了创建精细的火、烟、血、尘土、污垢、碎石等的工具。颗粒管线包括的了快速低成本GPU粒子仿真,可与深度缓冲交互的碰撞系统。场景中数百万的动态粒子可以接受和反射光线,你可以控制各种粒子效果参数,包括有大小,颜色,密度,下降散开和反弹。

 

(三)

新材质管道

UE4通过使用基于物理模型的shading,提供了前所未有的控制方式,你可以观察和感受角色和对象。快速创建一个宽阔场景面,它是经得起对细节的考验。在像素级别上,层材质和微调值,可以满足你的任何想象。

  

(四) 

蓝图

蓝图可视脚本带把你有创造力的想法,展示到可视化的游戏中。使用蓝图,任何人不需要写一行代码,可以快速原型和建立玩家内容。蓝图可以在创建级别、对象和玩家行为,修改用户界面,调整输入控制等操作中发挥作用。

 

(五) 

实时的蓝图调试debugging

在游戏测试的中,通过蓝图可视化脚本内置了一个debugger,你可以与可视化的游戏流程交互并检查属性值。通过在蓝图的可视节点上设置断点,来随意的暂停游戏,查看游戏的各种状态。逐步的通过事件和功能,随意的变化,优化你的游戏。

你之前有想象过,不通过代码来调试程序么?你想过你能在编辑工具的界面上设置断点和调试么?

 

(六) 

内容浏览

使用UE4内容浏览器,用来导入,组织,搜索,标记,过滤,修改在unreal编辑器中的游戏的对象。实时动态预览图使用截屏功能,可以被修改保存。创建任何的对象集合,都可以被个人或共享给其他开发者。

 

(七) 

角色动画

使用角色动画工具集,可以来编辑骨骼动画,骨骼网格,sockets,动画蓝图等。这个是多用途工具,你可以预览动画序列,变形目标体,也可以设置动画混合空间和蒙太奇剪切。当然,也可以使用PHAT(物理编辑工具集)用来修改骨骼网格的物理和碰撞属性。

 

(八) 

过场动画

UE4的过场动画工具集提供了在场景级别的直接的级别控制,动态玩家镜头和电影。通过一个类似的非线性编辑器,能够是你在场景中设置精细的动作细节和动画场景属性,产生很棒的电影片段。

 

 

(九) 

地形和枝叶

我们使用景观系统可以创建大型开放的环境,然而平铺地形的方法的命令条数是巨大的,多亏了强大的LOD系统和高效的内存使用。使用枝叶工具,快速绘制或删除所有排序的地形组件,从而达到修改大型室外场景的目的。


(十)

后处理效果

UE4的后处理特性可以使你完美的体验对于场景的观感。电影般的效果,举几个例子:环境立方贴图,环境遮挡,bloom,颜色分级,景深,眼适应,镜头耀斑,光轴,抗锯齿,色调映射等。

 

 (十一) 

完全源码接入

UE4带有全部的C++代码,你可以修改和扩展UE编辑工具和UE的子系统,包括物理系统,声音系统,在线系统,动画系统,渲染系统和slate 界面系统。全部控制引擎和角色代码,你可以干任何事情。

 

(十二) 

专业的源码控制

UE4委托GitHub来源码开源,这样由很清晰的版本控制文档和版本跟踪。另,Perforce的版本控制和ApacheSubversion支持,对开发者而言都是用户条款的。不管,你的团队规模,均享有在UE基础版本上开发和设计的权利。

 

(十三) 

C++代码可视

在游戏角色和对象,UE4代码允许直接浏览c++函数功能,直接跳转到在vs的源代码行来做更改,从而节约了时间。

 

(十四)  

热重载功能

使用UE很受欢迎的热重载特性,你可以在你游戏运行的过程中,更新你的角色代码。这个工具你开业用C++编写代码,并且可以不用暂停游戏来观看代码的运行效果。

 

  

(十五) 

模拟和仿真

使用模拟仿真模式,可以快速调试和更新角色行为,这样你在编辑视口中,可以运行一下程序的逻辑,观察角色的表现。在模拟仿真的编辑环境下,全屏化运行游戏,你可以忽略UI,全身心的关注角色的变化。

 

(十六) 

即时游戏预演

更新游戏和使用即时预演系统可以立即在游戏中任意地方产生一格玩家,并且不用等待文件保存。

 

(十七) 

获取和丢失特性

获取和丢失特性,允许你在编辑的游戏中,可以在任何时间来以玩家视角来编辑和控制相机以便观察那些行为不正确。

 

(十八) 

人工智能

UE4的角色框架和AI系统,可以使角色拥有世界周围的空间意识,从而使他们更智能的行为。当你的运行对象在总是在优化路径,动态导航实时的更新网格

 

(十九) 

音频

使用UE4的音频编辑可以建立音频管线,定义游戏的重复音效。

 

(二十) 

 领先的中间件集成

UE4的主要的配件程序提供了很多的引领工业级的中间件技术,包括英伟达的PhysX,Autodesk的Gameware,Enlighten,暗影,Oculus VR等软件库。

 

三、 

样例使用说明

虚幻4的样例展示了引擎使用高要求粒子效果的能力。在运行样例之前,你需要安装vs2013runtimes.

使用批处理文件可以进行设置,比如:分辨率x=1920,分辨率y=1080等。

 

-------------------------------------

posted @ 2017-09-12 10:45 00000000O 阅读(...) 评论(...) 编辑 收藏
2017-10-09 21:42:12 qq_16756235 阅读数 4883

最近用vs2017最新版的时候发现UE4.18和4.19preview会有一个问题,那就是在developmentEditor模式下调试,断点会飘。明明下了断点的地方直接跳过去了。于是去查了一下文档:

在Release模式下,代码会进行优化。所以很多调试符号都没有了。DevelopmentEditor其实还是Release模式。解决这个问题有两个办法,第一个就是手动关闭release模式的优化

加入#pragma optimize("",off)即可。但是你得去手动关闭每个你需要调试的cpp。这样比较麻烦。并且还有一些限制

还有一种方法就是直接切调试模式。但是在4.18和4.19preview模式下切调试模式的时候发现,DebugGameEditor直接编译不过去。原因是源码有bug,错误加载了一个文件。可以简单粗暴把下面一段代码注释掉:

注释掉后在build一下引擎就可以了。

如果不想用这么简单粗暴的办法,那就从根本上解决。因为引擎没有对DebugGame进行判断,那么我们就加一个

在Runtime/Source/Projects/Private/BuildiVersion.cpp中把FString FBuildVersion::GetFileNameForCurrentExecutable()这个函数改一下:

FString FBuildVersion::GetFileNameForCurrentExecutable()
{
	FString AppExecutableName = FPlatformProcess::ExecutableName();
#if PLATFORM_WINDOWS
	if(AppExecutableName.EndsWith(TEXT("-Cmd")))
	{
		AppExecutableName = AppExecutableName.Left(AppExecutableName.Len() - 4);
	}
#endif
#if IS_PROGRAM || IS_MONOLITHIC
	return FPaths::ProjectDir() / TEXT("Binaries") / FPlatformProcess::GetBinariesSubdirectory() / AppExecutableName + TEXT(".version");
#else
	FString Section = FPaths::EngineDir() / TEXT("Binaries") / FPlatformProcess::GetBinariesSubdirectory() / AppExecutableName;

	if (FApp::GetBuildConfiguration()==EBuildConfigurations::DebugGame)
	{
		Section += FString::Printf(TEXT("-%s-DebugGame"), FPlatformProcess::GetBinariesSubdirectory());
	}
	Section+= TEXT(".version");

	return Section;
#endif
}


Build一下。完美解决。


更新一下这篇文章:

2017年10月19日的时候,虚幻源码master版,官方已经亲自修复了这个问题了。



2015-08-03 11:50:16 pizi0475 阅读数 0

http://blog.sina.com.cn/s/blog_7c5fd2e90101law8.html


很多天没更新微博了,最近工作比较忙在支持一个UE3的项目,EasyKit架构也在无缝地图的方面设计更多解决方案(UnrealEngine4中自带一个seamless travel,主要涉及到广播和LevelStreaming)。昨天查资料发现好多人在问如何编译客户端。好吧,如果不了的确要花点时间研究如何编译客户端。


    如果同学们想用VisualStudio编译客户端来查看,打包成游戏后程序的运行机制需要按照以下几个步骤方可成功编译Client。(编辑器中跟代码会跟实际游戏客户端代码运行步骤不同,因为再编辑器预览游戏使用了很多EditorEngine的接口和很多PlayLevel这样的功能类。比如:如果同学们想了解一下实际游戏的入口在哪里,如何在初始化游戏的时候加入自己的模块,在编辑器的运行代码中是很难找到接入点的。)
  
    1.同学们必须要从GitHub下载UnrealEngine4的源码。(这句好像是废话,不过还是想说一下因为有很多同学一直认为用UE4创建一个带C++的工程那就叫源码版)  

    2.用UnrealEngine4源码先编译一个Editor随便哪个版本(我编译的是Developer Editor)。然后编辑我们自己想要调试的游戏。只想了解游戏运行时UE4引擎处理流程的同学可以用引擎工程创建向导的模板示例。

    3.编辑完毕后需要点击编辑器上方Play右边的Launch生成游戏程序文件。(必要条件,如果不进行Launch的话无法调试游戏)  附图:

Unreal4 <wbr>客户端编译.调试.与常见问题

    4.再用VisualStudio的工程编译Client便可调试游戏啦。这种解决方案只代表自己的观点,如果有同学有更好的方法欢迎交流,有错误欢迎指正,我会及时核对后进行修改Unreal4 <wbr>客户端编译.调试.与常见问题


遇到过的问题:
    UnrealEngine4编辑器的编译环境跟客户端的编译环境不太一致,有些头文件在未Launch游戏文件前是无法找到的。笔者昨天在做场景管理器的时候需要用到LevelStreaming.h这个头文件以便引用一个Action做异步加载。但是连接时总提示:无法找到外部符号。通常出现“我发找到外部符号”的问题都是只有声明没有定义,或者有些库文件不匹配。但是Launch后就可以找到了,所以在调试和对客户端编程时需要同学们先Launch下自己的游戏呦Unreal4 <wbr>客户端编译.调试.与常见问题

2019-08-24 23:18:43 zz394759066 阅读数 555

由于ue4的编译优化,在development Editor模式下想调试指定函数的话,会发现无法进入断点,此时可以在对应的函数中添加一句 GEngine->AddOnScreenDebugMessage,就可以进入