Связь между Android и Unity очень проста.Я использую его последние 3 года, и он работает как чудо:)
IMP: При разработке приложения Unity для Android можно расширить стандартный класс UnityPlayerActivity (основнойКласс Java для Unity Player на Android, аналогичный AppController.mm на Unity iOS).Приложение может переопределить все основные взаимодействия между ОС Android и приложением Unity для Android.
- Вы можете написать простой Wrapper в своем коде на C # unity и экспортировать исходный код Android Studio из Unity.
- Сценарии Unity C # позволяют получить доступ к таким функциям, как вызовы ОС и сторонние библиотеки кода, которые в противном случае были бы недоступны для Unity.
Сначала создайте код в Unity и вызывайте андроидфункция от единства
1.Первое создание сборки в редакторе Unity:
Вам необходимо вызвать собственный метод Android из Unity или наоборот: Например:
public void OpenActivity()
{
var androidJC = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
var jo = androidJC.GetStatic<AndroidJavaObject>("currentActivity");
// Accessing the class to call a static method on it
var jc = new AndroidJavaClass("com.xyz.abc.StartActivity");
// Calling a Call method to which the current activity is passed
jc.CallStatic("Call", jo);
}
}
Заменить егопо вашей активности и имени пакета
var jc = new AndroidJavaClass("com.xyz.abc.StartActivity");
In C # (Caller)
jc.CallJavaFunc( "javaTestFunc", "UnityJavaJarTest" );
In Android (Callee)
public void javaTestFunc(String strFromUnity) {
/* ... Do something here with java native api ... */
}
2.Затем экспортируйте код как сборку для разработки и импортируйте его в Android Studio:
В Android Studio Расширьте / измените UnityPlayerActivity.Файл UnityPlayerActivity.java
В Android (Caller)
UnityPlayer.UnitySendMessage("AndroidManager", "SetJavaLog", strFromUnity + "HelloWorld");
In C # (Callee)
void SetJavaLog(string strJavaLog)
{
strLog = strJavaLog;
_text.text = strLog;
}
Затем создайте новый манифест Android, чтобы установить новую активность в качестве точки входа в ваше приложение.
ОЧЕНЬ ОЧЕНЬ ИМП : хотя этот метод поддерживает строку, все еще для вывода с возможностью повторного использования используйте указатель / IntPtr
Вот полный пример кода:
Java:
открытый финальный классMyPlugin {// Сделать класс статической переменной, чтобы функция обратного вызова отправлялась одному экземпляру этого класса.public static MyPlugin testInstance;
public static MyPlugin instance()
{
if(testInstance == null)
{
testInstance = new MyPlugin();
}
return testInstance;
}
string result = "";
public string UnitySendMessageExtension(string gameObject, string functionName, string funcParam)
{
UnityPlayer.UnitySendMessage(gameObject, functionName, funcParam);
string tempResult = result;
return tempResult;
}
//Receives result from C# and saves it to result variable
void receiveResult(string value)
{
result = "";//Clear old data
result = value; //Get new one
}}
C #:
class TestScript: MonoBehaviour
{
//Sends the data from PlayerPrefs to the receiveResult function in Java
void sendResultToJava(float value)
{
using(AndroidJavaClass javaPlugin = new AndroidJavaClass("com.company.product.MyPlugin"))
{
AndroidJavaObject pluginInstance = javaPlugin.CallStatic("instance");
pluginInstance.Call("receiveResult",value.ToString());
}
}
//Called from Java to get the saved PlayerPrefs
void testFunction(string key)
{
float value = PlayerPrefs.GetFloat(key) //Get the saved value from key
sendResultToJava(value); //Send the value to Java
}}
Использование с Java:
String str = UnitySendMessageExtension("ProfileLoad", "testFunction","highScore");