文章目录

  • 一、 Java 调用 C# 依赖库准备
    • 1、依赖库位置
    • 2、unityLibrary 依赖库位置
  • 二、 Java 调用 C# 的 UnityPlayer#UnitySendMessage 方法简介
  • 三、 准备 C# 脚本
  • 四、 Java 示例

一、 Java 调用 C# 依赖库准备


1、依赖库位置

在 Android 中调用 Unity 的 C# 脚本 , 需要借助 Unity 官方提供的依赖库进行 ; 在 Unity 编辑器的安装目录中 ,

Y:\001_DevelopTools\029_Unity\Editor\2020.3.41f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes

目录下 , 就是 Java 调用 C# 脚本的 依赖库 :

将上述目录中的 classes.jar 依赖库 拷贝到要调用 C# 脚本的模块下 , 引入依赖即可使用 ;

将依赖库拷贝到 libs 目录下 , 右键点击依赖库 , 然后选择 Add as Library 选项 , 将其添加到依赖中 ;

如果 在 build.gradle 构建脚本 配置了如下依赖 , 可以不用单独添加 ;

dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])
}

2、unityLibrary 依赖库位置

在 Unity 导出的依赖库中 , 会自动添加该依赖库 , 在 unityLibrary 中 libs 下的 unity-classes.jar 就是这个依赖库 ;

二、 Java 调用 C# 的 UnityPlayer#UnitySendMessage 方法简介


在 com.unity3d.player.UnityPlayer 类中 , 调用 UnitySendMessage 方法 , 可以调用 C# 脚本中的方法 ;

  • 第一个参数 String var0 : 是 C# 脚本附着的游戏物体 GameObject 名称 ;
  • 第二个参数 String var1 : 是 C# 脚本的方法名 ;
  • 第三个参数 String var2 : 是 C# 脚本方法的参数 , 如果没有参数传入空字符串 "" 即可 ;
    public static void UnitySendMessage(String var0, String var1, String var2) {if (!o.c()) {com.unity3d.player.f.Log(5, "Native libraries not loaded - dropping message for " + var0 + "." + var1);} else {try {nativeUnitySendMessage(var0, var1, var2.getBytes("UTF-8"));} catch (UnsupportedEncodingException var3) {}}}

三、 准备 C# 脚本


在 C# 脚本中 , 定义 Test 方法 , 之后在 Java 中调用该脚本的 Test 方法 ;

    void Test() {Debug.Log("Java 调用 C# 测试方法");}

该脚本附着到 名称为 Cube 的立方体上 , 之后在 Java 中调用 C# 脚本方法 , 需要根据 游戏物体 GameObject 查找 C# 脚本 ;

