Unity + Android混合开发(一)

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

Unity打包工程

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

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

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

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

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

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

安卓加载Module

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

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

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

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文件如下所示:
image

然后打开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用于跳转:
image

最后修改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界面的按钮,代码很简单就不解释了,点击运行,发现报错:
image

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

看到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模组并在项目中引入的流程。

posted on 2022-08-05 19:52  拿铁冰冰冰红茶  阅读(1100)  评论(1编辑  收藏  举报