Unity与Android交互(2)——常用交互方式

news2024/11/25 4:18:00

常用AndroidJavaClass/AndroidJavaObject实现C#调用Java代码,常用UnitySendMessage实现Java调用C#代码。

【调用代码示例】

Java代码为:

package com.test.addtest;

import com.unity3d.player.UnityPlayer;

public class JavaTestClass {
    public static int num;
    public static void Add(int a,int b)
    {
        int result = a+b;
        SendMessage(Integer.toString(result));
    }

    private static void SendMessage(final String info)
    {
        UnityPlayer.currentActivity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                UnityPlayer.UnitySendMessage("GameBase","U3dCallbackMessage",info);
            }
        });
    }

    public String name;
    public int Sub(int c)
    {
        return num-c;
    }
}

C#代码为:

using UnityEngine;
using UnityEngine.UI;

public class TestCode : MonoBehaviour
{
    public Text text;

    public void Add()
    {
        using (AndroidJavaClass testClass = new AndroidJavaClass("com.test.addtest.JavaTestClass"))
        {
            testClass.CallStatic("Add", 3, 5);
            testClass.SetStatic<int>("num", 10);
            int num = testClass.GetStatic<int>("num");
            U3dCallbackMessage(num.ToString());
            using (AndroidJavaObject testObject = new AndroidJavaObject("com.test.addtest.JavaTestClass"))
            {
                testObject.Set<string>("name", "永恒之星");
                string name = testObject.Get<string>("name");
                U3dCallbackMessage(name);
                int result= testObject.Call<int>("Sub", 8);
                U3dCallbackMessage(result.ToString());
            }
        }
    }

    public void U3dCallbackMessage(string message)
    {
        text.text += message;
        text.text += " ";
    }
}

结果为:

【调用过程解析】

  1. 点击Button后执行Add方法,在Add方法中用AndroidJavaClass生成了一个testClass类,传入的参数是 包名+类名(可以看Java代码),类似于C#中的命名空间+类名。这样我们就得到了Java中写的类,而在C#中,我们是直接就有类。
  2.  testClass.CallStatic("Add", 3, 5); 这是在调用JavaTestClass中的Add方法,Add是静态方法,使用AndroidJavaClass的CallStatic方法实现调用,第一个参数是方法名,后面的参数是Add方法的参数,如果Add方法有三个参数,显然方法名后的参数要有三个。
  3. 在Add方法中实际调用了UnityPlayer.UnitySendMessage方法将结果传给C#端,其有三个参数,第一个参数是GameObject的名字,第二个参数是方法名,第三个参数是消息内容,这三个参数都是string类型(至于为什么用RunOnUiThread方法,在后面的文章中讲解,可以先认为这是异步调用,所以结果8,显示在最后)
  4. testClass.SetStatic<int>("num", 10)给Java代码中静态的int类型的字段num设置值为10,int num = testClass.GetStatic<int>("num")获取Java代码中int类型字段num的值,其结果为10
  5. AndroidJavaObject testObject = new AndroidJavaObject("com.test.addtest.JavaTestClass")是实例化一个Java类。
  6. testObject.Set<string>("name", "永恒之星");给实例化对象的string类型字段name设置值,string name = testObject.Get<string>("name")获取值
  7.  int result= testObject.Call<int>("Sub", 8);是调用实例化对象的Sub方法,其有一个int类型的返回值。
  8. 使用using是为了自动调用AndroidJavaClass和AndroidJavaObject的Dispose方法

【AndroidJavaClass与AndroidJavaObject的区别】

使用时将AndroidJavaClass理解为C#中的类,将AndroidJavaObject理解为该类的实例化对象

【UnitySendMessage】

为了使TestCode中的U3dCallbackMessage方法能收到Java中UnityPlayer.UnitySendMessage放松的消息,TestCode脚本必须挂在名字为GameBase的GameObject上。这就是UnityPlayer.UnitySendMessage前两个参数的意义。

【Java代码如何生成】

首先要自己安装Android Studio,Java代码和C#区别不大,很好写,不清楚的语法搜下就能看明白。

创建一个EmptyActivtity

指定PackageName,代码中会用到的

选择Android的目录结构,在app处右键,新建一个Module

 

 选择Android Library

 选择Project ,打开Unity目录,在Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations路径下,根据是il2cpp还是mono打包,继续选择debug,还是release模式,在Classes文件夹下找到classes.jar,导入到Java工程中的libs文件夹下面,右键选择 Add as library。导入方式是直接将文件拖过来,或者将文件复制到libs文件夹的路径下也可以。

