3

我已经花了一周的时间,但我不是专家,所以我可能会错过一些东西,甚至想做一些不可能的事情。

我有一个 Unity 项目(使用 Daydream VR),我的目标是让 WebView 在 VR 模式下(对于 Android)在 3D 表面(作为纹理)上工作。我知道这听起来很复杂,我敢打赌。

这是我到目前为止的位置:

首先,我从 Oculus 的样本开始。他们制作了一个插件,将 Android MediaPlayer(来自 android 的本机类)链接到 Unity Texture,这很简单,因为 android 的媒体播放器已经使用 SurfaceTexture 来渲染自己,并且通过该插件,他们只是在两者之间建立了一座桥梁环境。

我很容易得到这个工作。

然后在我找到这篇文章之后:http ://www.felixjones.co.uk/neo%20website/Android_View/ 所以我推断可以使用相同的技巧在 Unity 中获取原生 Android WebView质地。

从文章中,我认为我唯一需要的是一个自定义的 Android WebView,它呈现到 SurfaceView(因此它与 Android MediaView 非常相似),然后 oculus 插件也可以工作。

当然不是这样的……

第 1 步/
我为 Unity 制作了一个 Android 插件,以公开一个自定义 WebView,(恕我直言)将呈现给 SurfaceView(但我不确定它是否完全正确)
参见 =>JrmgxWebView.java

第 2 步/
我编译了 oculus 插件,稍作改动
参见 =>*.cpp

第 3 步/
我修改了连接 Android 插件和 oculus 插件的 Unity 脚本以实现统一,并将其​​添加到 3D 立方体上的简单 Daydream 场景(与脚本相关联)
参见 =>WebviewPlayerSampleWeb.cs

我得到日志,据我了解,问题是 SurfaceView 没有刷新。我可以看到我的自定义 WebView 实例化得很好,大部分代码都可以正常工作并且没有错误(也没有崩溃)
但是纹理只会从白色(起始值)变为黑色(当插件初始化时),然后什么也没有发生。textureId来自插件的值会停留在 0 或 29,并且永远AndroidSurfaceTexture->GetNanoTimeStamp()不会返回新值。

在我玩过的 java 方面.invalidate(),使用过.loadUrl().loadData()在 C++ 部分,我检查了每个方法调用,看看是否所有的东西都被调用了。我在这段代码上花了很多时间,以至于我什至不记得我尝试过的所有组合。

这有什么问题?我确定我在这里遗漏了一个基本点。

大部分代码在这里https://gist.github.com/jrmgx/019cba403769dda27a6d42e48c461b1b

PS:对我好一点,已经一周了,这是我第一次使用 Unity、C++、JNI 和 C#

先感谢您

4

0 回答 0