UE4和android项目融合
ue4 android 融合
·
融合主要解决问题
- 将UE4内容整合到Android xml界面中
- 解决UE4内容过大的问题
- 如何与UE4进行交互
- 便捷的更新UE4内容
将UE4内容整合到Android xml界面中
- 从UE4打包android项目
设置平台-Android/Android SDK
Intermediate\Android\arm64\gradle目录是android的加载目录
尝试运行导出项目,修改可能的问题 - 将UE4内容拷贝到android项目中
包括全部的代码,jni和lib中的so库(6个),两个.mk文件, 所有的res和assets资源
注意如果在Apk Packaging中勾选了Package game data inside .apk?,则资源在assets/main.obb.png中,否则需要手动添加obb文件 - 添加obb文件
参考**/Android_ASTC/Install_**-arm64.bat文件,因为android项目和导出项目可能名称不一样,这里依据规则SD/obb/${name}/main.${versioncode}.${name}.obb,更改obb文件名并导入到手机sd卡中 - 修改GameActivity中关于minSDK的问题,将GoogleApiClient相关内容去掉减少不必要的依赖,将UE4项目的原始manifest合并过来,为GameActivity增加入口,尝试运行
- 将GameActivity融入到老的Activity中
- Activity继承问题(两个页面的内容都很复杂)
GameActivity继承自NativeActivity,而老页面继承自AppCompatActivity;我通过手动修改继承关系的方式解决了该问题,即手动创建从老页面到Activity的继承关系,为老页面到NativeActivity的关系,例如
一路继承过去。public class XComponentActivity extends NativeActivity
- xml中增加FrameLayout,id为mView作为游戏场景的加载容器
- 界面融入
将GameActivity的内容拷贝进来,修改SurfaceView的内容如下//containerFrameLayout = new FrameLayout(_activity); containerFrameLayout = findViewById(R.id.mView); // 游戏场景容器 containerFrameLayout.addView(MySurfaceView); containerFrameLayout.addView(virtualKeyboardLayout); //setContentView(containerFrameLayout);
- Activity继承问题(两个页面的内容都很复杂)
解决UE4内容过大的问题
在打包成android项目时,资源会合并为android的obb文件,内部其实是ue4的pak文件。
超过2G的文件,android会打包失败,只能采用外置的方法。(Package game data inside .apk? 取消勾选)
手动打包时,**/Android_ASTC/ 目录会生成obb文件,可以通过上面讲的办法把obb文件导入到sd卡中,确保obb文件在Activity中能够正确加载,可能需要修改OBBData中的XAPKFile.length参数。
如果有FAndroidPlatformFile::MountOBB相关问题,需要增加sd权限。
如何与UE4进行交互(以跳转场景为例)
- 在UE4中新建c++ Actor
- 为c++的 cpp文件添加如下内容
#include "Kismet/GameplayStatics.h"
#if PLATFORM_ANDROID
#include "Runtime/Launch/Public/Android/AndroidJNI.h"
#include "Runtime/ApplicationCore/Public/Android/AndroidApplication.h"
#include "Android/AndroidJavaEnv.h"
#endif//PLATFORM_ANDROID
#if PLATFORM_ANDROID
JNI_METHOD void Java_com_epicgames_ue4_GameActivity_nativeNextLevel(JNIEnv* jenv, jobject thiz, jstring msg)
{
FString message;
message = FJavaHelper::FStringFromParam(jenv, msg);
FString name = UGameplayStatics::GetCurrentLevelName(GWorld);
UE_LOG(LogTemp, Log, TEXT("onTick=[%s]"), *name);
if (name == TEXT("Demonstration")) {
UGameplayStatics::OpenLevel(GWorld, FName("Maps_BigCompany"));
}
else if (name == TEXT("Maps_BigCompany")) {
UGameplayStatics::OpenLevel(GWorld, FName("Summer_scene_mobile"));
}
else {
UGameplayStatics::OpenLevel(GWorld, FName("Demonstration"));
}
}
#endif
- 将Actor放入场景中
- 在GameActivity中增加如下声明,即可使用UE4跳转场景的功能
public native void nativeNextLevel(String msg);
便捷的更新UE4内容
- 一般情况下只需要注意
- manifest中的meta-data变化,也可以直接在Activity中覆盖,比如bHasOBBFiles,bPackageDataInsideApk
- 更新libUE4.so
- 更新assets文件:UE4CommandLine.txt(不知道有没有用),main.obb.png | sd卡中的obb
- 使用外部obb时,需要更新OBBData中的XAPKFile.length参数
其他常见错误
- Activity屏幕旋转
修改activity screenOrientation=“portrait” - Failed to open descriptor file ***.uproject
内置obb文件无法打开,增加obb.png文件,或者将bPackageDataInsideApk设置为1 - DownloadActivity 没有声明导致崩溃
sd卡obb文件目录,文件名不对,或者文件大小不匹配导致不能正确加载
更多推荐
已为社区贡献2条内容
所有评论(0)