Unity 端可以使用 AndroidJavaClass, AndroidJavaObject 和 AndroidJavaProxy 这三个类,通过 JNI 对应了 Java 中的类,对象和接口与Android 平台进行通信。 Android 平台则通过调用 UnitySendMessage 方法来向 Unity 传递信息,Unity 端根据传递来的信息执行对应的逻辑。但是void UnitySendMessage(“GameObjectName”, “MethodName”, “Message”)需要在 Unity 端有一个 GameObject 来接收信息,而且没有返回值,只能传递一个字符串参数。这种方式是托管交互。 下面介绍一个非托管交互方法,通过回调的方式实现android 和c#交互: Android 端 有一个 setListener方法,参数是一个 GmInitListener的回调:
package com.xxx.xxx.a;
public class GmUnity {
private static final String TAG = "GmUnity";
public static void setListener(Activity activity, final GmInitListener initCallback){
GmResult gmResult = new GmResult(0,"Init Success");
if (initCallback != null)
initCallback.onResult(gmResult);
}
}
package com.xxx.xxx.listener;
public interface GmInitListener {
void onResult(GmResult result);
}
package com.xxx.xxx.b;
public class GmResult {
private int code;
private String message;
public GmResult(int code, String message) {
this.code = code;
this.message = message;
}
public int getCode() {
return this.code;
}
public String getMessage() {
return this.message;
}
public boolean isSuccess() {
return this.code == 0;
}
}
unity 端定义一个GmInitListener接口,继承AndroidJavaProxy,作为参数传给android 的setListener方法。
using System;
using UnityEngine;
public class GmInitListener : AndroidJavaProxy
{
Action<GmResult> initCallbackAction;
public GmInitListener(Action<GmResult> initCallbackAction) :
base("com.xxx.xxx.listener.GmInitListener")
{
this.initCallbackAction = initCallbackAction;
}
public void onResult(AndroidJavaObject resultObject)
{
if (initCallbackAction != null)
{
GmResult gmResult = new GmResult();
gmResult.Code = resultObject.Get<int>("code");
gmResult.Message = resultObject.Get<string>("message");
initCallbackAction.Invoke(gmResult);
}
}
}
using System;
public class GmResult
{
private int code;
private string message;
public GmResult()
{
}
public GmResult(int code,string message)
{
this.Code = code;
this.Message = message;
}
public int Code
{
get
{
return code;
}
set
{
code = value;
}
}
public string Message
{
get
{
return message;
}
set
{
message = value;
}
}
public bool IsSuccess()
{
if (Code == 0)
return true;
else
return false;
}
}
最后在 Unity 端直接调用android 的setListener方法,使用 AndroidJavaClass 获取到 Java 类对象,通过 CallStatic 方法获取到用 AndroidJavaObject 对应表示的实例对象。
using System;
public class GAndroid
{
private AndroidJavaClass gMAndroidClass;
private AndroidJavaObject unityActivity;
private AndroidJavaObject jo;
private static GAndroid _instance;
public static GAndroid getInstance()
{
if (null == _instance)
{
_instance = new GAndroid();
}
return _instance;
}
public GAndroid()
{
gMAndroidClass = new AndroidJavaClass("com.xxx.xxx.a.GmUnity");
unityActivity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");
}
public void setListener(Action<GmResult> initCallback)
{
var callback = new GmInitListener(initCallback);
gMAndroidClass.CallStatic("setListener", unityActivity, callback);
}
}
基本上这样就完成 Unity 和 Android 两端交互的功能了。
|