Примеры кода: Вызов Java/Kotlin кода из C# скриптов
Unity предоставляет высокоуровневые APIs, такие как AndroidJavaObject, AndroidJavaClass, AndroidJavaProxyи AndroidApplication, которые позволяют взаимодействовать с кодом Java/Kotlin из скриптов C#.
Следующие примеры кода демонстрируют, как использовать эти APIs.
Пример 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;
}
}
}
В этом примере:
- Создает
AndroidJavaObject, который представляет java.lang.String. -
AndroidJavaObjectконструктор принимает как минимум один параметр — имя класса, экземпляр которого нужно создать. Все параметры после имени класса передаются в вызов конструктора объекта, в данном случаеtextпараметр отGetJavaStringHashCode. - Вызывает hashCode() для получения хэш-кода строки. Этот вызов использует параметр общего типа
intдляCall, посколькуhashCode()возвращает хэш-код в виде целого числа.
Примечание: для создания экземпляра вложенного класса Java нельзя использовать точечную нотацию. Необходимо применять $ для создания экземпляров внутренних классов. Например, android.view.ViewGroup$LayoutParams или android/view/ViewGroup$LayoutParamsгде: LayoutParams класс вложен в ViewGroup class.
Пример 2. Получение каталога кэша приложения
Следующий пример кода извлекает каталог кэша для текущего приложения в C# с помощью AndroidApplication class.
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;
}
}
В этом примере:
- Использует
AndroidApplication.currentActivityдля доступа к текущей операции Android без явного создания экземпляровAndroidJavaClassилиAndroidJavaObject. - Вызывает getCacheDir() на объекте Activity, который возвращает объект Файл, представляющий каталог кэша.
- Звонки getCanonicalPath() на объекте File может получить каталог кэша в виде строки.
Примечание: Этот пример является справочным. Вместо этого, для доступа к кэшу приложения и каталогу файлов используйте Application.temporaryCachePath и Application.persistentDataPath APIs.
Пример 3: Передача данных из Java в Unity
Следующий пример кода показывает, как передать данные из 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);
}
}
В этом примере:
- Использует
AndroidApplication.unityPlayerдля доступа к экземпляру Java, используемому операцией, без явного создания экземпляраAndroidJavaClass. - Вызов статического метода
UnitySendMessage, который является членомcom.unity3d.player.UnityPlayer.
Хотя вы вызываете UnitySendMessage из Unity, он использует Java для ретрансляции сообщения, которое затем вызывает обратно собственный код Unity, чтобы доставить его GameObject по имени My GameObject, к которому прикреплен скрипт, содержащий метод JavaMessage.