首页 > 解决方案 > 如何从 Android 向 Unity(使用 VR)发送消息?(UnityPlayer.UnitySendMessage 不起作用)

问题描述

-> 总结:

我想从 AndroidStudio 发送消息 - 代码到 Unity - 正常方式似乎不起作用。


-> 我试过的:

我在 Unity3D 中有两个项目。它们完全相同,除了其中一个是为 Oculus Gear Vr 设置的......然后我导出(Android)这两个项目并将它们作为 AndroidStudio 项目打开。当我现在运行这些时,它们都按预期工作!

但是当我尝试使用 UnityPlayer.UnitySendMessage - 方法时,该方法似乎没有在应用程序中使用 setup vor VR 执行...应用程序不会崩溃,它不会在 LogCat 中显示任何错误,我试图捕捉任何 Throwable但这也没有用...

(在没有 VR 设置的应用程序上,完全相同的代码行可以工作......)


-> 安卓 - 代码:

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);
   }

   [...]
}

-> 统一 - 代码:

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:测试 Android1”
  2. “[...] D/mDEBUG: Unity: AndroidStudio - Unity - Init”
  3. “[...] D/mDEBUG:测试 Android2”

-> 实际结果

对于没有设置 VR 的应用程序

  1. “[...] D/mDEBUG:测试 Android1”
  2. “[...] D/mDEBUG: Unity: AndroidStudio - Unity - Init”
  3. “[...] D/mDEBUG:测试 Android2”

对于带有 VR 的应用程序

  1. “[...] D/mDEBUG:测试 Android1”
  2. “[...] D/mDEBUG:测试 Android2”

也没有错误,Unity App 没有崩溃……它只是“似乎忽略”了函数调用……

标签: androidunity3dintegrationvirtual-realityoculus

解决方案


好吧,看来我知道问题出在哪里,我认为这真的无济于事......

我正在向 Unity 发送这样的消息:

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

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

通常 Unity 会将消息存储在队列中,以便在 Unity 正常启动后执行它。

这适用于没有启用 Vr的应用程序就好了。

但是启用Vr模式后,您的设备上首先会显示一个屏幕(类似于“将您的设备放入 Gear Vr ...”)。而且我认为它以某种方式混淆了消息发送......

所以 Unity 只会在正确启动后执行消息(在窗口“Made by Unity”过去之后)。

要记住:如果您使用 Vr,请在 unity 完全启动之前不要发送消息...如果您仍想在启动时执行代码,您可以尝试在 Unity 中构建一个方法,该方法将通知 Android 代码 Unity 已完成!

干杯!


推荐阅读