Unity与Andriod的交互

news2024/9/21 18:59:26

Unity与安卓的信息交互


这次分享的不同于传统的方式AndroidJavaClass("com.unity3d.player.UnityPlayer")
如果是新手的话,请看 交互新手教程

在这里插入图片描述
在这里插入图片描述

这里讲的是在Unity中调用java代码,或者在unity中传参到java中,在Java代码中运行。

以下是在Java中的代码

public class UnitySdk {
    private final String TAG = "sdkcall";
    private static final class MInstanceHolder{
        static final UnitySdk mInstance = new UnitySdk();
    }
    public static UnitySdk getInstance() { return MInstanceHolder.mInstance; }
    private UnitySdk() {
        UnityPlayer mPlayer;
        try {
            ArrayList<Class<?>> clsList = new ArrayList<Class<?>>();
            Class<?> cls = UnityPlayer.currentActivity.getClass();
            clsList.add(cls);
            cls = cls.getSuperclass();
            while (cls != null) {
                clsList.add(cls);
                cls = cls.getSuperclass();
            }
            mPlayer = null;
            for (Class<?> c : clsList) {
                Field[] flds = c.getDeclaredFields();
                for (Field fld : flds) {
                    if (UnityPlayer.class.equals(fld.getType())) {
                        fld.setAccessible(true);
                        mPlayer = (UnityPlayer) fld.get(UnityPlayer.currentActivity);
                        break;
                    }
                }
            }
            OnInit();
        } catch (Throwable t) {
            Log.i(TAG, "mPlayer=" + t);
            return;
        }
        Log.i(TAG, "add mPlayer=" + mPlayer);
    }
    public Activity activity(){return UnityPlayer.currentActivity;}
    private void OnInit(){
        Log.i(TAG, "OnInit: 初始化成功");
    }

    public int Getint()
    {
        return 520;
    }
    public String Getstring()
    {
        return "这个是个字符串信息";
    }
    public void LogIntPram(int _int)
    {
        Log.i(TAG, "LogIntPram: "+_int);
        String str = Integer.toString(_int);
        Toast.makeText(activity(),str,Toast.LENGTH_LONG).show();
    }
    public void LogStringPram(String _str)
    {
        Log.i(TAG, "LogStringPram: "+_str);
        Toast.makeText(activity(),_str,Toast.LENGTH_LONG*2).show();
    }
}

构建一个UnitySdk,方便在Unity中调用,而不是使用Unity自带的UnityPlayer类,在构造函数函数中,调用com.unity3d.player.UnityPlayer。将UnitySdk至为单例类。可在函数中对其他的一些方法,或自定义方法调用。
*


Unity中设置

将Android studio中打好的jar包,加载到Unity中,路径为:Plugins/Android/libs
在这里插入图片描述
在这里插入图片描述
在Unity中,将调用java的方法统一管理到Sdkmgr中。

public class Sdkmgr : MonoBehaviour
{
    private static AndroidJavaObject mainObject;

    private static Sdkmgr instance = null;
    public static Sdkmgr Instance
    {
        get
        {
            if (instance == null)
            {
                instance = GameObject.Find("mgr").AddComponent<Sdkmgr>();
            }
            return instance;
        }
    }

    private void Awake()
    {
#if !UNITY_EDITOR && UNITY_ANDROID
        Debug.Log("调用Awake");
        var mainClass = new AndroidJavaClass("com.wzt.sdkcall.UnitySdk");
        mainObject = mainClass.CallStatic<AndroidJavaObject>("getInstance");
#endif
    }

    public int GetInt()
    {
#if UNITY_EDITOR
        return 0;
#elif UNITY_ANDROID
        return mainObject.Call<int>("Getint");
#endif
    }
    public string GetString()
    {
#if UNITY_EDITOR
        return "";
#elif UNITY_ANDROID
        return mainObject.Call<string>("Getstring");
#endif
    }

    public void LogInt(int num)
    {
        if (mainObject != null)
        {
            Debug.Log(num);
            mainObject.Call("LogIntPram", num);
        }
    }

