Integrate ZSTD compression algorithm for UE4 using ModularFeature

UE在打包时默认使用Zlib作为资源的压缩算法,但是从压缩率和解压速度来看它并不是最好的选择,可以从Squash Compression Benchmark去看各种压缩算的效率对比,我选择了facebook开源的ZStandard作为替换Zlib的压缩实现,因为ZSTD在保证压缩比的同时还具有不错的解压效率。
本篇文章并不只是讲怎么在UE里集成一个压缩算法,还会简单介绍一下UE里的一些功能的模块化组织方式——ModularFeature,使用这种方式可以比较方便地替换某些功能的实现,本文中的替换压缩算法是一个实践。

我在UE中集成ZSTD的方式是写了一个插件,源码集成,开源在Github上:hxhb/ue-zstd,支持Android和Windows、IOS以及MacOS,欢迎Star。

阅读全文 »

UE hot update: Lua programming guide based on UnLua

UE使用的是C++这种编译型语言,在编译之后就成了二进制,只有通过玩家重新安装才能打到更新游戏的目的。但是对于游戏业务而言,对于需求调整和bug修复时间要求非常迫切,频繁地让玩家更新App是不能接受的,游戏项目一般使用Lua作为游戏业务的脚本语言,是为了把运行时不可变的C++代码变成运行时可更新的Lua代码。

UE官方没有提供Lua的支持,但是腾讯开源了UnLua,在我当前的项目使用了,这两天我梳理了一下UnLua的资料(主要是官方文档、issus、宣讲PPT),加上自己测试UnLua写了一个小Demo的感悟,形成了本篇UE结合UnLua的编程指南,主要是总结使用UnLua来写业务的一些基本方法和坑,方便查看,本篇文章会持续更新。

另外,Lua文件打包成Pak可以用我之前开源的工具:hxhb/HotPatcher,而且我基于UnLua自己修改了一个版本,添加了一些额外的优化,源码集成了Luasocket/Luapanda/lpeg/Sproto/Luacrypt库,可以直接使用LuaPanda调试,Github地址为:hxhb/debugable-unlua.

阅读全文 »

The Differences and Relationships between UEC++ and Standard C++

新冠病毒(COVID-19)影响,整个春节都禁足在家,目前还没有复工,只能看看书整理一下笔记,希望疫情尽快过去,希望朋友们都身体健康。
本篇文章的主要内容是分析一下在使用UE开发时使用的C++和**标准C++**在语法上有哪些区别,UEC++本质是C++的一个超集,它支持和使用C++的全部特性,但是它在标准特性之上自己构建了一套语法。很多开发中的编译问题只有知道了两者的边界,才能够快速和准确地定位问题出现在哪个阶段。对于使用UE之前就学习过C++的来说这不是什么问题,但是对于先接触UE然后慢慢学C++的同学来说,这是个挺大的问题。

标准C++**是基于ISO/IEC 14882**的语言规范(C++98/03/11/14/17等标准),UEC++则是我们开发当中使用的Epic在标准C++之上扩展的用法,这里不讨论GC、反射之类的基于C++之上自己构建的对象体系,也不涉及UE中的各种库,关注的着重点在于核心语法层面。

阅读全文 »

Modify the default data storage path for Android games

默认情况下,使用UE打包出游戏的Apk并在手机上安装之后,启动游戏会在/storage/emulated/0/UE4Game/下创建游戏的数据目录(也就是内部存储器的根目录下)。按照Google的规则,每个APP的数据文件最好都是放在自己的私有目录,所以我想要把UE打包出来的游戏的数据全放到/storage/emulated/0/Android/data/PACKAGE_NAME目录中(不管是log、ini、还是crash信息)。
一个看似简单的需求,有几种不同的方法,涉及到了UE4的路径管理/JNI/Android Manifest以及对UBT的代码的分析。

阅读全文 »

HotPatcher: A open source UE resource hot patching tool

重要通知:作者没有任何平台和渠道录制收费课程,也不对任何第三方的商业行为背书。请擦亮双眼,谨防上当受骗。
本软件的开源协议:允许在商业项目中免费使用功能,但不允许任何第三方基于该插件进行任何形式的二次收费,包括但不限于录制收费课程、对插件及代码的二次分发等。

HotPatcher是一个用于管理热更版本和资源打包工具,用于追踪工程版本的原始资源变动来打出Patch。支持一键Cook多平台,一键打包多平台Patch,编辑器支持Windows和MacOS,再写一套从服务器下载patch的流程就是一套完整的游戏热更方案。HotPatcher已经在非常多的UE项目中使用,并会持续更新支持新的引擎版本,欢迎提issus。

HotPatcher与UnrealFrontEnd中的Patch机制不同,UE的Patch管理工程时存在一些问题:基于原始的的工程版本,很难在不同的电脑上打出完全相同的Patch,也无法基于Patch的版本再打出一个Patch,并且Patch包含的内容不能够直观预览。并且不能方便地能够把外部文件打包到pak中(如lua文件、db等non-assets,往往不在Content目录下),也无法方便地管理工程和Patch版本。

