首页 > 解决方案 > 如何在 Three.js 场景中包含 OVRManager?

问题描述

我已经创建了几个 Three.js/Javascript 演示应用程序,我正在我的新 Oculus Go 中进行试验。我正在尝试让 Go 控制器在我的应用程序中执行某些操作,根据 Oculus 开发人员中心的说法,最好的办法是将 OVRManager 包含在我的场景中,这样我就可以访问该 API。听起来不错,但是对于所有文档(https://developer.oculus.com/documentation/unity/latest/concepts/unity-ovrinput/),我看不到如何将 OVRManager 添加到我的场景中!我以前没有使用过 Unity,但从我在文档中可以看出,不应该有任何兼容性问题(应该有吗?)

所以我想做的是:

<script src="OVRManager.js or something like that"></script>

然后调用我需要的函数,就像我对 OrbitControls.js 和其他外部依赖项所做的那样。

但对我来说,谷歌搜索只是让我绕圈子。我看到针对 C++ 和 C# 提出的问题,但这对我没有用。如何让这个 API 在我的 Three.js 场景中工作?我在哪里可以找到它,还有其他方法可以包含它吗?

谢谢!

标签: javascriptunity3dthree.jsvirtual-realityoculusgo

解决方案


创建统一的 WebGL 构建并将所需的 API 公开为附加到游戏对象的统一脚本中的公共方法。

然后,您应该能够按照如何从 javascript 调用 Unity 函数(复制如下)中的说明来了解如何从您的 javascript 代码中调用这些方法。

如果您使用旧版本的 Unity,您可能可以使用与 JavaScript 有点相似的 UnityScript 来编写脚本。在撰写本文时,Oculus推荐2017.4.11f1 版本,我认为它可能仍支持 UnityScript。

您看到的 UnityScript 信息如此之少的一个主要原因是 Unity 已经从 UnityScript 转移到仅支持 C#。

但无论您是用 C# 还是 UnityScript 编写 OVRManager 脚本,Unity 都会使这些方法可以从您的 JavaScript 中调用。

从 JavaScript 调用 Unity 脚本函数

有时您需要从浏览器的 JavaScript 向 Unity 脚本发送一些数据或通知。推荐的方法是GameObject在您的内容中调用 s 上的方法。如果您从嵌入在项目中的 JavaScript 插件进行调用,则可以使用以下代码:

SendMessage(objectName, methodName, value);

objectName场景中对象的名称在哪里;methodName是脚本中方法的名称,当前附加到该对象;value 可以是字符串、数字,也可以为空。例如:

SendMessage('MyGameObject', 'MyFunction');
SendMessage('MyGameObject', 'MyFunction', 5);

SendMessage('MyGameObject', 'MyFunction', 'MyString');

如果您想从嵌入页面的全局范围进行调用,请参阅下面的代码可见性部分。

代码可见性

从 Unity 5.6 开始,所有构建代码都在其自己的范围内执行。这种方法可以将您的游戏嵌入到任意页面上,而不会与嵌入页面代码发生冲突,并且可以在同一页面上嵌入多个构建。

如果您的项目中有所有 .jslib 插件形式的 JavaScript 代码,那么此 JavaScript 代码将在与编译的构建相同的范围内运行,并且您的代码应该与以前版本的 Unity 中的工作方式几乎相同(对于例如,以下对象和函数应该可以直接从 JavaScript 插件代码中看到:Module、SendMessage、HEAP8、ccall 等)。

但是,如果您计划从嵌入页面的全局范围调用内部 JavaScript 函数,则应始终假定页面上嵌入了多个构建,因此您应明确指定要引用的构建。例如,如果您的游戏已被实例化为:

var gameInstance = UnityLoader.instantiate("gameContainer", "Build/build.json", {onProgress: UnityProgress});

然后您可以使用 gameInstance.SendMessage() 向构建发送消息,或使用 gameInstance.Module 访问构建模块对象。


推荐阅读