前言:
Unreal Engine 平台,也叫虚幻4,是一个所见即所得的游戏开发平台,支持PC,移动端。以深邃的特效著称,正版PUBG的手游,也是采用UE4平台进行制作。
官网: https://www.unrealengine.com/
开发环境介绍:
UE4平台采用C++代码进行编写,每一个UE4的功能,实际上都是一个插件,iTOP对UE4的支持,也是采用插件的形式。本文采取的UE4平台为最新的UE4.18.1。
Win平台 : 安装Visual Studio pro 2015版本。
MAC平台:安装xcode最新版。
正文:
UE4工程目录介绍:
Binaries - 包含了编译过程中产生的所有可执行文件或其他文件。
Build -包含了编译引擎或游戏所需的文件,包括创建针对特定平台的版本所需的文件。
Config -包含了用于设置控制引擎行为的值的配置文件。 在游戏项目的Confige目录文件中设置的值将覆盖在Engine\Config目录设置的值。
Content - 存放引擎或游戏的内容,包括资源包及地图。
Intermediate - 包含了在编译引擎或游戏时生成的临时文件。例如编译android.apk,会在该目录下生产完整的工程。
Saved - 包含了自动保存内容,配置 (
*.ini
)文件以及日志文件。Source - 存放了引擎或游戏的所有源文件,包括引擎源码、工具、游戏性类等。
先从hello world开始:
首先,启动UE4,新建一个空的C++工程,你看到的第一个界面,是一个关卡
要在关卡里展示你所需要的元素,你需要构建一个蓝图,这里以一个按钮为例
会新建出一个控件蓝图,控件蓝图可以加载各类按钮
控件蓝图编辑完毕,保存为Widget,然后回到主界面,通过蓝图-打开关卡蓝图,将刚才做的按钮蓝图添加到主界面关卡
这里的交互每一个框体其实就是一个C++方法,通过连线的形式进行调用,这段链接做的事情就是在关卡BeginPlay(初始化的时候),加载我们做好的Widget进行显示。
然后保存,运行,效果如下:
OK,按钮添加上来了,如何给按钮添加点击事件呢,这里就要开始用到编辑器了,
文件-新建C++类,找到widget属性的c++类,然后命名并创建。
此时会自动调起VS或者XCODE,你的类名就创建好了。
创建好的.h头文件会含有UE4的特定宏定义,代表该头文件是蓝图专用,具体语法可看官网。
实现逻辑,打印hello world。
然后回到UE4,主界面点编译,编译通过后打开之前创建好的蓝图iTOPWidget。
切换到图表-类设置-设置父类,选择刚才写的c++代码为父类。
然后点击按钮的onclicked事件的+号,就可以给其添加逻辑了。
切换回主界面,先编译,打开日志,点击窗口-开发者工具-输出日志,然后点击按钮。
就可以看到响应事件了,这是通过蓝图调用C++代码的整个流程。
Android打包配置:
首先你要安装好ndk,sdk,gradle(4.18开始支持)等安卓环境,ue4有个一键工具给你,
点击可以一键安装
安装完成后在UE4-主界面-项目设置-Android,添加对应的环境,配置对应的SDK版本和包名。
这里注意,第一个勾选后为gradle替代ant打包,需要4.18以上版本,第二个选项是直接生产APK文件,否则会生成APK+OBB。
然后在打包标签页,选择编译模式,注意如果配了key,一定要勾选for Distribution
然后是地图&模式标签页,配置你的关卡为主界面,不然打包到手机上看到的是一片黑
然后通过文件-打包项目-Android,选择对应的CPU型号,进行编译
就可以在手机上看到刚才的蓝图打印hello world了。
APL文件详解:
APL文件创建UE4项目时并不会生成,需要自己手动创建
APL文件的作用:配置manifest,gradle,ProGuard,复制jar,so,都是通过该文件配置
坑的地方:写错了不会有任何提示,只有在编译时才会报错,必须遵循xml语法,最好先在studio里测试好了在复制过来,否则调试会花费大量时间。
验证方法:APL编写的GameActivity相关的代码,会映射到Intermediate目录下的GameActivity里,打开Intermediate-Android-Apk,可以看到生成了一个完整的工程,可查看并对配置项进行验证。
编写规则参考:
写完APL文件,需要在Build.cs文件里以插件的形式引入,表示如果是android平台编译初期会加载该APL文件进行工程的生成。
UE4 JNI:
坑的地方:UE4的so调用了jni_onload,将JavaVM作为全局变量暴露出来了,然后将FAndroidApplication 初始化,切换到子线程,此时通过传统的JNIEnv-findclass就无法查找到class的实体了,需要通过FAndroidApplication的FindJavaClass,调用GameActivity(主线程)的classloader,才能获取到。
正常的JNI调用方法:
UE4里的JNI调用方法:
其他的基本一致,这里坑了我很久,大家一定要注意。