UE4 接入Android指南

前言:

       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调用方法:

其他的基本一致,这里坑了我很久,大家一定要注意。


猜你喜欢

转载自blog.csdn.net/hsb3232364/article/details/80567769