栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > Unity3D

unity和android平台使用 AndroidJavaProxy进行非托管交互

Unity3D 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

unity和android平台使用 AndroidJavaProxy进行非托管交互

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;
    /// 
/// 继承 AndroidJavaProxy,实现对应 Android 中的接口
/// 然后作为实例传给 Android 调用
/// 
    public class GmInitListener : AndroidJavaProxy
    {
        Action initCallbackAction;
        //  C# 找到 Android plugin 中接口的引用(包名 + 接口名称)
        public GmInitListener(Action initCallbackAction) :
            base("com.xxx.xxx.listener.GmInitListener")
        {
            this.initCallbackAction = initCallbackAction;
        }
		// 实现接口函数,使用AndroidJavaObject来获取android 中GmResult类
        public void onResult(AndroidJavaObject resultObject)
        {
            if (initCallbackAction != null)
            {
            //AndroidJavaObject转换成c#中的GmResult类
                GmResult gmResult = new GmResult();
                gmResult.Code = resultObject.Get("code");
                gmResult.Message = resultObject.Get("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("currentActivity");
        }
        public void setListener(Action initCallback)
        {

            var callback = new GmInitListener(initCallback);
            gMAndroidClass.CallStatic("setListener", unityActivity, callback);
        }
     }

基本上这样就完成 Unity 和 Android 两端交互的功能了。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/900739.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号