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/folder1Assets/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是可以直接打开运行的。
当然了,还有一种情况,是你不想直接打开它的工程,想要手动迁移,那怎么做?

  1. unityLibrary 拷贝到你的工程下
  2. 把导出的gradle.properties的一些参数拷贝到你的工程的gradle.properties,尤其是unityStreamingAssets=.unity3d
  3. 把settings.gradle加上新的模块:即:加这一行:include ‘:app’,'unityLibrary'
  4. 把需要依赖Unity的模块,加上对unityLibrary的依赖:implementation project(path: ':unityLibrary')
  5. 把launcer模块下的res/values资源拷贝到你的app模块下,或者到unityLibrarys下,否则运行起来可能出现Resources#NoFoundException
  6. 手动迁移的话,默认activity就不是Unity了,你可以在你的默认activity(一般是app模块下),添加跳转逻辑,启动后,跳转到UnityPlayerActivity。
  7. 最后编译,就可以运行了。

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)的主要内容,如果未能解决你的问题,请参考以下文章

用Android Studio导出jar给Unity3D用

GJM : Unity3D HIAR - 快速入门 导出 iOS 工程

用Ant给Unity3D导出Eclipse工程打包APK

将 Unity3D 项目导出并运行到 Android Studio

unity3d IL2CPP for android

如何给unity3d工程加入依赖的android工程