Не удается передать событие из Unity в библиотеку андроидной библиотеки

Я совершенно новый в Unity, и я пытаюсь создать плагин Unity для баннера библиотеки Android, и я столкнулся со следующими проблемами:

Я не могу найти способ передать событие кнопки «Назад» в библиотеку Android. Кажется, что Unity предотвращает передачу этого события на уровень библиотеки. То, что мне удалось сделать, – передать сенсорные события в действие на стороне Android, установив следующую строку

<meta-data android:name="unityplayer.ForwardNativeEventsToDal vik" android:value="true" /> 

В <activity android:name="com.unity3d.player.UnityPlayerProxyActivity" ... > в AndroidManifest

Однако я не могу передать событие кнопки «Назад» таким образом, что мне не нужно менять код в библиотеке

Что я сейчас делаю в своем скрипте

 public void Update() { if(Input.GetKeyDown(KeyCode.Escape)) Application.Quit(); } 

Однако мне нужна возможность передать это событие назад, которое я захватил, в библиотеку и не обрабатывать его на уровне Unity.

Может быть, так или иначе.

 myActivity.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK)); 

или это

 myActivity.onBackPressed() 

А через скрипт C #. Как я могу выполнить это в скрипте?

Сценарий C #:

  void Update () { if (Input.GetKeyUp (KeyCode.Escape)) { AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer"); AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity"); jo.Call ("yourBackEventFunction"); } } 

И ваш Android lib

  public class YourActivity extends com.unity3d.player.UnityPlayerNativeActivity { … public void yourBackEventFunction() { // Do something here } … } 

========================

Редактировать:

Если вы хотите вызвать onBackPressed, вы можете сделать это:

В YourActivity.java

 @Override public void onBackPressed() { runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(UnityPlayerNativeActivity.this, "on Back Pressed", Toast.LENGTH_SHORT) .show(); } }); super.onBackPressed(); } 

И в скрипте C #:

  void Update () { if (Input.GetKeyUp (KeyCode.Escape)) { Debug.Log ("onResume Received"); AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer"); AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity"); jo.Call ("onBackPressed"); } } 

Или внутри YourActivity вы можете:

  1. Создайте свой объект YourActivity Extends UnityPlayerNativeActivty

  2. Включите свой Jar lib и вызовите нужную функцию.

Используйте сценарий C # для вызова своей деятельности.

Обратите внимание, что в Unity существует только 1 Activity, и это должен быть UnityPlayerNativeActivity ИЛИ это должен быть Activity EXTENDS FROM UnityPlayerNativeActivity. Вы не можете использовать какие-либо другие действия из своего Jar, не выходя из UnityPlayerNativeActivity.

Если класс YourActivity внутри JAR расширяет UnityPlayerNativeActivity. И вы не хотите менять JAR, тогда вы создаете новый класс Activity, расширяющий YourActivity. Создайте новый Jar + old Jar и создайте новые плагины.

========================

Если вы хотите вызвать функцию непосредственно из класса C # в Java, вы все равно можете сделать это, используя Android NDK для создания JNI lib

Этот пример демонстрирует, как Java-код можно использовать для взаимодействия с ОС Android и как C ++ создает мост между C # и Java. На сцене в пакете отображается кнопка, которая при нажатии выбирает каталог кэша приложений, определенный в ОС Android. Обратите внимание, что для компиляции плагинов вам понадобятся как JDK, так и Android NDK.

Ссылка здесь: http://docs.unity3d.com/Documentation/Manual/PluginsForAndroid.html

Пример здесь: http://docs.unity3d.com/Documentation/Images/manual/AndroidJavaPlugin.zip

Но я не уверен, что вы можете использовать свою собственную деятельность или нет. И я рекомендую создать новый Activity Extends из UnityPlayerNativeActivty, потому что этот способ более прост и неспособен, чем этот путь.

Br,

Фрэнк