2.Unity调用Android
2.1 知识点
准备工作
在AndroidStudio中的MainActivity中加入测试用的成员变量
package com.tao.unityandroidtestgame;
import android.os.Bundle;
import com.unity3d.player.UnityPlayerActivity;
public class MainActivity extends UnityPlayerActivity {
// 测试成员变量
public int testI;
public static int testStaticI;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
}
// 测试成员函数
public String TestFun() {
return "String";
}
// 测试静态函数
public static String TestStaticFun() {
return "TestStaticFun";
}
}
修改后要重新生成aar包
导入AndroidStudio生成的内容
在Unity中新建 Plugins/Android 插件文件夹,将AndroidStudio生成的内容放入该文件夹中。
导入aar包
导入AndroidManifest.xml配置文件
在Unity中书写交互代码
测试准备的UGUI文本
// 这些代码在PC使用Unity的Debug.Log是看不到的,要用UGUI发布后进行测试
public Text txtOld;
public Text txtNew;
public Text txtStaticOld;
public Text txtStaticNew;
public Text txtTestFun;
public Text txtTestStaticFun;
交互代码
androidJavaObject.Get<变量类型>(“变量名”) 成员变量的获取
androidJavaObject.Set<变量类型>(“变量名”, 值) 成员变量的赋值
androidJavaObject.GetStatic<变量类型>(“变量名”) 静态变量的获取
androidJavaObject.SetStatic<变量类型>(“变量名”, 值) 静态变量的赋值
androidJavaObject.Call(“函数名”, 参数) 无返回值成员函数调用
androidJavaObject.Call<返回值类型>(“函数名”, 参数)有返回值成员函数调用
androidJavaObject.CallStatic(“函数名”, 参数) 无返回值静态函数调用
androidJavaObject.CallStatic<返回值类型>(“函数名”, 参数)有返回值静态函数调用
void Start()
{
// 固定写法
// 创建和Android通信的类信息
using (AndroidJavaClass androidJavaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
// 获取当前Unity基于的Activity对象
// 这里得到的对象就相当于是aar包中的MainActivity
// 当前这个JavaObj就代表MainActivity这个对象,我们可以通过它获取到其中的变量、方法
using (AndroidJavaObject androidJavaObject = androidJavaClass.GetStatic<AndroidJavaObject>("currentActivity"))
{
// 获取到MainActivity后,就可以调用其中的对应Java代码了
// 变量相关
// 1. 成员变量的获取和设置
// androidJavaObject.Get<变量类型>("变量名")
// androidJavaObject.Set<变量类型>("变量名", 值)
// 成员变量的获取和改变
int i = androidJavaObject.Get<int>("testI");
txtOld.text = i.ToString();
androidJavaObject.Set<int>("testI", 11);
i = androidJavaObject.Get<int>("testI");
txtNew.text = i.ToString();
// 2. 静态成员变量的获取和设置
// androidJavaObject.GetStatic<变量类型>("变量名")
// androidJavaObject.SetStatic<变量类型>("变量名", 值)
// 静态成员变量的获取和改变
int staticI = androidJavaObject.GetStatic<int>("testStaticI");
txtStaticOld.text = staticI.ToString();
androidJavaObject.SetStatic<int>("testStaticI", 21);
staticI = androidJavaObject.GetStatic<int>("testStaticI");
txtStaticNew.text = staticI.ToString();
// 函数相关
// 1. 成员函数调用
// 无返回值
// androidJavaObject.Call("函数名", 参数)
// 有返回值
// androidJavaObject.Call<返回值类型>("函数名", 参数)
// 调用有返回值的成员函数
string testFunStr = androidJavaObject.Call<string>("TestFun");
txtTestFun.text = testFunStr;
// 2. 静态成员函数调用
// 无返回值
// androidJavaObject.CallStatic("函数名", 参数)
// 有返回值
// androidJavaObject.CallStatic<返回值类型>("函数名", 参数)
// 调用有返回值的静态函数
string testStaticFunStr = androidJavaObject.CallStatic<string>("TestStaticFun");
txtTestStaticFun.text = testStaticFunStr;
}
}
}
打包注意事项
打包秘钥设置(非中文路径):
aar包设置(直接打包会报错,根据打包报错提示来处理,一般由以下几步需要处理):
在资源管理器使用解压软件打开aar包
删除aar包中 libs下的classes.jar,因为Unity会自带,避免重复报错
删除aar包中 classes.jar 中的 UnityPlayerActivity.class,因为Unity会自带,避免重复报错,删除unity3d文件夹
假如还是相同报错,可能是Unity还没反应过来,检查是否删除干净后重新生成app,会出现其他报错
删除aar包中 classes.jar 中的 BuildConfig.class,通过Unity打包不需要构建配置
作为以上操作后正常可以打包成功
安装测试
在真机或者虚拟机上安装打包的应用进行交互测试,可以正常读取和修改变量,且能调用函数
总结
Unity调用Android代码需要注意:
- 固定的API写法
- 打包报错处理
2.2 知识点代码
MainActivity
package com.tao.unityandroidtestgame;
import android.os.Bundle;
import com.unity3d.player.UnityPlayerActivity;
public class MainActivity extends UnityPlayerActivity {
//测试成员变量
public int testI;
public static int testStaticI;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
}
//测试成员函数
public String TestFun()
{
return "String";
}
//测试静态函数
public static String TestStaticFun()
{
return "TestStaticFun";
}
}
Lesson02_Unity调用Android
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Lesson02_Unity调用Android : MonoBehaviour
{
//这些代码在PC使用Unity的Debug.Log是看不到的,要用UGUI发布后进行测试
public Text txtOld;
public Text txtNew;
public Text txtStaticOld;
public Text txtStaticNew;
public Text txtTestFun;
public Text txtTestStaticFun;
void Start()
{
#region 准备工作
//在AndroidStudio中的MainActivity中加入测试用的成员变量
#endregion
#region 知识点一 导入AndroidStudio生成的内容
//在Unity中新建 Plugins/Android 插件文件夹
//将AndroidStudio生成的内容 放入该文件夹中
//1.导入aar包
//2.导入AndroidManifest.xml配置文件
#endregion
#region 知识点二 在Unity中书写交互代码
//固定写法
//创建和Android通信的类信息
using (AndroidJavaClass androidJavaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))//com.unity3d.player.UnityPlayer是固定写法
{
//获取当前Unity基于的Activity对象
//这里得到的对象就相当于是aar包中的MainActivity
//当前这个JavaObj就代表MainActivity这个对象 我们可以通过它获取到其中的变量、方法
using (AndroidJavaObject androidJavaObject = androidJavaClass.GetStatic<AndroidJavaObject>("currentActivity"))//currentActivity是固定写法 获取当前激活的Activity
{
//获取到MainActivity后 就可以调用其中的对应Java代码了
//变量相关
//1.成员变量的获取和设置
//androidJavaObject.Get<变量类型>("变量名")
//androidJavaObject.Set<变量类型>("变量名", 值)
//成员变量的获取和改变
int i = androidJavaObject.Get<int>("testI");
txtOld.text = i.ToString();
androidJavaObject.Set<int>("testI", 11);
i = androidJavaObject.Get<int>("testI");
txtNew.text = i.ToString();
//2.静态成员变量的获取和设置
//androidJavaObject.GetStatic<变量类型>("变量名")
//androidJavaObject.SetStatic<变量类型>("变量名", 值)
//静态成员变量的获取和改变
int staticI = androidJavaObject.GetStatic<int>("testStaticI");
txtStaticOld.text = staticI.ToString();
androidJavaObject.SetStatic<int>("testStaticI", 21);
staticI = androidJavaObject.GetStatic<int>("testStaticI");
txtStaticNew.text = staticI.ToString();
//函数相关
//1.成员函数调用
//无返回值
//androidJavaObject.Call("函数名", 参数)
//有返回值
//androidJavaObject.Call<返回值类型>("函数名", 参数)
//调用有返回值的成员函数
string testFunStr = androidJavaObject.Call<string>("TestFun");
txtTestFun.text = testFunStr;
//2.静态成员函数调用
//无返回值
//androidJavaObject.CallStatic("函数名", 参数)
//有返回值
//androidJavaObject.CallStatic<返回值类型>("函数名", 参数)
//调用有返回值的静态函数
string testStaticFunStr = androidJavaObject.CallStatic<string>("TestStaticFun");
txtTestStaticFun.text = testStaticFunStr;
}
}
#endregion
#region 知识点三 打包注意事项
//基础设置:
//1.打包密钥设置
//2.非中文路径
//aar包设置(根据打包报错提示来处理,一般由以下几步需要处理):
//1.删除aar包中 libs下的classes.jar,因为Unity会自带,避免重复报错
//2.删除aar包中 classes.jar 中的 UnityPlayerActivity.class,因为Unity会自带,避免重复报错
//3.删除aar包中 classes.jar 中的 BuildConfig.class,通过Unity打包不需要构建配置
#endregion
#region 知识点四 安装测试
//在真机或者虚拟机上安装打包的应用进行交互测试
#endregion
#region 总结
//Unity调用Android代码需要注意
//1.固定的API写法
//2.打包报错处理
#endregion
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com