在addtest->src->main->java->com.test.addtest处右键新建一个JavaClass,这个JavaClass里写代码即可

 代码写完点击Mark Project或者Rebuild Project

build成功没有报错,在outputs处右键,选择show in explorer。注意build文件夹是在build完自动出现的,刚创建工程的时候没有这个文件夹。Build一般不会报错,不过运气不好会有各种报错,这些报错搜一下很容易就可解决。

将arr文件解压,选择classes.jar文件,可以重命名为你需要的名字,本文命名为add

将这个文件放入unity中,C#代码即可调用Java代码。

 

 随后可以打个Android包,在模拟器上做测试。

【Build可能出现的报错及解决方式】

出现了再补充。。。

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

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

相关文章

BM1684X移植自写算法记录

移植步骤------------------------------------------------------------------------ 首先搭建好自己的网络模型&#xff0c;并导出为onnx格式--具体可以参照--> https://github.com/warren-wzw/MNIST-pytorch.git 将onnx模型使用tpu-mlir工具转化为bmodel格式--具体可以…

2.3 TensorRT基于Entropy的校准

tensorRT的Entropy Calibration的伪代码&#xff0c;具体流程如下&#xff1a; for循环&#xff1a;遍历所有可能的分割点&#xff0c;从128到2048reference_distribution_P&#xff1a;将原始直方图bins按照当前分割点i进行切割&#xff0c;得到左侧的i个bin。outliers_count…

构建新型智能化智慧档案馆十防一体化解决技术方案

HONSOR现代化智慧档案馆智慧档案库房自动化温湿度环境安全监控系统方案【推介】 目前&#xff0c;我国档案正处于现代化科技飞升的起点&#xff0c;以物联网、大数据、智能化、云计算等为标志的网络充斥到社会生活、生产的各个角落。在我国&#xff0c;档案馆产生与发展经历了一…

为了搞懂ERP,我连问 ChatGPT 30个问题,通透!

我对ERP有很多的疑问&#xff0c;这次向ChatGPT请教&#xff0c;连问30个问题&#xff0c;瞬间觉得通透了很多&#xff0c;以下是我的问题和ChatGPT的回复&#xff0c;分为概念篇、架构篇和生态篇三部分&#xff0c;希望能带给你新的启示。 一、概念篇 1、ERP是什么&#xff1f…

图论与算法(5)图的广度优先遍历应用

1. 广度优先遍历 1.1 树的广度优先遍历 树的广度优先遍历&#xff08;Breadth-First Traversal&#xff09;&#xff0c;也称为层次遍历&#xff0c;是一种按层次顺序逐级访问树节点的遍历方式。在广度优先遍历中&#xff0c;先访问树的根节点&#xff0c;然后按照从上到下、…

高频面试八股文用法篇(二) hive中几种排序类型区别

目录 排序函数 1、order by 2、sort by 3、distribute by 4、cluster by 总结 排序类型 1、order by order by是与关系型数据库的用法是一样的。select * from emp order by empno desc; 针对全局数据进行排序&#xff0c;所以最终只会有1个reduce&#xff0c;因…

开源 Golang 微服务入门一: HTTP 框架 Hertz

前言 从本篇笔记开始将介绍 Go 框架三件套&#xff08;Web / RPC / ORM&#xff09;&#xff0c;框架的学习有助于后续课程的学习以及大项目的完成。本文主要介绍字节跳动的开源 Golang 微服务 HTTP 框架 Hertz。先了解一下三件套的相关基本知识&#xff0c;做一下铺垫&#x…

ArgoCD(二)--部署

3.2 ArgoCD部署 ArgoCD部署官网&#xff1a;https://argo-cd.readthedocs.io/en/stable/getting_started/ ArgoCD有两种部署方式&#xff1a;多租户部署和核心化部署&#xff1a; 多租户 常用于多个应用程序开发团队提供服务&#xff0c;并由平台团队维护的场景&#xff1b; …

BPMN模拟动画执行流程

目录 第一步&#xff1a;构建BPMN图 第二步&#xff1a;开启模拟 第三步&#xff1a;执行模拟 第四步&#xff1a;监听模拟 第一步&#xff1a;构建BPMN图 通过id标记&#xff0c;每一个流程 第二步&#xff1a;开启模拟 BPMN官方提供了各种各样的模块&#xff0c;比如执行…

