我已经花了一个星期的时间,但我不是专家,所以我可能会错过一些东西,甚至想做一些不可能的事情。
我有一个Unity项目(使用Daydream VR),我的目标是让一个WebView在VR模式下处理3D表面(作为纹理)(适用于Android) 我知道这听起来很复杂,我打赌它是。
这是我到目前为止的地方:
首先,我开始使用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(但我不确定它是否正确)
see => JrmgxWebView.java
步骤2 /
我编译了oculus插件,稍作修改
see => *.cpp
步骤3 /
我调整了将Android插件和oculus插件连接起来的Unity脚本,将其添加到3D立方体上的简单Daydream场景中(与脚本相关联)
see => 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#提前谢谢