    public void LogString(string str)
    {
        if (mainObject != null)
        {
            Debug.Log(str);
            mainObject.Call("LogStringPram", str);
        }
    }
}

在业务逻辑中调用代码:

 void OnbtnIntClick()
    {
        txtContent.text = Sdkmgr.Instance.GetInt().ToString();
    }
    void OnbtnStrClick()
    {
        txtContent.text = Sdkmgr.Instance.GetString();
    }
    void OnbtnLogintClick()
    {
        Sdkmgr.Instance.LogInt(89);
    }
    void OnbtnLogstrClick()
    {
        Sdkmgr.Instance.LogString("这是一掉信息的!");
    }

效果图

Demo演示


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1680107.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二叉树遍历的实现

递归实现 先序遍历 代码实现 存储状态 中序遍历 后序遍历 算法分析 实质 复杂度 非递归算法实现 中序遍历 层次遍历 原理 实现

InfiniGate自研网关实现五

17.核心通信组件管理和处理服务映射 引入模块api-gateway-core 到 api-gateway-assist 中进行创建和使用&#xff0c;并拉取自注册中心的映射信息注册到本地的网关通信组件中。 第17节是在第15节的基础上继续完善服务发现的相关功能&#xff0c;把从注册中心拉取的网关映射信…

基于单片机的智能安防系统设计(32+4G+WIFI版)-设计说明书

设计摘要&#xff1a; 本设计基于STM32单片机&#xff0c;旨在实现一个智能安防系统&#xff0c;主要包括烟雾和温度传感器、人体红外传感器、显示屏、按键、4G模块和WiFi模块等组件。通过这些组件的协作&#xff0c;实现了火灾检测、入侵监测、状态显示、用户交互和远程通信等…

vscode对一些软件的调试插件。

vscode对一些软件的调试插件。 1、ae &#xff0c;f1然后选择运行 after effect 脚本 2、maya,右键send code to maya 3、max&#xff0c;ctrle运行脚本到max 4、unity 从在Visual Studio代码使用.NET的核心&#xff1a; 1、安装.NET Core SDK&#xff0c;链接: https://dotn…

QT客户端开发的注意事项

QT客户端开发是一个涉及图形用户界面&#xff08;GUI&#xff09;设计、网络编程、数据库交互等多个方面的复杂过程。以下是在进行QT客户端开发时应注意的一些关键事项&#xff0c;通过关注这些事项&#xff0c;可以提高QT客户端应用的质量和开发效率。北京木奇移动技术有限公司…

内网安全-隧道搭建穿透上线FRPNPSSPPNgrokEW项目

旨在代理连接肉鸡后实现本地渗透肉鸡网络架构 Linux&#xff1a;Proxychains Windows&#xff1a;Sockscap Proxifier 穿透项目&#xff1a;Ngrok Frp Spp Nps EW(停更) 优点&#xff1a;穿透加密数据&#xff0c;中间平台&#xff0c;防追踪&#xff0c;解决网络问题 https://…

1727jsp思想政治活动Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 思想政治活动管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff…

Java——继承详解、super 关键字、super和this的异同、protected关键字、final关键字、继承与组合

1、继承的概念&#xff1a; 继承主要解决的问题&#xff1a;共性的抽取&#xff0c;实现代码复用 可以让我们在保持原有类&#xff08;父类、超类、基类&#xff09;特性的基础上进行扩展&#xff0c;增加新功能&#xff0c;这样产生新的类&#xff0c;称为派生类&#xff08…

Blender 导入资源包的例子

先到清华源下载资源包&#xff1a; Index of /blender/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 具体地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/blender/demo/asset-bundles/human-base-meshes/human-base-meshes-bundle-v1.1.0.zip 解压/hum…

2024数学建模深圳杯B题成品论文43页word+完整可视化结果图+可执行代码

【无水印word】2024深圳杯B题成品论文43页&#xff08;附带1-4小问完整py解题代码思路&#xff09;https://www.jdmm.cc/file/2710664 批量工件并行切割下料优化研究 摘 要 本研究针对批量工件并行切割下料问题展开了深入的探讨与分析。通过建立数学模型和运用优化算法&…

