javascript - 如何在 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 场景中工作?我在哪里可以找到它,还有其他方法可以包含它吗?
谢谢!
解决方案
创建统一的 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 访问构建模块对象。
推荐阅读
- node.js - 如何将文件从 angular7 上传到 Node.js 服务器
- c# - ConnectionString 与 DataDirectory (c#, sqlserver)
- r - 如何使用 data.table 选择一行及其下一行和上一行
- c# - Visual Studio 2019 for Mac:还原或添加 Nuget 包时出错
- python - tkinter:当它通过 for 循环时不改变标签值,它只显示结束值
- javascript - 从数组中返回最新日期
- flutter - Flutter TextField 只输入十进制数字
- python - 如何在另一个while循环中使用if else语句
- python - 在 python 3.7 中评估数学字符串
- python - 使用数学模块将二进制数转换为十进制数