融合主要解决问题

  • 将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);
      

解决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文件目录,文件名不对,或者文件大小不匹配导致不能正确加载
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