Unity3DUnity 中使用 C# 调用 Java ③ ( C# 调用 Java 实例 | 进行 Android 工程打包 | Android Studio 中运行 Android 工程 )

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity3DUnity 中使用 C# 调用 Java ③ ( C# 调用 Java 实例 | 进行 Android 工程打包 | Android Studio 中运行 Android 工程 )相关的知识,希望对你有一定的参考价值。

文章目录

【Unity3D】Android 打包 ④ ( Android 工程打包 | Unity 中导出安卓工程 | Android Studio 打开 Unity 导出的 Android 工程 ) 博客中将 Unity 项目导出为了 android 项目 , 并在 Android Studio 中编译并运行了该项目 ;

使用的 C# 脚本 , 是在 【Unity3D】Unity 游戏画面帧更新 ( 游戏物体 GameObject 移动 | 借助 Time.deltaTime 进行匀速运动 ) 系列博客中编写的脚本 ;

在博客 【Unity3D】Unity 中使用 C# 调用 Java ① ( Android Studio 模块准备 | 编译 Android 模块拿到字节码文件 | 拷贝字节码到 Unity 编辑器 ) 准备了要调用的 Android 模块 , 并且编译得到了字节码文件 , 该字节码文件已拷贝到 Unity 编辑器中 ;

在博客 【Unity3D】Unity 中使用 C# 调用 Java ② ( C# 调用 Java 的相关方法介绍 | 调用 Java 方法 | 获取 Java 字段 | 设置 Java 字段 ) 中介绍了 C# 调用 Java 的相关方法 ;





一、 C# 调用 Java 实例



首先 , 在 Unity 中的 C# 脚本中 , 创建 AndroidJavaObject 对象 , 对应 Java 类型为 kim.hsl.mylibrary.Student 的实例对象 ;

// 创建 AndroidJavaObject 类对象 , 可以调用实例对象方法
AndroidJavaObject androidJavaObject = new AndroidJavaObject("kim.hsl.mylibrary.Student");

然后 , 设置上述 kim.hsl.mylibrary.Student 实例对象的 name 属性字段 ;

// 设置 kim.hsl.mylibrary.Student 类的 name 字段
androidJavaObject.Set<string>("name", "Tom");
Debug.Log("向 kim.hsl.mylibrary.Student 对象中设置了 name 属性为 Tom");

再后 , 调用 kim.hsl.mylibrary.Student 实例对象的 getName 方法 , 并打印获取的返回值 ;

// 调用 kim.hsl.mylibrary.Student 类的 getName 方法
string studentName = androidJavaObject.Call<string>("getName");
Debug.Log("调用 getName 方法从 kim.hsl.mylibrary.Student 对象中获取返回值为 : " + studentName);

最后 , 获取 kim.hsl.mylibrary.Student 类的 name 字段值 , 并打印出来 ;

// 获取 kim.hsl.mylibrary.Student 类的 name 字段
string studentName2 = androidJavaObject.Get<string>("name");
Debug.Log("从 kim.hsl.mylibrary.Student 对象中获取 name 属性为 : " + studentName);

完整代码示例 :

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;
    





二、 重新进行 Android 工程打包



在 Unity 编辑器中选择 " 菜单栏 | File | Build Settings " 选项 ,


在 Build Settings 对话框中, 选择 " Export Project " 选项 , 然后 点击 右下角的 " Export " 按钮 ;

选择输出目录 ;

等待输出完毕 ;

输出的 Android 工程如下 :

打开 unityLibrary 模块目录 , 其中的

Y:\\002_WorkSpace\\013_Unity\\My project\\Build\\Unity_Project_2\\unityLibrary\\libs

目录下 , 就是拷贝的 classes.jar 字节码数据 ;





三、 Android Studio 中运行 Android 工程



使用 Android Studio 打开该 Unity_Project_2 项目 ;

在 华为 手机中 , 运行 Unity 导出的 Android Studio 工程 ;

打印核心日志为 :

2022-11-22 13:41:51.551 3477-10832/com.DefaultCompany.Myproject I/Unity: Unity 脚本入口 , 启动加载时调用
2022-11-22 13:41:51.556 3477-10832/com.DefaultCompany.Myproject I/Unity: C# 脚本附着游戏物体的名称 : Cube
2022-11-22 13:41:51.573 3477-10832/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 13:41:51.601 3477-10832/com.DefaultCompany.Myproject I/Unity:kim.hsl.mylibrary.Student 对象中设置了 name 属性为 Tom
2022-11-22 13:41:51.608 3477-10832/com.DefaultCompany.Myproject I/Student: getName
2022-11-22 13:41:51.609 3477-10832/com.DefaultCompany.Myproject I/Unity: 调用 getName 方法从 kim.hsl.mylibrary.Student 对象中获取返回值为 : Tom
2022-11-22 13:41:51.612 3477-10832/com.DefaultCompany.Myproject I/Unity:kim.hsl.mylibrary.Student 对象中获取 name 属性为 : Tom




四、 相关文件说明



C# 脚本

对应的 C# 脚本为 :

        // 创建 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);

Java 类

调用的 Java 类为 :

package kim.hsl.mylibrary;

import android.util.Log;

public class Student 
    public static final String TAG = "Student";
    public String name;
    public int age;

    public String getName() 
        Log.i(TAG, "getName");
        return name;
    

    public void setName(String name) 
        Log.i(TAG, "setName");
        this.name = name;
    

    public int getAge() 
        Log.i(TAG, "getAge");
        return age;
    

    public void setAge(int age) 
        Log.i(TAG, "setAge");
        this.age = age;
    

在 C# 中调用的 Java 类 , 尽量都定义成 public ;

以上是关于Unity3DUnity 中使用 C# 调用 Java ③ ( C# 调用 Java 实例 | 进行 Android 工程打包 | Android Studio 中运行 Android 工程 )的主要内容,如果未能解决你的问题,请参考以下文章

Unity3DUnity 中使用 C# 调用 Java ② ( C# 调用 Java 的相关方法介绍 | 调用 Java 方法 | 获取 Java 字段 | 设置 Java 字段 )

Unity3DUnity 中使用 C# 调用 Java ① ( Android Studio 模块准备 | 编译 Android 模块拿到字节码文件 | 拷贝字节码到 Unity 编辑器 )

Unity3DUnity 脚本 ① ( 创建 C# 脚本 | Visual Studio 2019 中打开 C# 脚本 | 编译 C# 脚本 | 挂载 C# 脚本到游戏物体 | 运行脚本 )

Unity3DUnity 脚本 ④ ( 游戏物体 GameObject 的坐标 | 修改 游戏物体 GameObject 的本地坐标 )

Unity3DUnity 脚本 ② ( Visual Studio 2019 中的 Unity 编译环境配置 | Unity 编辑器关联外部 C# 脚本编辑器 Visual Studio )

Unity3DUnity 脚本 ③ ( C# 脚本的执行入口函数 | 获取当前游戏物体及物体名称 | 获取游戏物体的 Transform 组件数据 | UnityEngine 命名空间简介 )