android - 如何将消息从 Android 发送到 Unity(使用 VR)? (UnityPlayer.UnitySendMessage 不起作用)

标签 android unity3d integration virtual-reality oculus

-> 总结:

我想从 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");
}


-> 预期输出:

For both apps it should print in Logcat:

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

->实际结果:

For app without setup for VR:

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

For app with VR:

  1. "[...] D/mDEBUG: Test Android1"
  2. "[...] D/mDEBUG: Test Android2"

也没有错误,Unity 应用程序也没有崩溃......它只是“似乎忽略了”函数调用......

最佳答案

好吧,看来我知道问题出在哪里,我认为这真的没有帮助......

我正在像这样向 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 已经完成!

干杯!

关于android - 如何将消息从 Android 发送到 Unity(使用 VR)? (UnityPlayer.UnitySendMessage 不起作用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55538989/

相关文章:

java - Java和Android开发中如何使用WeakReference?

尝试获取类型为 Autoscaler 的实例时发生 Azure WASABi 激活错误, key ""

api - 使用 CloudRail 进行 Dropbox 身份验证

c# - Unity3d检查用户是否授权设备相机

unity3d - 使用 kudan AR 旋转 AR 对象以始终面向相机

c# - 是否有任何集成框架,如 smooks for .NET?

android - 为什么android中的textColor是:textAppearance ignored?

java - 操作栏选项操作

java - onitemclicklistener 与 2 个微调器连接

git - Unity 和 git : multiproject structure and symbolic links, 更好的解决方案?