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

news/2024/12/27 8:45:30/

常用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() {@Overridepublic 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.ppmy.cn/news/238508.html

相关文章

【微信小程序开发】第 5 节 - 小程序代码的构成

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、了解项目的基本组成结构 3、小程序页面的组成部分 4、JSON 配置文件 4.1、json 配置文件的作用 4.2、app.json 文…

OpenStack部署(一)

OpenStack部署 1. 流程介绍1.1 模块关联1.2 虚拟机创建流程 2. 部署2.1 服务器规划2.2 环境整备1. 配置控制节点域名/计算节点解析2. 关闭控制节点/计算节点selinux和防火墙3. 安装与配置控制节点/计算节点的时间同步服务4. 在控制节点/计算节点执行命令验证时间同步服务5. 在控…

代码乱码问题

ide编码设置 vs studio默认编码使用unicode&#xff0c;qt creator编辑器代码在vs中不识别错误 页面>高级保存选项中设置&#xff0c;修改代码为unicode即可 vscode默认utf8&#xff0c;f1 change file encoding&#xff0c;切换代码编码方式 json json默认是utf8的编码…

C++ Primer Plus 第三章笔记

目录 1. 简单变量 1.1 变量名 1.2 整型 1.3 整型short、int、long和long long 1.4 变量初始化问题 1.5 无符号类型 1.6 整型字面值 1.7 char类型&#xff1a;字符和小整数 1.8 Bool类型 2. const限定符 3. 浮点数 3.1 为什么叫浮点数&#xff1f; 3.2 浮点数类型 …

安卓车机方案评述

转自&#xff1a;http://blog.sina.com.cn/s/blog_66ed3e0e0102uxgr.html 第一部分 安卓车机和WINCE车机的区别 1、 硬件要求不一样 Android 操作系统对CPU的要求比较高&#xff0c;已经从A8过渡到A9 &#xff0c;单核向四核发展 芯片 主频 内存 Android 至少Cortex A8 …

国内车联网行业 2015年发展趋势

本文全文转载自&#xff1a;http://forum.eet-cn.com/BLOG_ARTICLE_21510.HTM?click_from8800121758,9950093147,2015-01-07,EECOL,FORUM_ALERT&utm_sourceForum_Alert&utm_mediumNewsletter&utm_campaignGroup2 如有需要&#xff0c;请前往深度阅读。 ----------…

【车联网】车联网产业发展报告(2019)

5G智联车 目 录 一. 产业定义范畴 二. 产业政策分析 三. 产业链全景图 四. 价值链及创新 五. 产业地图布局 六. 行业龙头动向 七. 市场规模预测 八. 研判与建议 九. 资本市场动向 十. 三十强潜力企业 一、产业定义或范畴 车联网概念引申于物联网&#xff08;Internet of Things…

2019车联网产业发展报告

【转自】智车科技 1月30日 车联网概念引申于物联网&#xff08;Internet of Things&#xff09;&#xff0c;根据行业背景不同&#xff0c;对车联网的定义也不尽相同。传统的车联网定义是指装载在车辆上的电子标签通过无线射频等识别技术&#xff0c;实现在信息网络平台上对所有…