IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> unity和android平台使用 AndroidJavaProxy进行非托管交互 -> 正文阅读

[游戏开发]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;
    /// <summary>
/// 继承 AndroidJavaProxy,实现对应 Android 中的接口
/// 然后作为实例传给 Android 调用
/// </summary>
    public class GmInitListener : AndroidJavaProxy
    {
        Action<GmResult> initCallbackAction;
        //  C# 找到 Android plugin 中接口的引用(包名 + 接口名称)
        public GmInitListener(Action<GmResult> 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<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 两端交互的功能了。

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-12-02 17:05:52  更:2021-12-02 17:06:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 23:43:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码