修改linux ssh 22 端口

1、找到 sshd 的配置文件&#xff0c;增加一行 Port 32586 ,默认是 22 端口&#xff0c;记得&#xff0c;先不要把 22 端口的这一行删除&#xff0c;或者注释&#xff0c;因为我们要先验证一下&#xff0c;我们修改后的端口是否可以使用&#xff0c;都ok后&#xff0c;再把 22 …

精通Java数组的艺术:从初学者到高手的进阶之路(二)

⭐ 多维数组⭐ 数组存储表格数据⭐ Comparable 接口 ⭐ 多维数组 多维数组可以看成以数组为元素的数组。可以有二维、三维、甚至更多维数组&#xff0c;但是实际开发中用的非常少。最多到二维数组。 【eg】二维数组的声明 public class Test {public static void main(Strin…

一起看 I/O | Wear OS 更新一览

作者 / Android 开发者关系工程师 Kseniia Shumelchyk 随着 Wear OS 平台的不断发展&#xff0c;我们很高兴与您分享一些最新的功能和改进&#xff0c;以帮助您为用户打造富有吸引力的创新体验。 Peloton 和 Todoist 等合作伙伴一直以来都针对 Wear OS 打造卓越体验&#xff0c…

Android自定义一个车牌字母选择键盘

在一般和车相关的应用&#xff0c;难免会和车牌打交道&#xff0c;组成车牌的要素&#xff0c;国内无非就是省份简称地区代码英文或者数字组成&#xff0c;比如京A12345&#xff0c;在需要输入车牌的功能上&#xff0c;就需要有省份简称键盘和英文数字键盘了&#xff0c;在上篇…

深度学习(自编码器)

深度学习目录 自适应线性单元 (Widrow and Hoff, 1960)神经认知机 (Fukushima, 1980)GPU-加速 卷积网络 (Chellapilla et al., 2006)深度玻尔兹曼机 (Salakhutdinov and Hinton, 2009a)无监督卷积网络 (Jarrett et al., 2009b)GPU-加速 多层感知机 (Ciresan et al., 2010)分布…

人工影响天气期末复习笔记

&#xff08;一&#xff09;什么是人工影响天气 利用自然云微物理不稳定性&#xff0c;通过一定的技术方法改变云的微结构&#xff0c;从而改变云降水的发展过程&#xff0c;从而达到增加降水&#xff0c;防雹&#xff0c;消云雾等目的 &#xff08;二&#xff09;为什么要人工…

【历史上的今天】6 月 6 日:世界 IPv6 启动纪念日;《俄罗斯方块》发布;小红书诞生

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 6 月 6 日&#xff0c;在 2019 年的今天&#xff0c;工信部正式发放 5G 牌照。这一天&#xff0c;有四家企业被颁发了基础电信业务经营许可证&#xff0c;从此…

社区团购系统源码后台解析

近年来&#xff0c;随着购物方式的改变&#xff0c;社区团购可以说是越来越受关注了&#xff0c;大家应该对社区团购多多少少有一些认知&#xff0c;其实社区团购这样的商业模式拥有强大的赚钱的潜力&#xff0c;主要就是因为它的运营成本低&#xff0c;而且上手也不需要很复杂…

FPGA设计的指导性原则 (四)

在FPGA Express/FPGA Compiler II中,用鼠标右键单击编译后的芯片图标, 在弹出的命令对话框中选择“Edit Constraints”命令编辑综合约束文件(扩展 名为CTL),选择端口(Ports)选项卡,指定所需信号的全局时钟域为 “DONT USE”。图22所示为在FPGA Express综合约束编辑器中…

私有化部署低代码开发工具:jvs-rules 规则引擎决策流参数说明

JVS规则引擎决策调用 通过决策流水号查询入参变量 [请求参数]决策流 ​ GET/mgr/risk//test/parameter/flow/{no} 请求数据类型 application/x-www-form-urlencoded 响应数据类型 [ "*/*" ] 请求参数 参数名称 参数说明 请求类型 是否必须 数据类型 sch…

【Flutter混合开发】开发一个简单的快速启动框架

目录 前言启动插件Flutter代码Android代码IOS代码 启动模块使用android端ios端 前言 因为在移动端中启动Flutter页面会有短暂空白&#xff0c;虽然官方提供了引擎预热机制&#xff0c;但是需要提前将所有页面都进行预热&#xff0c;这样开发成本较高&#xff0c;在研究了闲鱼的…