完整代码 :

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class BehaviourScript : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){// 打印日志Debug.Log("Unity 脚本入口 , 启动加载时调用");// 设置游戏更新帧率 50 fpsApplication.targetFrameRate = 50;// 获取当前组件附着的 游戏物体 GameObjectGameObject gameObject = this.gameObject;// 获取当前组件附着的 游戏物体 GameObject 名称string name = gameObject.name;Debug.Log("C# 脚本附着游戏物体的名称 : " + name);// 获取当前组件附着的 游戏物体 GameObject 的 Transform 组件Transform transform = gameObject.transform;// 获取 Transform 组件的 位置 , 旋转量 , 缩放倍数 Debug.Log("C# 脚本附着游戏物体的 Transform 组件数据 位置 : " + transform.position+ " , 旋转量 : " + transform.rotation + " , 缩放倍数 : " + transform.localScale);// 将 当前组件附着的 游戏物体 GameObject 移动到 (4.0f, 4.0f, 4.0f) 坐标位置//this.transform.localPosition = new Vector3(4.0f, 4.0f, 4.0f);// 创建 AndroidJavaClass 类对象 , 只能调用静态方法AndroidJavaClass androidJavaClass = new AndroidJavaClass("kim.hsl.mylibrary.Student");// 创建 AndroidJavaObject 类对象 , 可以调用实例对象方法AndroidJavaObject androidJavaObject = new AndroidJavaObject("kim.hsl.mylibrary.Student");// 设置 kim.hsl.mylibrary.Student 类的 name 字段androidJavaObject.Set<string>("name", "Tom");Debug.Log("向 kim.hsl.mylibrary.Student 对象中设置了 name 属性为 Tom");// 调用 kim.hsl.mylibrary.Student 类的 getName 方法string studentName = androidJavaObject.Call<string>("getName");Debug.Log("调用 getName 方法从 kim.hsl.mylibrary.Student 对象中获取返回值为 : " + studentName);// 获取 kim.hsl.mylibrary.Student 类的 name 字段string studentName2 = androidJavaObject.Get<string>("name");Debug.Log("从 kim.hsl.mylibrary.Student 对象中获取 name 属性为 : " + studentName);}// Update is called once per framevoid Update(){//Debug.Log("C# 脚本 Update 函数调用 , 游戏帧更新 , 当前游戏时间 : " + Time.time + " , 本次更新距离上次更新时间差 : " + Time.deltaTime);// 将 当前组件附着的 游戏物体 GameObject 沿 X 轴方向移动// 获取 物体的 当前位置 本地坐标Vector3 localPosition = this.transform.localPosition;// 计算移动的距离// 速度设置为 1 单位 / 秒float speed = 1f;// 计算长度 , 速度 乘以 距离上次帧更新的时间差float distance = speed * Time.deltaTime;// 匀速运动值localPosition.x += distance;// 将坐标设置回去 , 更新物体的位置this.transform.localPosition = localPosition;}void Test() {Debug.Log("Java 调用 C# 测试方法");}
}

四、 Java 示例


在 Java 代码中 , 调用

        // 调用 C# 脚本中的方法UnityPlayer.UnitySendMessage("Cube", "Test", "");

方法 , 即可调用 C# 脚本中的方法 ; 执行后打印日志

2022-11-22 15:00:53.931 4046-14911/com.DefaultCompany.Myproject I/Unity: Java 调用 C# 测试方法

完整输出日志 :

2022-11-22 15:00:53.855 4046-14911/com.DefaultCompany.Myproject I/Unity: Unity 脚本入口 , 启动加载时调用
2022-11-22 15:00:53.861 4046-14911/com.DefaultCompany.Myproject I/Unity: C# 脚本附着游戏物体的名称 : Cube
2022-11-22 15:00:53.879 4046-14911/com.DefaultCompany.Myproject I/Unity: C# 脚本附着游戏物体的 Transform 组件数据 位置 : (0.0, 0.0, 0.0) , 旋转量 : (0.0, 0.0, 0.0, 1.0) , 缩放倍数 : (1.0, 1.0, 1.0)
2022-11-22 15:00:53.907 4046-14911/com.DefaultCompany.Myproject I/Unity: 向 kim.hsl.mylibrary.Student 对象中设置了 name 属性为 Tom
2022-11-22 15:00:53.914 4046-14911/com.DefaultCompany.Myproject I/Student: getName
2022-11-22 15:00:53.914 4046-14911/com.DefaultCompany.Myproject I/Unity: 调用 getName 方法从 kim.hsl.mylibrary.Student 对象中获取返回值为 : Tom
2022-11-22 15:00:53.918 4046-14911/com.DefaultCompany.Myproject I/Unity: 从 kim.hsl.mylibrary.Student 对象中获取 name 属性为 : Tom
2022-11-22 15:00:53.931 4046-14911/com.DefaultCompany.Myproject I/Unity: Java 调用 C# 测试方法

