☰
尝试将Unity项目 接入Android
2026/9/27 4:12:53 网站建设 项目流程

尝试将Unity项目接入Android

  1. 将Unity项目导出

  2. 把UnityLibrary放到Android项目的APP目录的根目录中

  3. 导入项目:

  • 修改build.gradle.kts 导入Unity模块
implementation(project(":unityLibrary"))

接入方案

  1. 直接在MainActivity中使用Intent跳转到UnityPlayerActivity
val intent = Intent(context, SettingsActivity::class.java) context.startActivity(intent)
  1. 使用UnityPlayer展示Unity画面
  • 设置一个Fragment来存放Unity画面
  • 自定义一个Activity,在布局文件添加Fragment位置
  • 使用FragmentManager添加UnityFragment画面添加到Activity中

这样可以在Activity的画面中方便地添加自定义UI

注意
  1. 在打开Unity画面后,再退出,会出现回不到主页面的情况,如果 Unity 和主界面在同一进程,Unity 退出时杀进程,主界面也会一起被杀
  • 可以在 Manifest文件里面 把 显示Unity的自定义Activity 设置成单开进程
<activity android:name=".unity.MyUnityActivity" android:process=":unity" android:exported="false" />

这样在退出Unity后主程序的进程不会被杀死
2. 在导入UnityLibrary后安装APP,会发现有两个图标,其中一个点击会直接打开Unity的画面

解决方案:修改unityLibrary/src/main/AndroidManifest.xml

<activity android:name="com.unity3d.player.UnityPlayerActivity" android:theme="@style/UnityThemeSelector" android:screenOrientation="fullUser" android:launchMode="singleTask" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density" android:resizeableActivity="false" android:hardwareAccelerated="false" android:exported="true"> <!-- <intent-filter>--> <!-- <category android:name="android.intent.category.LAUNCHER" />--> <!-- <action android:name="android.intent.action.MAIN" />--> <!-- </intent-filter>--> <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> <meta-data android:name="notch_support" android:value="true" /> </activity>

注释掉Manifest注册的UnityPlayerActivity中intent-filter里面的内容<category android:name="android.intent.category.LAUNCHER" />会让Activity在桌面(Launcher)上单独显示一个应用图标

  1. 在使用UnityLibrary里面的UnityPlayer的时候,可能会发现怎么我导入了unityLibrary但是import com.unity3d.player.UnityPlayer还是会说找不到,明明unityLibrary/libs/unity-classes.jar这个jar包里面就有UnityPlayer。
  • 修改unityLibrary/build.gradle
dependencies { // implementation fileTree(dir: 'libs', include: ['*.jar']) api fileTree(dir: 'libs', include: ['*.jar']) }

替换implementation为apiimplementation 不会把 unity-classes.jar 暴露给依赖本模块的app导致app里import com.unity3d.player.UnityPlayer报Unresolved reference

  • 替换以后就能正常编译了,如果AndroidStudio还是爆红,可以file -> invalidate caches -> invalidate and restart 重置一下缓存就不会报错了

Android与Unity之间通信

Android -> Unity

通过

UnityPlayer.UnitySendMessage("GameObject的名字","方法名","String类型传参")

Android可以调用Unity里面的方法,注意第一个参数是GameObject的名字不是类名

Unity -> Android

Unity可以调用 来发消息给Android

  • 在Unity使用AndroidJavaClass通过包名、方法名、参数,其中参数数量要与方法参数数量对应
using(AndroidJavaClassbridge=newAndroidJavaClass("com.test.myapp.unity.bridge.MyUnityBridge")){bridge.CallStatic("onGameFinished","String类型的参数");}

Android这边设置一个单列来让Unity调用

objectMyUnityBridge{funsendToNative(data:String){//通过广播传递消息}@JvmStaticfunonGameFinished(result:String){println("Unity 通知:$result")sendToNative(result)}}

在接收到消息后可以通过广播发在Android内部交流,要注意如果Unity和Android的接收端是同一进程,主程序是另一个进程,可以使用广播、Intent来传递消息,或者将数据保存在MMKV。

思考

现在只是简单的添加了unityLibrary模块,后续可以尝试直接使用arr包

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询