系列篇二
其他篇幅
Unity Android 交互
Unity Android 交互 二
Unity Android 交互 三 多个 Module分别生成 aar 导入Unity自动合并 AndroidManifest.xml
Unity 接入 Android SDK - 讯飞SDK 实战
本篇稍作修改,不再继承 UnityPlayerActivity
实现交互
创建一个Module。 File -> New -> New Module
上篇选择的是一个 Phone 一个手机应用,这次选择 Android Library
安卓库工程
设置工程名,包名和上篇步骤一样,创建完成如下
比创建一个 Phone 工程少了一些文件,res 文件夹下只有这几个文件
打开 AndroidManifest.xml 只有最精简的两行
(1)将 src -> androidTest 和 src -> test 无用文件删除
(2)修改 build.gradle 、删除无用引用库
(3)不需要添加Unity 库 classes.jar了,也不需要引用classes.jar 了
(4)测试生成 aar 是否成功都同上篇一样
下面开始创建 .java 代码
选择 包路径 :src -> main -> java-> com.singleLibrary.demo
右键 New -> Java Class
打开 TestAndroidLibrary
package com.singleLibrary.demo;
/**
* Created by Dev on 2017/12/12.
*/
public class TestAndroidLibrary {
}
开始写 Java 代码
package com.singleLibrary.demo;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.widget.Toast;
public class TestAndroidLibrary {
private static Context unityContext;
private static Activity unityActivity;
// 初始化方法,用来传入上下文
// 这里传入 UnityPlayerActivity
public static void init(Context _context)
{
unityContext = _context.getApplicationContext();
unityActivity = (Activity)_context;
}
// 传入两个数返回他们的和
public static int add(int arg0, int arg1)
{
return arg0 + arg1;
}
// 传入 meg,弹出一个 Toast 操作
public static void showToast(final String meg)
{
// 在 UI 主线程中调用UI
unityActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(unityContext, meg, Toast.LENGTH_LONG).show();
}
});
}
// 弹出一个提示窗口,窗口需要的文字信息从strings.xml 里面获取,点击确认关闭
public static void showAlertDialog(final String _title, final String _content)
{
unityActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
AlertDialog.Builder builder = new AlertDialog.Builder(unityActivity);
builder.setTitle(_title).setMessage(_content).setPositiveButton("Down", null);
builder.show();
}
});
}
}
将 arr 放入 Unity 工程 Plugins/Android 目录下
编写 C# 测试代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class TestLibrary : MonoBehaviour {
public Text text;
public Button buttonA;
public Button buttonB;
public Button buttonC;
// Use this for initialization
void Start () {
buttonA.onClick.AddListener(Add);
buttonB.onClick.AddListener(ShowDialog);
buttonC.onClick.AddListener(ShowToast);
Init();
}
private void Init()
{
#if UNITY_ANDROID
using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
{
// 获取到 TestAndroidLibrary 的 Java Class
AndroidJavaClass testAndroidLibrary = new AndroidJavaClass("com.singleLibrary.demo.TestAndroidLibrary");
// 调用初始化将 UnityPlayerActivity 实例传递进去
testAndroidLibrary.CallStatic("init", jo);
}
}
#endif
}
public void Add()
{
#if UNITY_ANDROID
// 获取到 TestAndroidLibrary 的 Java Class
using (AndroidJavaClass testAndroidLibrary = new AndroidJavaClass("com.singleLibrary.demo.TestAndroidLibrary"))
{
int number = testAndroidLibrary.CallStatic<int>("add", 100, 200);
string s = number.ToString();
ShowText( s);
}
#endif
}
public void ShowDialog()
{
// 获取到 TestAndroidLibrary 的 Java Class
using (AndroidJavaClass testAndroidLibrary = new AndroidJavaClass("com.singleLibrary.demo.TestAndroidLibrary"))
{
// 调用的是 静态方法
testAndroidLibrary.CallStatic("showAlertDialog", "标题", "内容");
}
}
public void ShowToast()
{
#if UNITY_ANDROID
// 获取到 TestAndroidLibrary 的 Java Class
using (AndroidJavaClass testAndroidLibrary = new AndroidJavaClass("com.singleLibrary.demo.TestAndroidLibrary"))
{
testAndroidLibrary.CallStatic("showToast", "ABCDEFG");
}
#endif
}
private void ShowText( string _str)
{
text.text = _str;
}
}
配置 Bundle Identifier 和 Minimum API Level 和 arr 中配置一致
打包 APK
安装到虚拟机上测试
点击按钮 Add
点击 ShowDialog 弹出对话框
点击按钮 C 弹出 Toast
三个按钮测试成功
发现上面都是通过静态方法调用 Android 方法的,
public void ShowDialog()
{
// 获取到 TestAndroidLibrary 的 Java Class
using (AndroidJavaClass testAndroidLibrary = new AndroidJavaClass("com.singleLibrary.demo.TestAndroidLibrary"))
{
// 调用的是 静态方法
testAndroidLibrary.CallStatic("showAlertDialog", "标题", "内容");
}
}
怎么加入调用类方法呢,修改 TestAndroidLibrary.java 加入一个静态实例
private static TestAndroidLibrary instance;
// 添加获取静态实例的方法
public static TestAndroidLibrary GetInstance()
{
if (instance == null)
{
instance = new TestAndroidLibrary();
}
return instance;
}
// 对象方法
public int sub (final int number1, final int number2)
{
return number1 - number2;
}
获取这个静态实例,然后利用这个静态实例调用 sub 方法
全部代码如下
package com.singleLibrary.demo;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.widget.Toast;
public class TestAndroidLibrary {
private static Context unityContext;
private static Activity unityActivity;
// 静态实例
private static TestAndroidLibrary instance;
// 初始化方法,用来传入上下文
// 这里传入 UnityPlayerActivity
public static void init(Context _context)
{
unityContext = _context.getApplicationContext();
unityActivity = (Activity)_context;
}
// 添加获取静态实例的方法
public static TestAndroidLibrary GetInstance()
{
if (instance == null)
{
instance = new TestAndroidLibrary();
}
return instance;
}
public int sub (final int number1, final int number2)
{
return number1 - number2;
}
// 传入两个数返回他们的和
public static int add(int arg0, int arg1)
{
return arg0 + arg1;
}
// 传入 meg,弹出一个 Toast 操作
public static void showToast(final String meg)
{
// 在 UI 主线程中调用UI
unityActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(unityContext, meg, Toast.LENGTH_LONG).show();
}
});
}
// 弹出一个提示窗口,窗口需要的文字信息从strings.xml 里面获取,点击确认关闭
public static void showAlertDialog(final String _title, final String _content)
{
unityActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
AlertDialog.Builder builder = new AlertDialog.Builder(unityActivity);
builder.setTitle(_title).setMessage(_content).setPositiveButton("Down", null);
builder.show();
}
});
}
}
修改 C# 代码,将ShowToast() 方法修改如下
public void ShowToast()
{
#if UNITY_ANDROID
// 获取到 TestAndroidLibrary 的 Java Class
using (AndroidJavaClass testAndroidLibrary = new AndroidJavaClass("com.singleLibrary.demo.TestAndroidLibrary"))
{
// 获取静态实例
using (AndroidJavaObject testAndroidLibraryObj = testAndroidLibrary.CallStatic<AndroidJavaObject>("GetInstance"))
{
testAndroidLibrary.CallStatic("showToast", "ABCDEFG");
// 静态实例调用对象方法 sub
int result = testAndroidLibraryObj.Call<int>("sub", 1000, 100);
ShowText(result.ToString());
}
}
#endif
}
重新打包 APK 测试 C 按钮,返回 1000 - 100 的结果
测试通过
到此一个不继承 UnityPlayerActivity
不依赖 Unity classes.jar 库的 Unity Android 交互 Demo 完成