本文用Unity的Daydream Preview GVR13版本开发同时兼容Daydream和Cardboard的Android应用,Android Studio版本为2.2.3。

  1. 下载最新Daydream Preview(版本:Unity Daydream Preview 5.4.2f2-GVR13 (64-bit))并安装。
  2. 下载最新的Google VR SDK for Unity,新建一个Unity项目,并将GoogleVRForUnity.unitypackage导入到项目里面。
  3. 在File -> Build Settings里面,Switch Platform为Android。
  4. 在Player Settings...里面,Android面板下,Other Settings里面,勾选Virtual Reality Supported,删掉Split Stereo Display(non head-mounted),如果有的话,并添加Cardboard和Daydream,而且Daydream必须在Cardboard之上,否则就会出现"Incompatible app

    This Cardboard application is not compatible with Daydream headsets."的错误。Minimum API Level选API level 19(Cardboard最低支持API level 19,Daydream最低支持API level 24)。

  5. GVR的VRModeEnabled在GVR13中被强制变成true,无法直接修改为false,只能通过UnityEngine.VR.VRSettings.enabled来切换VR模式,而在非VR模式下,则屏幕静止不动。
    VRModeEnabled
    
    Determine whether the scene renders in stereo or mono. 
    
    Supported only for versions of Unity without the GVR integration. VRModeEnabled will be a no-op for versions of Unity with the GVR integration. True means to render in stereo, and false means to render in mono. 
  6. 监听Daydream左上角的返回键,可参考GoogleVR Demos里面的Teleport.cs脚本:
       void LateUpdate() {
    GvrViewer.Instance.UpdateState();
    if (GvrViewer.Instance.BackButtonPressed) {
    // TODO do what you wanna do here
    }
    }

    写一个脚本,挂在场景里的某个GameObject上,并在LateUpdate()里面做逻辑处理。

  7. 可以直接拿GoogleVR Demos里面的GVRDemo场景中的DemoInputManager,GvrViewerMain,GvrControllerMain以及Player,直接添加到自己的场景中,则可以实现Daydream手机上Daydream Controller可见,而在Cardboard模式下(非Daydream手机运行时),则显示成视选圈。
  8. 事件监听,需要在EventSystem上添加GvrPointerInputModule,并确保GvrViewerMain上面挂有GvrPointerManager。如果是和3D GameObject交互,则确保Main Camera上挂GvrPointerPhysicsRaycaster脚本;如果是和UGUI交互,则需要确保Canvas的Render Mode是World Space,并挂上GvrPointerGraphicRaycaster脚本,以及UI上的Raycast Target勾选上。最后在UI上挂上实现IGvrGazeResponder接口的脚本,实现事件监听并处理相应的逻辑。
  9. 从Android应用的原生Activity调用UnityPlayerActivity启动Unity场景之后,调用UnityPlayer.UnitySendMessage()方法往Unity发送数据时,发现Unity场景在Daydream提示将手机放入Daydream头盔的动画过后,并没有收到数据。原因是在播放Daydream动画的时候还未加载Unity的第一个场景,在这个时机发送数据接收对象还不存在。解决的办法就是,在Unity场景启动之后,再发送一条请求,请求UnityPlayerActivity再发一次数据给Unity。

本文为原创,如果转载请注明出处

最新文章

  1. ROW_NUMBER over (order by **)
  2. DOM_01之树及遍历
  3. 快速入门系列--WCF--05事务
  4. reason: '*** Collection <__NSCFArray: 0x7ffa43528f70> was mutated while being enumerated.'
  5. linux 命令案例学习——文件搜索
  6. 1089-Duplicate Removal
  7. 决策树简单介绍(二) Accord.Net中决策树的实现和使用
  8. gridview获取当前行索引的方法
  9. android jni——helloworld
  10. 使用Git 本地代码提交到 GitHub
  11. Python编程核心内容之一——Function(函数)
  12. 【C#】使用bat文件安装卸载Window服务
  13. 任意输入一串字符串,求该字符串中字符的出现次数并打印出来,如输入“bcaba”输出:b 2 c 1 a 2
  14. 导航+左侧菜单+tab切换模板
  15. 好玩的Raft动画演示,原理秒懂
  16. Kali Linux渗透测试实战 2.1 DNS信息收集
  17. maven更换源
  18. C++的命名空间的使用
  19. BZOJ.2521.[SHOI2010]最小生成树(最小割ISAP/Dinic)
  20. asp.net 局域网中获取 client的机器名

热门文章

  1. Claris and XOR(模拟)
  2. Android网络开发之Volley--Volley基本用法ImageRequest(三)
  3. 我的git常用命令
  4. -linux删除大量文件----rm,rsync
  5. javascript技巧大全套
  6. Spring ---annotation (重点)--Resource, Component 重要!!!
  7. STM32 的加密实现(转)
  8. [Unity Socket]在Unity中如何实现异步Socket通信技术
  9. LPC1788的内部EEPROM使用
  10. python web开发基本概念