android - 如何从 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 中打印:
- “[...] D/mDEBUG:测试 Android1”
- “[...] D/mDEBUG: Unity: AndroidStudio - Unity - Init”
- “[...] D/mDEBUG:测试 Android2”
-> 实际结果:
对于没有设置 VR 的应用程序:
- “[...] D/mDEBUG:测试 Android1”
- “[...] D/mDEBUG: Unity: AndroidStudio - Unity - Init”
- “[...] D/mDEBUG:测试 Android2”
对于带有 VR 的应用程序:
- “[...] D/mDEBUG:测试 Android1”
- “[...] D/mDEBUG:测试 Android2”
也没有错误,Unity App 没有崩溃……它只是“似乎忽略”了函数调用……
解决方案
好吧,看来我知道问题出在哪里,我认为这真的无济于事......
我正在向 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 已完成!
干杯!
推荐阅读
- csv - 如何将 Zimbra 数据解析为 CSV
- sql-server - 无需修改代码即可连接到 SQL Server 和 SQL Server Compact
- asp.net-core - 如何绑定到 Blazor 中的列表?
- python - 我应该如何从这个文本文件构建实体识别模型
- html - 更改 html 输入类型日期的占位符样式
- junit4 - 使用内存数据库中的实际存储库对 Spring 服务进行单元测试
- javascript - highchart - 提交时添加新数据
- psql - 如何从一个平面文件中读取值并在 PostgreSQL 文件中循环使用它们?
- sql - 应用程序性能的 SQL 平均时间计算
- sql-server - SSDT Schema Compare 总是添加对象,在解决方案中是“Build = None”