这个插件就是为了解决这样的问题,以项目原始资源作为版本依据,只需管理工程本身而无需关注UE生成的其他文件。并且可以方便地进行Cook/生成Pak/提取基础包中的资源信息/版本间diff/Patch拆分等操作。具有非常丰富的配置化选项与Commandlet支持,可以非常方便地实现自动化热更新出包流程。

目前支持的引擎版本为UE4.21-UE5,并对IoStore机制提供了支持!有很多朋友私信来问插件相关的问题,我创建了个群来讨论UE热更新和HotPatcher插件的问题(QQ群958363331),欢迎加入交流UE相关的技术。

为了方便地统一收集和管理热更新和HotPatcher常见的问题与解决方案,我新建了一篇文章来记录和整理:UE4热更新:Questions & Answers,遇到问题可以先去看这个FAQ页面。关于比较多人反馈插件内配置参数与之前的录制视频不一致的问题,是因为插件进行了很多更新迭代,每个版本的详细变动,可看更新日志

阅读全文 »

Design specifications and code standards for UE projects

最近新开了项目,大概总结了之前项目的一些问题,列举了一些UE开发项目的设计规范和代码标准(代码标准这个词看起来太严肃了,写代码的习惯是一个比较主观的概念,其实叫代码约定更好,但是在组内推广还是要有严格执行的要求)。本篇文章会持续更新和整理,欢迎指出问题和交流意见。

阅读全文 »

最新版本已支持UE5,详见github的UE5.0分支:ue4-export-nav-data/tree/UE5.0

Recast Navigation是一个开源的游戏导航/寻路引擎,可以为游戏中的AI提供寻路计算。UE和Unity都是集成了RecastNavigation来为游戏提供导航和寻路计算(当然是修改过的版本),UE的模块NavigationSystem以及NavMesh中可以看到相关的代码实现。
最近有个需求是要将客户端的地图信息导出给非UE网络架构的服务端,用于在服务器上对玩家位置的校验,想到可以把客户端的生成的导航数据导出作为客户端世界的地图,所以折腾了一下写了一个UE的插件(开源在Github上:**ue4-export-nav-data)实现了直接**将UE生成的导航数据导出,有兴趣的可以直接去看具体的代码。
根据导出的导航数据可以完整地在非UE网络架构的服务端上实现基于Recast Navigation的寻路计算,而且与UE无缝衔接。

**2019.12.04 Update:**本插件已上架虚幻商城,购买链接ExportNavigation,为了程序员情怀支持开源,所以该项目在Github上的开源仓库不会关闭,但基本不会更新,如果该插件对你有用,欢迎在商城购买支持作者。

阅读全文 »

Oculus Quest是Oculus发布的新一代支持6DoF的VR一体机设备,不需要连接PC以及额外的定位基站,而且支持Guardian,当戴着头显走出定位边界时,头显中会立即显示现实中的画面,防止玩家误碰出现意外情况。
Oculus Quest使用两个Pentile OLED的屏幕,单眼分辨率为1440x1600,刷新率为72Hz,使用的是arm架构的高通骁龙835处理器,与两年前的Android旗舰级的处理器相同(如小米6、三星S8)。
Quest使用的是Oculus Insight(inside-out tracing)定位方案,使用四枚摄像头进行位置追踪,分别位于头显面板的四角。
发布会时对Oculus Insight的介绍:Oculus Insight VR Positional Tracking System (Sep 2018)

以及国外的一个老哥对Quest追踪范围的测试视频:Quest Distance Test.

Oculus Quest64G存储版本的售价为399刀,128G的为499刀,不计税的价格大概是3500;相比较HTC的同类新产品(HTC Vive Focus)是便宜了不少,与PC-Base VR相比那就更具优势了,还不需要一台高性能的主机,我觉得6DoF的VR一体机设备一定是未来的趋势!

国庆前的OC6,Oculus发布了Oculus Link和finger tracking两项技术,十分厉害,十分看好。

整套Quest设备的大小与10.5寸的iPad差不多,提个小包就能带走:

Quest设备的参数细节不再多说,本篇文章的主要内容是使用UE来开发Quest项目时的环境部署、开发文档、调试工具以及额外的注意事项,会持续更新。

阅读全文 »

Module是构成Unreal的基本元素,每一个Module封装和实现了一组功能,并且可以供其他的Module使用,整个Unreal Engine就是靠各个Module组合驱动的,连我们创建的游戏项目本身,都是一个单独的Module。

那么UE又是怎么创建和构建这这些Module的呢?这是写这篇文章的主要目的,研究一下Unreal的构建系统以及它们(Target和Module)支持的各种属性。

建议在看这篇文章之前先看一下我之前的这篇文章:Build flow of the Unreal Engine4 project,主要内容是大致过一遍UE的构建流程,本篇文章只是UE构建系统中的一环。

阅读全文 »