当前位置:   article > 正文

【Unity3D】Android Studio 工程中使用 Java 代码调用 Unity 的 C# 脚本 ( Java 中调用 UnityPlayer#UnitySendMessage 方法 )_unityplayer.unitysendmessage

unityplayer.unitysendmessage





一、 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'])
}
  • 1
  • 2
  • 3

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) {
            }
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10




三、 准备 C# 脚本



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

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

该脚本附着到 名称为 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 update
    void Start()
    {
        // 打印日志
        Debug.Log("Unity 脚本入口 , 启动加载时调用");

        // 设置游戏更新帧率 50 fps
        Application.targetFrameRate = 50;

        // 获取当前组件附着的 游戏物体 GameObject
        GameObject 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 frame
    void 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# 测试方法");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75




四、 Java 示例



在 Java 代码中 , 调用

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

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

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

在这里插入图片描述

完整输出日志 :

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# 测试方法
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/116884
推荐阅读
相关标签
  

闽ICP备14008679号