Android Studio与Unity联动:安卓开发新视角

Unity + Android混合开发(一)

Unity官方其实已经给了具体的例子,但是在新版的AS以及Gradle7+下使用总会出现各种bug,这里针对流程做一个简单的记录,前文就不赘述了,直接上主要内容吧。

Unity打包工程

Buld Settings下切换到安卓平台,点击Player Settings,进入player->Other settings这里是一些打包安卓工程的常规设置,Graphics APIs中删除Vulkan,在安卓平台上使用不上的图形API

Android studio 打开unity项目 android unity开发_ide

identification中勾选override default,输入package name,这个影响的是程序安装好后的静态目录名称;比较重要的是设置Minimum API,这个地方会影响到打包出的工程中的gradle.build文件中的minsdk版本,后续将安卓工程打包时需要保持一致。

Android studio 打开unity项目 android unity开发_ide_02

Configuration中使用IL2CPP,下面的Target Architectures中勾选设备的架构版本,ARMv7是32位的ARM64是64位的,最省事的是同时勾选:

Android studio 打开unity项目 android unity开发_android_03

然后返回Build Settings,勾选Export Project后导出。

Android studio 打开unity项目 android unity开发_ide_04

导出完成后的文件结构如下:

Android studio 打开unity项目 android unity开发_xml_05

这个工程其实已经可以直接用Android Studio打开并导出了,但是我们的目标是要将其集成到现有的安卓工程中,需要再往下进一步。

安卓加载Module

这个工程文件中Unity相关的内容是其实是以Module的形式集成在项目中的,即UnityLibrary这个文件夹,因此在现有的安卓工程中可以通过模组的形式引入:

Android studio 打开unity项目 android unity开发_xml_06

选择unityLibrary文件后finish这个时候会报错,先别慌,看看报错内容:

Android studio 打开unity项目 android unity开发_xml_07

说的是找不到unityStreamingAssets这个变量,根据官方说明,添加一个变量到gradle.properties中:

Android studio 打开unity项目 android unity开发_xml_08

Try Again,可以看到不报错了,unityLibrary模块也被添加进安卓工程中,但是此时是无法正确调用的,原因是Unity相关依赖未添加,老版本的gradle可以直接在工程的gradle.build的repositories中添加flatDir{...}

登录后复制

allprojects {
    buildscript {
        repositories {
            google()
            jcenter()
        }

        dependencies {
            classpath 'com.android.tools.build:gradle:4.0.1'
            
        }
    }

    repositories {
        google()
        jcenter()
        flatDir {
            dirs "${project(':unityLibrary').projectDir}/libs"
        }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

新版本的需要在settings.gradle中添加至dependencyResolutionManagement中

登录后复制

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        flatDir {
            dirs "${project(':unityLibrary').projectDir}/libs"
        }
    }
}

这里用到了unityLibrary变量的projectDir属性,因此需要先定义这个属性,将尾部的include ':unityLibrary'提到代码块前,添加下面这句代码:

登录后复制

project(':unityLibrary').projectDir=new File('.\\unityLibrary')

最终settings.gradle文件如下所示:

Android studio 打开unity项目 android unity开发_ide_09

然后打开app下的build.gradle文件,在defaultConfig下添加下面这句代码,如果你是用的32位的安卓设备需要添加'armeabi-v7',这个影响到最终生成的依赖库文件夹名称

登录后复制

ndk {
    abiFilters 'arm64-v8a'
}

然后在dependencies中添加对库的引用:

登录后复制

dependencies{
    implementation project(':unityLibrary')
    implementation fileTree(dir: project(':unityLibrary').getProjectDir().toString() + ('\\libs'), include: ['*.jar'])
    }
    

点击立即同步,此时尝试在主activity下进行页面跳转,打开src/main/java/com.xxxxx.xxxx 文件夹新建一个MainUnityActivity类,类继承自UnityPlayerActivity:

登录后复制

package com.example.myapplication;

import com.unity3d.player.UnityPlayerActivity;

public class MainUnityActivity extends UnityPlayerActivity{
}

然后在res/layout/activity_main.xml中添加一个button用于跳转:

Android studio 打开unity项目 android unity开发_ide_10

最后修改MainActivity:

登录后复制

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button = findViewById(R.id.button);
        button.setOnClickListener(this);
    }

    @Override
    public void onClick(View view)
    {
        switch (view.getId()){
            case R.id.button:
                Intent intent = new Intent(this, MainUnityActivity.class);
                startActivity(intent);
                break;
            default:
                break;
        }
    }
}

然后在AndroidMainfest.xml中需要注册这个activity,添加下面这部分代码:

登录后复制

<activity
            android:label="@string/app_name"
            android:name=".MainUnityActivity"
            android:screenOrientation="fullSensor"
            android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density"
            android:hardwareAccelerated="false"
            android:process=":Unity">
        </activity>
        

这一段操作的目的是在主界面下添加一个跳转到Unity界面的按钮,代码很简单就不解释了,点击运行,发现报错:

Android studio 打开unity项目 android unity开发_android_11

第一个问题是app和minSDK不同,unityLibrary的minSDK不同,这里如果在前文中设置成相同的安卓版本号的话是不会出现这个问题的,有的话改成一致就行了;第二个问题是ndk没有安装,打开File->Project Structrure->SDK Location:

Android studio 打开unity项目 android unity开发_xml_12

看到NDK Location是空的,配置一下就行;我这里没法在这个界面点击配置,因此从文件中去配置,打开local.properties添加下面这行:

登录后复制

ndk.dir=C\:/Program Files/Unity/Hub/Editor/2020.3.32f1c1/Editor/Data/PlaybackEngines/AndroidPlayer/NDK

再次运行,发现没问题了!但是先别急,进入app,点击goto按钮,发现程序直接闪退了或者出现下面这个信息

经查阅官方论坛提示需要在strings.xml中添加一行:

登录后复制

<string name="game_view_content_description">Game view</string>

再次运行,点击goto完成了页面跳转,欧了!后续有时间再补充通过aar的方式打包unity模组并在项目中引入的流程。


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空