0%

Unity 游戏调用 Android 方法

在 Unity 项目中,游戏调用平台原生的功能是很常见的。Unity 提供了几个类和方法来负责 C# 脚本和 Android Java 代码之间的交互。iOS 平台参考Unity 游戏调用 iOS 方法

C# 调用 Android Java 代码

Unity 中用AndroidJavaObject 类来表现 Java 中 java.lang.Object 类的实例,内部封装了对类静态或实例方法的调用,并做了适当的缓存以提高速度。和 AndroidJavaClass 一起使用。

C# 代码:

1
2
3
4
5
6
7
8
9
10
11
using (AndroidJavaClass ajc = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) // 获取 com.unity3d.player.UnityPlayer 类
{
AndroidJavaObject activity = ajc.GetStatic<AndroidJavaObject>("currentActivity"); // 获取类中的静态变量 currentActivity,这个通常是 UnityPlayerActivity 的子类
if (activity != null)
{
activity.Call("func"); // 调用 func 方法
activity.Call("funcWithParam", "test"); // 调用 funcWithParam 并传入一个字符串参数
string str = activity.Call<string>("getStringFunc"); // 调用 getStringFunc 返回一个 string
int i = activity.Call<int>("getIntFunc"); // 调用 getIntFunc 返回一个 int
}
}

Java 中将 MainActivity 设置为 com.unity3d.player.UnityPlayerActivity 的子类,并实现对应的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class MainActivity extends com.unity3d.player.UnityPlayerActivity {
public void func() {
}

public void funcWithParam(String param) {
}

public String getStringFunc() {
return "return value";
}

public int getIntFunc() {
return 123;
}
}

Java 代码回调 Unity

使用 com.unity3d.player.UnityPlayer.UnitySendMessage 方法来向 Unity 发送消息。

Java 代码:

1
2
3
4
String gameObjectName = "AndroidTestCallback"; // 游戏对象的名称
String methodName = "OnAndroidCallback"; // 对象的方法
String msg = "msg to send"; // 要发的消息
UnityPlayer.UnitySendMessage(gameObjectName, methodName, msg);

Unity 中创建一个游戏对象(GameObject)名为 AndroidTestCallback,上面挂载了 AndroidTestCallback.cs 脚本,如图:

AndroidTestCallback.cs 脚本中实现 OnAndroidCallback 方法,方法签名必须是 void methodName(string msg)

1
2
3
4
5
6
7
public class AndroidTestCallback : MonoBehaviour
{
// 回调的方法 msg 为发送的消息
public void OnAndroidCallback(string msg)
{
}
}

回调是异步的,在下一帧中执行。

参考链接