Unity3D导出Android工程(Android中应用Unity3D)
Posted 言并肃
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity3D导出Android工程(Android中应用Unity3D)相关的知识,希望对你有一定的参考价值。
Unity下载
Unity个人版是免费的,可以去官网下载Unity Hub再下载Unity个人版。个人版功能足以满足个人学习Unity需求,如果有商业用途最好下载专业版。需要先下载Unity Hub,以便后续下载Unity开发android相关开发组件。
官方下载地址
Unity工程
通过Unity Hub新建一个空的3D工程
导入3D模型:
选择Project面板中的Assert->右键Import New Asset->选择要导入的模型文件(fbx、obj、3ds等格式皆可)。导入成功后即可将3D模型拖拽到场景中。
场景Scene操作模型
通过Tools工具栏来操作模型,快捷键对应QWERTY(游戏玩家应该很熟悉),调节到合适的位置即可,将模型拖到Camera的视角内,点击Camera可预览效果。
Unity去掉天空盒
Window->Rendering->lighting->在属性面板中选择Environment,修改Skybox Material
为None
。
Unity导出Android工程
首次导出Android工程会提示下载相关组件,按提示下载安装。安装成功后显示下面界面:
Unity导出Android工程需要用到Android SDK、NDK、JDK等一系列Android开发组件,可通过Unity Hub下载安装Unity版本配套的Android组件。
在Unity偏好设置Preferences
面板中,选择External Tools
可配置Android SDK、NDK、JDK的路径,最好勾选推荐的从Unity Hub下载路径以免版本不匹配导致一系列问题。
专业版可以在Build Settings->Player Settings->Player->Other Settings下的Target Architectures
选择的cpu架构,个人版只支持ARMv7(armabi-v7a)架构,导出的3D工程也只能在该架构上运行,个人版也满足正常在android设备中运行调试。
在Build Settings
中,首次导出需要切换平台Switch Platform
,切换成功后勾选Export Projec
再点击Export
即可导出Android工程。
**注意:**勾选了Development Build
,会导致Android运行的3D画面右下角出现Development Build字样。
AndroidStudio中导入Unity工程
导入前,需要把androidstudio的jdk版本修改为unity对应的版本否则报错。
以import module的方式导入Unity生成的Android工程,其中有两个module,launcher
为可运行的应用模块,unityLibrary
包含Unity相关的库。
可以在launcher
模块中开发UI界面,但如果已有应用app模块也可以参考launcher
模块配置来unityLibrary
来进行3D相关开发。
参考launcher
模块进行ndk
引用:
ndk
abiFilters 'armeabi-v7a'
同时需要依赖unityLibrary
:
implementation project(':unityLibrary')
launcher模块
需要注意依赖到一个字符串game_view_content_description
,拷贝到app模块中:
<string name="game_view_content_description">Game view</string>
如果Android打包 不想把Assets/StreamingAssets/folder1
和Assets/StreamingAssets/folder2
等打进apk里,可以在gradle中加入下面配置:
android
...
androidResources
ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~'
noCompress '.unity3d', '.ress', '.resource', '.obb', '.bundle', '.unityexp'
主Activity继承UnityPlayerActivity
,由于UnityPlayerActivity
实现了Unity的三方库的IUnityPlayerLifecycleEvents
接口,主app没依赖此库,因此无法直接继承。
public class UnityPlayerActivity extends Activity implements IUnityPlayerLifecycleEvents
于是需要去掉实现IUnityPlayerLifecycleEvents
,同时改为内部实现IUnityPlayerLifecycleEvents
接口
private IUnityPlayerLifecycleEvents lifecycleEvents = new IUnityPlayerLifecycleEvents()
@Override
public void onUnityPlayerUnloaded()
UnityPlayerActivity.this.onUnityPlayerUnloaded();
@Override
public void onUnityPlayerQuitted()
UnityPlayerActivity.this.onUnityPlayerQuitted();
;
//改为内部实现类
mUnityPlayer = new UnityPlayer(this, lifecycleEvents);
同时UnityPlayer
类也是无法直接调用,需要在unityLibrary
模块中增加方法调用。
protected void addCustomView(View view)
if(mUnityPlayer != null)
mUnityPlayer.addView(view);
protected void init()
增加sendUnityMessage
来调用Unity方法:
protected void sendUnityMessage(String s1, String s2, String s3)
UnityPlayer.UnitySendMessage(s1, s2, s3);
这样主Activity就可以继承,如需添加自定义布局可重写init方法,再调用addCustomView
方法添加。
public class MainActivity extends UnityPlayerActivity
@Override
protected void init()
View view = LayoutInflater.from(this).inflate(R.layout.layout_buttons, null, false);
addCustomView(view);
unityLibrary
模块需要在AndroidManifest.xml
去掉activity声明,主Activity中需要添加一下声明:
<activity
android:name=".MainActivity"
android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density"
android:hardwareAccelerated="false"
android:launchMode="singleTask"
android:resizeableActivity="false"
android:screenOrientation="fullSensor"
android:exported="true"
android:theme="@style/UnityThemeSelector.Translucent">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data
android:name="unityplayer.UnityActivity"
android:value="true" />
<meta-data
android:name="android.notch_support"
android:value="true" />
</activity>
最后运行来看下效果:
Unity导出Android工程
前言
一个Unity游戏,要打包成android apk,有两种方式,一种是直接在Unity上编译出apk;一种是Unity导出android 代码,然后放到AndroidStudio工程编译。第一种很简单,本文不做展开,来聊一下第二种。本文基于Unity 2020.3.13f1c1
版本来说明,不同的版本可能使用上稍微有点差异。
1 导出
首先,需要让工程支持arm v7和arm v8两种架构,否则在某些机型上,会运行失败。
做法如下:File -> Build Settings,打开面板后,左下角的Player Settings点击,出来后,在Configuration栏,做如下修改:
勾选好了, 关闭窗口。回到Build Settings界面。
选中Export Project
, 然后点击右下角的Export
。出来弹窗后,选择一个导出目录,就会开始导出。最后生成的是一个可以用AndroidStudio打开的工程,如下:
2 AndroidStudio打开
导出的工程,AndroidStudio是可以直接打开运行的。
当然了,还有一种情况,是你不想直接打开它的工程,想要手动迁移,那怎么做?
- 把
unityLibrary
拷贝到你的工程下 - 把导出的gradle.properties的一些参数拷贝到你的工程的gradle.properties,尤其是
unityStreamingAssets=.unity3d
- 把settings.gradle加上新的模块:即:加这一行:include ‘:app’,
'unityLibrary'
- 把需要依赖Unity的模块,加上对unityLibrary的依赖:
implementation project(path: ':unityLibrary')
- 把launcer模块下的res/values资源拷贝到你的app模块下,或者到unityLibrarys下,否则运行起来可能出现Resources#NoFoundException
- 手动迁移的话,默认activity就不是Unity了,你可以在你的默认activity(一般是app模块下),添加跳转逻辑,启动后,跳转到UnityPlayerActivity。
- 最后编译,就可以运行了。
3 可能出现的错误
3.1 编译时遇到Task :unityLibrary:BuildIl2CppTask FAILED run-detectors: unable to find an interpreter for ../il2cpp.exe
原因: 如果用linux版本的AndroidStudio打开,就会遇到上面的错误,原因是这个il2cpp是exe格式的,只能在windows运行,好吧,有点无奈,还不支持linux版本的AS工程。
3.2 armv7 和 armv8无法同时勾选
这个发生在第一步。
原因:
一种是你在前面第一步,没有选择IL2CPP。这个好解决。
还有一种,是你的Unity可能是先选择了PC,Mac…平台,然后手动修改了Android平台。切换后,虽然会帮你下载Android相关的SDK,但是不一定全。
所以你要做的,是下载全的Android SDK。
如下,Unity Hub,点击3个点,【添加模块】
勾选,然后点击完成。就可以安装Android依赖库了。
当然了,还有一种极端情况,就是打开后,这里显示已经下载好了。怎么办?????别害怕,那你就重新安装一个Unity版本,在安装之初,就把这个Android的编译依赖给弄好,再打开你的Unity工程,理论上应该就可以了!
3.3 勾选armv7和armv8,点击export,出现unity library missing for the selected architecture错误
原因: 和3.2一样,是Android SDK不全。解决办法和3.2一样。
以上是关于Unity3D导出Android工程(Android中应用Unity3D)的主要内容,如果未能解决你的问题,请参考以下文章
GJM : Unity3D HIAR - 快速入门 导出 iOS 工程