工欲善其事必先利其器,本文主要介绍在我在使用UE的过程中开发的一些开源的工具和插件,能够方便地在项目中使用,提高开发效率。之前简单罗列在资源页面里,今天做一个详细的整理,对各个工具、插件做一些介绍。

阅读全文 »

学习如逆水行舟,不进则退。这一点在CS领域尤甚,新技术、新框架日新月异地发展,业务层面的技术迭代非常快,可能刚熟悉了一项技术,很快就又被淘汰了。所以只有不停地接触、了解和学习新的知识和技能才能不断地拓展自己的程序生涯。
本篇文章是我写博客几年的对平时技术积累进行的一些思考,本来当作notes改版的记录,现在觉得抽离出来当作单独的文章也比较合适,我很少写感悟类的东西,觉得方法论太虚,但是如果具有理论指导行动的自制力,方法论也是很有必要的,希望自己也能做到。

阅读全文 »

WWise是Audiokinetic的跨平台音频引擎,可以与游戏引擎很好地进行交互,负责音频的同事可以只在WWise中处理音频,把游戏业务和音频的制作与管理分离,提供事件和参数给游戏引擎使用,实现与业务的解耦和对音频更精确的控制。
本篇文章主要介绍WWise与UE4的集成、远程构建、资源分析、文档收录,WWise与UE的控制交互以及Bank生成的代码分析。

阅读全文 »

在开发游戏时,会使用到大量的图片资源,使用图集的作用在于减少 DrawCall,提高性能。在UE中没有图集的打包工具,比较流行的方案是使用第三方的图集打包工具TexturePacker。新版本的TexturePacker支持直接导出UE4的Sprite,并且可以在引擎中直接导入。在之前的版本中可以使用VaTexAtlas通过Json Array的数据导入,不过与TexturePacker直接导出UE的Sprite相比,VaTexAtlas并没有优势,UE的Sprite还可以直接预览,VaTexAtlas则不可以,在官方已经支持的情况下不建议再使用VaTexAtlas作为UE导入图集的方式。

本篇文章主要内容是记录TexturePacker图集生成文件的分析、导入UE、选项介绍、以及记录在UE中使用遇到的问题。

阅读全文 »

本篇文章的主要内容是介绍UE在Mac上的开发环境部署、配置iOS远程出包、UPL在iOS上的应用(介入ipa出包过程)、工具和开发技巧、以及分析相关的引擎代码等内容,记录了一些在项目中遇到的坑,主要从我之前的笔记中整理而来,后续Mac和iOS相关的内容也都会更新到这篇文章里。

阅读全文 »

游戏热更新是在玩家不重新安装游戏的前提下获取最新游戏内容的方式,在PC和移动端的网络游戏中有很多应用,因为游戏上上线后要快速调整、修复bug、更新内容等等。如果每修改一点点内容都需要玩家去AppStore更新应用,甚至去网站手动下载再安装,而且不同的平台对于游戏的审核规则和反馈时间也不一致,运营也会疯掉。

在其他引擎中的热更应该有比较成熟的方案,但是在UE里还没看到有比较全面的文章来讲UE4的热更实现的文章,恰好之前分析和实现了UE4热更的内容,准备写两篇文章来记录一下思路和实现方案,并会实现一个可以运行的Demo,希望能对有需要的朋友一点帮助。

阅读全文 »

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

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

阅读全文 »

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.

阅读全文 »

新冠病毒(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中的各种库,关注的着重点在于核心语法层面。

阅读全文 »

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

阅读全文 »