如何去除字符串两侧的空白字符?

TRIM函数会去掉字符串左侧和右侧的空格&#xff0c;语法是&#xff1a;TRIM(字符串) excel中&#xff0c;TRIM函数能去掉字符串左侧和右侧的空格&#xff0c;它的ASCII码是32。 以下设定一个字符串组合&#xff0c;它的第一个字符中空格&#xff0c;最后一个字符是换行符 &q…

vue3专栏项目 -- 六、上传组件(上)

1、上传组件需求分析 我们还需要新建和展示文章&#xff0c;新建文章自然是发送post请求&#xff0c;同时在post中自带对应的数据&#xff0c;展示文章就是根据id取出已有的数据并且展示出来。 这里有一个难点就是上传组件&#xff0c;上传文件是App应用中最基本的需求&#…

五丰黎红销量增长的秘诀:一物一码数字化营销开创调味品行业新格局!

根据当今经济环境和未来的发展趋势&#xff0c;传统经济向数字化经济转型的发展方向可以说是大势所趋&#xff0c;如何把握先机&#xff0c;率先迈出数字化转型第一步&#xff0c;可以说是无数传统企业都需要思考的问题。 作为中国调味品行业的佼佼者&#xff0c;五丰黎红踩着时…

如何查看SNMP设备的OID

什么是OID和MIB OID OID 代表对象标识符。 OID 唯一地标识 MIB 层次结构中的托管对象。 这可以被描述为一棵树&#xff0c;其级别由不同的组织分配。MIB MIB&#xff08;管理信息基&#xff09;提供数字化OID到可读文本的映射。 使用MIB Browser扫描OID 我的设备是一台UPS SN…

13、24年--信息系统治理——IT审计

1、IT审计基础 1.1 IT审计定义 无重要的考点,自己读课本了解即可。 1.2 IT审计目的 1)IT审计的目的是指通过开展IT审计工作,了解组织IT系统与IT活动的总体状况,对组织是否实现IT目标进行审查和评价,充分识别与评估相关IT风险,提出评价意见及改进建议,促进组织实现IT目…

TCP(1)

传输层的两大协议是TCP 和 UDP &#xff0c;他们在传输数据的时候起到了不可替代的作用。那么什么是TCP呢&#xff1f; 首先TCP是一个网络传输协议&#xff0c;这个协议保证了可靠的数据传输。TCP是面向字节流的&#xff0c;全双工的&#xff08;也就是通信双方互相发消息&…

单位内部防泄密策略与技术实践

在信息时代&#xff0c;企业内部数据安全至关重要&#xff0c;尤其是涉及核心竞争力的重要文件&#xff0c;员工的不当操作或恶意泄露都可能给企业带来重大损失。本文将从制度建设、技术防护、以及日常管理三个方面入手&#xff0c;探讨如何构建一套行之有效的内部防泄密体系&a…

汇聚荣:拼多多长期没有流量如何提高?

在电商的海洋中&#xff0c;拼多多以其独特的团购模式吸引了众多消费者的目光。然而&#xff0c;随着市场竞争的加剧和消费者需求的多样化&#xff0c;一些商家发现自家店铺的流量持续低迷&#xff0c;销售业绩难以突破。面对这样的挑战&#xff0c;如何有效提升拼多多店铺的客…

大模型算法(零) - Transformer中的细节与实现

讲transformer的文章已经铺天盖地了&#xff0c;但是大部分都是从原理的角度出发的文章&#xff0c;原理与实现之间的这部分讲解的较少&#xff0c;想要了解实现细节&#xff0c;还是要去看代码才行。记录一下自己学习过程中遇见的细节问题和实现问题。 Transformer整体架构 图…

树链剖分详解,看这一篇就够了

前置知识&#xff1a; 树形结构链式前向星(熟练)线段树(熟练)DFS序(熟练)LCA(了解定义) 什么是树链剖分 树链剖分其实有两种&#xff1a;重链剖分和长链剖分。重链剖分就是把儿子节点最重的儿子称为重儿子&#xff0c;把树分成若干条重链&#xff08;如图一&#xff09;&#…