在之前的几篇文章中,分别介绍了UE热更新的实现机制,以及热更的自动化流程,近期打算继续写几篇文章介绍下UE里热更新中资源包管理的流程和规则。

当然,不同类型的项目会有不同的打包策略,资源管理也没有通用的最佳策略。本篇文章主要介绍热更新流程中基础包的拆分的工程实践,涉及修改引擎实现Android/IOS通用拆分方式的方法,希望对不同业务的项目能提供一些有用的思路。

阅读全文 »

HotPatcher是我之前开源的一个UE4热更新版本管理和资源打包工具,可以方便地进行版本间的差异分析和pak打包。之前的文章为了直观地介绍都是基于手动地在编辑器中进行配置和打包的,在真正的工程实践中,可以自动化的重复操作就要避免手动的参与,较早之前我就在插件中添加了commandlet的支持,近期修复了一些问题以及增加了很多针对commandlet的优化,本篇文章是基于HotPatcher的自动化热更新流程的工程实践。

阅读全文 »

开源,不仅仅只是需要把代码开放那么简单,而是怎么样用自己的代码去解决实际的需求、进行不断地迭代更新、以及构建开源项目的交流社区。根据过去一两年的开源经历,聊一聊我从开发者角度思考开源的观点以及对开源行为的一点想法。

阅读全文 »

在前一篇文章中,介绍了UE的反射的基础概念,这篇文章开始研究UE的反射机制的具体实现。

在介绍UE的代码之前,需要先要介绍一些C++特性,虽然UE的反射实现是大量依赖UHT的代码生成的,但是也需要C++的语法特性支持,只有把这些特性还有它们背后的含义了解清楚,才能够更好地理解UE的反射机制。

本篇文章中介绍的C++的特性和标准描述均基于ISO/IEC 14882:2014,也就是C++14标准。

阅读全文 »

反射,是指程序在运行时进行自检的的能力,在编辑器的属性面板、序列化、GC等方面非常有用。但是C++语言本身不支持反射特性,UE在C++的语法基础上通过UHT实现了反射信息的生成,从而实现了运行时的反射的目的。

在之前的文章中,有一些涉及到UE的构建系统和反射相关的内容。

涉及了UE的构建系统文章:

基于UE的反射机制来做一些奇淫巧技的文章:

UE的反射实现是依赖于构建系统中UHT来执行代码生成的,本篇文章对UE的反射做一个基础概念介绍,后续会花几篇文章完整地介绍UE里反射的实现机制。

阅读全文 »

2020年的Unreal Open Day是在线上直播和技术分会场的形式进行的,很开心参加了今年的UOD活动,我录制了一场UOD的技术视频,也去上海直播现场参加了UOD的颁奖活动,很荣幸也很感谢Epic授予我杰出社区贡献者奖项,对我既是认可也是激励,我也会尽力产出更多的技术内容,促进UE社区的发展。

本篇文章做一个简单的记录,把UOD的资料做一下整理,也把我参加UOD的视频、演讲PPT,以及相关的资料做一个总结,还有一些在UOD直播现场拍的照片。

阅读全文 »

在使用UE4开发Android时,有时需要获取平台相关的信息、或者执行平台相关的操作,在这种情况下,需要在代码中添加Java的代码以及在C++中调用它们。有些需求也需要在游戏中从Java侧接收一些事件,需要处理Java调用C++的流程。

本篇文章主要涉及以下几部分内容:

  • UE工程中添加Java代码
  • Java函数的签名规则
  • Java调用C++的函数
  • C++调用Java的函数

如何利用UE的UPL特性、Java的签名规则,以及在UE中进行JNI调用实现方法,会在文章中做详细的介绍。

阅读全文 »

Hook是一种机制,通过拦截和勾取一些事件来实现自己需求的方式。不同于传统的底层Hook,本篇文章主要介绍在UE中如何使用类似Hook的这种机制来实现业务需求。

有些需求是要全局地修改某个类的所有对象,比如在UI中为某种类型的的Button播放统一的音效,如果在每个控件都需要监听它的OnClicked再去播放音效,会有大量的重复操作。所以,我想要找一种全局的方法,可以监听所有UButton的点击事件,然后统一来处理。再或者想要控制一个在蓝图中不可见的属性,如果只是一些简单的需求就要去修改引擎的代码,有点得不偿失。

可以通过UE的反射机制来实现这些需求,本篇文章来提供一种思路,做一个简单的实现分析。

阅读全文 »

通常,UE4开发者获取UE4引擎的方式有两种:

  1. 从Epic Games Launcher安装
  2. 从Github上Clone代码本地编译

从EpicGamesLauncher安装的是公版引擎,不能修改代码重新编译,可以在根据选择安装支持的平台、调试符号等。
自己从Github上Clone代码进行编译的则是源码版引擎,有些功能只能在源码版中使用(比如Standalone Application),但是如果在项目中修改了引擎的代码,导致每个人都需要Clone一遍源码编译一遍引擎,这个过程十分耗时,而且源码版引擎的占用的磁盘空间十分巨大,达到上百G。在当需要把引擎部署到多台构建机时,编译引擎的时间和空间是冗余的,所以需要通过一台机器编译引擎,然后其他的机器只需要拉取编译后的引擎即可,实现与安装版引擎一样的行为。

本篇文章主要介绍BuildGraph的工作流程,以及对引擎默认构建脚本InstalledEngineBuild.xml的分析;如何使用BuildGraph从源码配置、编译并导出支持Android/IOS打包的二进制引擎、以及如何裁剪和加速整个的构建流程。

阅读全文 »