基于Unity2017.4.37c2,AndroidStudio3.5.2,最小安卓版本23,目标版本26
首先创建一个安卓项目,项目名和包名随意取,如果只是把某个功能嵌入到Unity里,不需要用到这两个,项目类型选择Empty Activity
建立完项目之后,要等待AndroidStudio加载完依赖项,才可以创建Module,在全部加载完成之前,New-Module按钮为灰色
等待加载完成之后,我们点击建立一个Module
类型选择AndroidLibraly,此处名字要记住
建立完成之后,可以在左侧Project视窗中看见,如果找不到对应文件夹,可以把上方改成Project
之后我们点击上方菜单栏File-Project Structure按钮
在Dependencies菜单中将工程自带的app文件夹删掉
从Unity安装目录Unity\2017.4.37c2\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes下,把Classes.jar包拖入到lib文件夹下
再次进入File-Project Structure-Dependencies界面,点击加号,将lib下的Classes.jar添加进去
之后,我们在src-main-java-com.cuihuo.test2unity文件夹下右键-New-JavaClass创建一个类
键入以下代码,此处要特别注意,android.app.Fragment已经被弃用,如果自己手动输入extends Fragment的话,AndroidStudio会自动引用androidx.fragment.app.Fragment,此时add(Instance,"Test2Unity")语句会报错,将Instance改成new android.app.Fragment()即可解决报错,但是能不能与Unity进行交互我没有测试过,所以此处需要我们手动引用android.app.Fragement;
package com.cuihuo.test2unity;
import android.app.Fragment;
import com.unity3d.player.UnityPlayer;
public class test2Unity extends Fragment {
public static test2Unity Instance;
public static void Start()
{
Instance=new test2Unity();
UnityPlayer.currentActivity.getFragmentManager().beginTransaction().add(Instance,"Test2Unity").commit();
}
public void CallBack(String _obj, String _fun, String _val){
UnityPlayer.UnitySendMessage(_obj, _fun, "Android Callback " + _val);
}
}
之后点开test2unity文件夹下的build.gradle文件
在最后面加上以下代码
task makeJar(type: Copy) {
delete 'build/libs/test2unity.jar'
from('build/intermediates/packaged-classes/release/')
into('buildbs/')
include('classes.jar')
rename ('classes.jar', 'test2unity.jar')
}
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
}
}
}
exportJar.dependsOn(deleteOldJar, build)
此处是参考这篇博客,经过实际测试之后,打包出来并没有release文件夹,但是第二个方法代码不可删除,删除会无法导出jar包,第三个方法是解决使用过时api导致的导出报错问题,参考这篇博客
输入完成之后,我们在右侧Gradle界面,选中对应文件,右键-Refresh Gradle project
(因为遇到了个BUG,更换了打包Jar包的方法,此图内的代码不可做为参考,打包Jar包的时候不可将Classes一起打包,在高版本的Unity里会遇到重复依赖的错误)
运行完成之后,原文件下方会出现一个单独的对应文件,选中新创建出来的test2unity-test2unity-Tasks-other-MakeJar
打包完成之后不会出现Releas文件夹,而是在对应的项目目录下的buildbs文件夹下,其中即是我们要使用的安卓包
将其放入我们的Unity项目中,新建一个Text
新建一个Test.cs,键入以下代码,随便挂在游戏内哪个物体上,将Text拖入对应的变量里
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Test : MonoBehaviour {
public Text txt;
// Use this for initialization
void Start () {
AndroidJavaClass ajc= new AndroidJavaClass("com.cuihuo.test2unity.test2Unity");
ajc.CallStatic("Start");
AndroidJavaObject ajo = ajc.GetStatic<AndroidJavaObject>("Instance");
ajo.Call("CallBack",this.gameObject.name,"SetText","测试");
}
// Update is called once per frame
void Update () {
}
public void SetText(string str)
{
txt.text = str;
}
}
这其中有几个需要注意的地方,AndroidJavaClass中的String路径,是由包名及类名组成的,要特别注意大小写,其中包名在一开始我们写的那段代码中可以看到Package com.cuihuo.test2unity,类名就是我们新建脚本时所命名的,AndroidJavaObject即是类中的变量,最后放个成功运行的效果