Как отправить сообщения с Android на Unity (с VR)?(UnityPlayer.UnitySendMessage не работает) - PullRequest
2 голосов
/ 05 апреля 2019

-> Резюме:

Я хочу отправлять сообщения из AndroidStudio - Код в Unity - Обычный способ не работает.


-> Что я пробовал:

У меня есть два проекта в Unity3D.Они точно такие же, за исключением того, что один из них настроен для Oculus Gear Vr ... Затем я экспортирую (Android) оба этих проекта и открываю их как проекты AndroidStudio.Когда я запускаю их, теперь они работают точно так же, как и ожидалось!

Но когда я пытаюсь использовать метод UnityPlayer.UnitySendMessage, кажется, что этот метод не выполняется в приложении с настройкой для VR ... Приложениене вылетает, он не показывает никаких ошибок в LogCat, и я пытался поймать любой Throwable, но это тоже не сработало ...

(В приложении без настройки VR работают те же строки кода ...)


-> Android - код:

public class UnityPlayerActivity extends Activity {
   [...]

   onCreate(Bundle savedInstanceState){
      [...] //code generated by Unity

      try{
         Log.d("mDEBUG", "Test Android1");
         UnityPlayer.UnitySendMessage("AndroidCommunication", "AndroidStudioInit", "false");
         Log.d("mDEBUG", "Test Android2");
      }catch(Throwable e){
         e.printStackTrace();
      }
   }

   //Function used by Unity - Code
   public void unityLog(String msg){
      Log.d("mDEBUG", "Unity: " + msg);
   }

   [...]
}

-> Unity - код:

public void AndroidStudioInit(string flag)
{
   bool sendCurCameraRotation = bool.Parse(flag);

   AndroidJavaClass unityPlayerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
   AndroidJavaObject unityPlayerActivity = unityPlayerClass.GetStatic<AndroidJavaObject>("currentActivity");

   unityPlayerActivity.Call("unityLog", "AndroidStudio - Unity - Init");
}


->Ожидаемые результаты :

Для обоих приложений должно быть напечатано в Logcat:

  1. "[...] D / mDEBUG: Test Android1"
  2. "[...] D / mDEBUG: Unity: AndroidStudio - Unity - Init"
  3. "[...] D / mDEBUG: Test Android2"

-> Фактические результаты :

Для приложения без настройки для VR :

  1. "[...] D / mDEBUG: тестирование Android1 "
  2. " [...] D / mDEBUG: Unity: AndroidStudio - модульy - Init "
  3. " [...] D / mDEBUG: Test Android2 "

Для приложения с VR :

  1. "[...] D / mDEBUG: тестировать Android1"
  2. "[...] D / mDEBUG: тестировать Android2"

Тамтакже нет ошибок, и приложение Unity не дает сбоя ... оно просто "кажется, игнорирует" вызов функции ...

1 Ответ

0 голосов
/ 17 апреля 2019

Хорошо, кажется, я знаю, в чем проблема, и я думаю, что с этим ничего не поделаешь ...

Я отправлял сообщение в Unity так:

mUnityPlayer = new UnityPlayer(this);
setContentView(mUnityPlayer);
mUnityPlayer.requestFocus();

UnityPlayer.UnitySendMessage("AndroidCommunication", "AndroidStudioInit", "false");

И обычно Unity сохраняет сообщение в очереди для его выполнения после правильного запуска Unity.

Это работает для приложения без Vr просто отлично.

Но с включенным режимом Vr сначала на вашем устройстве появится экран (что-то вроде «Поместите ваше устройство в Gear Vr ...»). И я думаю, что это как-то портит отправку сообщения ...

Таким образом, Unity будет выполнять сообщения только после правильного запуска (после того, как окно «Сделано в Unity» прошло).

Помнить: не отправлять сообщения, пока не будет полностью запущено Unity, если вы используете Vr ... Если вы все еще хотите выполнить код при запуске, вы можете попробовать создать метод в Unity, который будет уведомлять код Android, который есть в Unity. закончено!

Ура!

...