【Unity3D】Android Studio 工程中使用 Java 代码调用 Unity 的 C# 脚本 ( Java 中调用 UnityPlayer#UnitySendMessage 方法 )相关推荐

  1. java appkey_1.新建Android studio工程2.新建class:AppKey.java.主要为了保存密钥代码块package com...adminap...

    1.新建Android studio工程 2.新建class:AppKey.java.主要为了保存密钥 代码块 package com...adminapp.lib.utils.jni; /** * ...

  2. Android零基础入门第11节:简单几步带你飞,运行Android Studio工程

    2019独角兽企业重金招聘Python工程师标准>>> 之前讲过Eclipse环境下的Android虚拟设备的创建和使用,现在既然升级了Android Studio开发工具,那么对应 ...

  3. 【Android FFMPEG 开发】Android Studio 工程配置 FFMPEG ( 动态库打包 | 头文件与函数库拷贝 | CMake 脚本配置 )

    文章目录 I . FFMPEG 交叉编译后的函数库及头文件 II . FFMPEG 静态库打包动态库 ( 仅做参考 ) III . 创建 Android Studio 工程 IV . FFMPEG 头 ...

  4. Android Studio 单刷《第一行代码》系列 03 —— Activity 基础

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

  5. Android Studio 单刷《第一行代码》系列 01 —— 第一战 HelloWorld

    前言(Prologue) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Android ...

  6. android工程怎么运行,简单几步带你飞,运行Android Studio工程

    原标题:简单几步带你飞,运行Android Studio工程 之前讲过Eclipse环境下的Android虚拟设备的创建和使用,现在既然升级了Android Studio开发工具,那么对应的Andro ...

  7. android studio生命周期代码,Android Studio 单刷《第一行代码》系列 06 —— Fragment 生命周期...

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

  8. 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库到 Android Studio 工程 | 配置 build.gradle 构建脚本 )

    文章目录 一.拷贝 lib7zr.so 动态库到 Android Studio 工程 二.配置 Module 下的 build.gradle 构建脚本 三.参考资料 一.拷贝 lib7zr.so 动态 ...

  9. Android Studio 单刷《第一行代码》系列 07 —— Broadcast 广播

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

最新文章

  1. WPF MeshGeometry3D
  2. 安装Exchange Server2016管理工具
  3. 求n个数中第k大的数_互联网高频面试题目:「回溯算法」求组合总和
  4. Coursera课程Python for everyone:chapter9
  5. opencv mat release thrown_【OpenCV+Python】图像与视频处理入门
  6. [Termux]给Termux安装一个发行版Linux
  7. String,char,数组,列表 相互转化 (更新中)
  8. akka kafka java_当使用websocket连接时,使用akka-stream-kafka从kafka主题获取最后一条消息...
  9. uniapp 微信小程序打包发布
  10. Unity3d Android安卓JDK9打包失败
  11. 网站性能工具-YSlow的23个规则-网站性能优化
  12. java环境一键配置下载地址_java环境一键配置-java环境一键配置下载 v1.0免费版-下载啦...
  13. 移动端 1px 像素处理
  14. 科普│串联质谱分析仪(ESI离子源)之离子阱质谱仪
  15. 计算机显示用户不存在,电脑出现未知设备提示驱动安装类无效或不存在如何解决...
  16. docker pull 流程
  17. 数字体育进入黄金窗口期
  18. C++实现空间中两个三角形位置关系(相交、平行)的判断
  19. android 强制退出当前应用程序,android 强制退出应用
  20. 腾讯自研HIDS「洋葱」后台上云架构演进实践

热门文章

  1. .NET Framework和.NET Core/.NET5/.NET6
  2. Sublime Merge——一款超好用的Git可视化工具
  3. 彩色图像与无色图像、消色差、图像的空间频率成分(chromatic information achromatic information、spatial frequency component)
  4. 高校图书馆管理系统 php 漏洞,某通用图书馆管理系统SQL注入_MySQL
  5. 【译】什么是响应式编程
  6. 【STM32】#147-D: declaration is incompatible 类错误的解决方式
  7. 王怀南:从谷歌之父到育儿专家
  8. shell学习之脚本练习1(显示ip + 检测文件类型)
  9. (Visual Basic)在VB2010中输出有某种规律的An矩阵
  10. 大新闻!微软正考虑添加 Python 为官方的 Excel 脚本语言