Version: 6000.3
语言: 中文
Unity 中的 Java 原生接口 API
Java/Kotlin 和 C# 代码支持的数据类型

代码示例:从 C# 脚本调用 Java/Kotlin 代码

Unity 提供高级 API,例如AndroidJavaObject,AndroidJavaClass,AndroidJavaProxyAndroidApplication允许您从 C# 与 Java/Kotlin 代码进行交互脚本一段代码,允许您创建自己的组件、触发游戏事件、随时间修改组件属性以及以您喜欢的任何方式响应用户输入。更多信息
请参阅术语表
.

以下代码示例演示了如何使用这些 API。

示例 1:获取 Java 字符串的哈希码

以下代码示例创建使用字符串初始化的 java.lang.String 实例,并检索该字符串的哈希值

using UnityEngine;
public class JavaExamples
{
    public static int GetJavaStringHashCode(string text)
    {
        using (AndroidJavaObject jo = new AndroidJavaObject("java.lang.String", text))
        {
            int hash = jo.Call<int>("hashCode");
            return hash;
        }
    }
}

此示例:

  1. 创建一个AndroidJavaObject表示 java.lang.String
  2. AndroidJavaObjectconstructor 至少接受一个参数,该参数是要构造实例的类的名称。类名后面的任何参数都用于对对象的构造函数调用,在本例中text参数从GetJavaStringHashCode.
  3. 调用 hashCode() 以获取字符串的哈希码。此调用使用int泛型类型参数Call因为hashCode()以整数形式返回哈希码。

注意:不能使用点表示法来实例化嵌套的 Java 类。必须使用分隔符来实例化内部类。例如,使用$android.view.ViewGroup$LayoutParamsandroid/view/ViewGroup$LayoutParams,其中LayoutParams类嵌套在ViewGroup类。

示例 2:检索应用程序的缓存目录

以下代码示例使用AndroidApplication类。

using UnityEngine;
using UnityEngine.Android;

public class JavaExamples
{
    public static string GetApplicationCacheDirectory()
    {
        using var javaFile = AndroidApplication.currentActivity.Call<AndroidJavaObject>("getCacheDir");
        var cacheDirectory = javaFile.Call<string>("getCanonicalPath");
        return cacheDirectory;
    }
}

此示例:

  1. 使用AndroidApplication.currentActivity以访问当前的 Android Activity,而无需显式创建AndroidJavaClassAndroidJavaObject实例。
  2. 在 Activity 对象上调用 getCacheDir(),该对象返回表示缓存目录的 File 对象。
  3. 调用 File 对象上的 getCanonicalPath() 可以将缓存目录作为字符串获取。

注意:此示例仅供参考。相反,要访问应用程序的缓存和文件目录,请使用 Application.temporaryCachePathApplication.persistentDataPath API。

示例 3:将数据从 Java 传递到 Unity

以下代码示例展示了如何使用UnitySendMessage.

using UnityEngine;
using UnityEngine.Android;

public class JavaExamples : MonoBehaviour
{
    private void Start()
    {
        AndroidJNIHelper.debug = true;
        AndroidApplication.unityPlayer.CallStatic("UnitySendMessage", "My GameObject", "JavaMessage", "NewMessage");
    }

    private void JavaMessage(string message)
    {
        Debug.Log("message from java: " + message);
    }
}

此示例:

  1. 使用AndroidApplication.unityPlayer访问活动使用的 Java 实例,而无需显式创建AndroidJavaClass实例。
  2. 调用静态UnitySendMessage方法,该方法属于com.unity3d.player.UnityPlayer.

尽管您调用UnitySendMessage在 Unity 中,它使用 Java 中继消息,然后调用本机/Unity 代码将其传递给游戏对象Unity 场景中的基本对象,可以表示角色、道具、风景、相机、航路点等。游戏对象的功能由附加到它的组件定义。更多信息
请参阅术语表
My GameObject它有一个附加的脚本,其中包含一个名为JavaMessage.

其他资源

Unity 中的 Java 原生接口 API
Java/Kotlin 和 C# 代码支持的数据类型