Unity中的Daydream开发与实例

本文将由Unity大中华区技术经理马瑞,为大家分享在Unity中进行Daydream平台的开发与实例。

2016年9月,我们发布了原生支持Daydream平台的Unity技术预览版。本文将帮助您了解开发Daydream应用所需的设备和软件并介绍安装过程,以便您可以立即开始创建Daydream平台的游戏,最后提供几个优秀的案例,为您带来更好的游戏设计思路。

入门

创建Daydream游戏之前,我们需要做开发前的软硬件准备,包括Daydream设备和Unity的Google VR技术预览版。

Daydream设备

Daydream设备包括一个Daydream
View头盔、控制器和支持Daydream的手机。真机测试游戏需要以上所有设备。如果您仅希望在Unity编辑器的运行模式下测试游戏,则任何类型的Android手机均可。我们会在下文关于编辑器中的VR模拟器一节中继续讨论这个问题。

Daydream View套装包括虚拟现实头盔和控制器。该套装可在线购买。Cardboard和Daydream的最大区别是:Daydream
头盔由布料制造,质量更好,并配备了NFC芯片。

支持Daydream的手机

目前有五类手机可用:

Pixel (Pixel, Pixel XL)

Moto Z (Moto Z, Moto Z Droid, Moto Z Force Droid)

支持Daydream的手机正在不断增加。有关详细信息,您可以查看Google官方网站。如果您没有此列表中的任何手机,也可以使用Daydream开发套件与Nexus
6P手机,但Nexus 6P的散热性能不及支持Daydream的手机。

Unity的Google VR技术预览版

创建Daydream的Build需要使用Unity的Google VR技术预览版。您可以在Unity官网下载,OS
X和Windows版本都有。它包含基于Unity 5.4.2版本的自定义编辑器和Android Player。

Google VR SDK

Google VR SDK是开发Daydream所必需的。SDK提供原生集成的Google VR,还包含一些其它功能,详情见下文。

SDK内容

原生集成的功能:

头部跟踪

并排立体渲染

检测用户与系统的交互

针对特定头戴设备的自动立体渲染配置

VR头盔镜头的失真校正

对齐标记 - 当您将手机插入到头盔中时,帮助您将手机屏幕与镜头对齐

自动陀螺仪运动检测

附加功能:

Daydream控制器支持

空间音频渲染

一个简单取景器(reticle)预制件和基于凝视的用户交互相关脚本

在Unity编辑器的运行模式下进行VR模拟,您可以使用鼠标和Alt / Ctrl键平移或旋转VR摄像头

“Headset Demo”场景 - 演示一个简单的Cardboard游戏

“Controller Demo”场景 - 演示与Daydream控制器的集成

显示FPS的预制件

安装指南

下载GoogleVR SDK以及支持Daydream的Unity预览版。打开Unity,建立一个新的3D项目,然后将SDK导入项目。

在Player Settings下的Android选项卡下,单击”Virtual Reality
Support”并选择Daydream平台。在Minimum API Level选择Android 7.0 Nougat或更新的版本。

经过以上的步骤,您的Daydream开发环境基本就搭建完毕了。

两个演示场景

  1. 控制器演示:ControllerDemo.asset

本场景展示了Daydream控制器的简单使用。 在Unity编辑器中,您可以使用Android手机与控制器仿真来模拟Daydream控制器。

  1. 头盔演示:DemoScene.asset

本场景展示了简单的Cardboard或Daydream头盔行为。可以通过按下“Alt”键并移动鼠标在Unity编辑器中移动摄像机,
您也可以通过按下“Ctrl”键并移动鼠标来旋转摄像机。

控制器

Cardboad和Daydream的主要区别是Daydream有一个控制器,控制器使用户体验更类似于HTC Vive或者Oculus Rift。

_ _

仿真的控制器

控制器由三个区域组成:

TouchPad - 检测触摸区域上是否有手指,并检查手指的位置。 TouchPad也可以点击。

App按钮 - TouchPad下方的按钮。

Home按钮 - 为Android系统保留的按钮。

可以通过场景中的GvrController类来获得有关控制器的输入和状态的信息。此类通过访问此单例的静态属性来提供连接状态、方向、陀螺仪读数、加速度、触摸板和按钮状态。

编辑器中的VR模拟器

因为Daydream平台是最近才发布的,所以您可能无法及时获得必需的硬件,在Unity编辑器的运行模式下测试游戏也是个不错的选择。在这种情况下,VR模拟器非常有用。谷歌提供一个APP,可以安装在所有类型的Android手机,它会模仿真实的Daydream控制器的行为。

使用控制器仿真可能有一点不便,就是不能触摸真的控制器。谷歌提供了解决方案: 可以下载并打印一个屏幕覆盖层,包括letter,
A4和SVG三种格式。打印好后将相应按键的位置挖洞,并放在手机上面,就可以获得更真实的体验。

开发实例

最好的学习方法就是查看示例。 Google VR的GitHub代码库包含4个非常有用的示例,可帮助您全面了解如何使用新的Google VR:

Daydream Labs Controller Playground

这是一个结合了15个小游戏的大合集,该项目供了许多不错的例子,告诉用户如何充分利用控制器与VR头盔。介绍一些VR游戏中控制器常用的使用方法。

源码下载地址:

https://github.com/googlevr/gvr-unity-
sdk/tree/master/Samples/DaydreamLabsControllerPlayground

Cardboard Design Lab

如果您是VR初学者,那么可以从该示例开始。 在整个项目中,您将学习从设计VR的基础到创建沉浸式环境等VR设计相关内容。

源码下载地址:

https://github.com/googlevr/gvr-unity-
sdk/tree/master/Samples/CardboardDesignLab

Castle Defense

这是一个简单的VR手游示例。

源码下载地址:

https://github.com/googlevr/gvr-unity-sdk/tree/master/Samples/CastleDefense

Spatial Audio

这个项目将帮助您了解在VR项目中实现真实音频效果的最佳做法。它用到了Google VR的音频渲染功能。

源码下载地址:

https://github.com/googlevr/gvr-unity-sdk/tree/master/Samples/CastleDefense

Unity层级细节(LOD)的使用

层次细节(LOD),它是根据物体在游戏画面中所占视图的百分比来调用不同复杂度的模型的。简单而言,就是当一个物体距离摄像机比较远的时候使用低模,当物体距离摄像机比较近的时候使用高模。这是一种优化游戏渲染效率的常用方法,缺点是占用大量内存。使用这个技术,一般是在解决运行时流畅度的问题,采用的是空间换时间的方式。

下面我们分步骤来构造一个最简单的LOD模型示例:

步骤1:准备3组模型,高精度模型,中精度模型,和低精度模型,并按照复杂程度自高向低的为模型命名,如“模型名称LODO0”、“模型名称LOD1”等,最后的数字序号越低,表示复杂程度越高。如图所示:

步骤2:定义一个空对象,添加LODGroup组件,如图所示:

步骤三:分别将刚刚准备好的三种不同精度的模型,拖拽到空对象的LODGroup组件的各个级别上。首先给LOD组件的“LOD 0”(LOD 0
表示摄像机最近距离显示)添加对应的模型。(LOD 0 对应高精度模型,然后拖拽到Add上面即可)如图所示:

步骤四:在LOD组件添加模型的过程中会弹出如图所示的提示信息,表明要把添加的模型作为LODGroup组件所属对象的子物体,单击”Yes,Reparent”按钮即可。

步骤五:为使构造的LOD游戏对象显示得更加自然,需要把LOD下的三个子物体进行”对齐“处理。(将其相对于父物体的坐标置为0)如图所示:

步骤六:在Scenes视图中,拖动摄像机分别近距离与远距离观察模型的变化。

注:Project Settings中与LOD组件相关参数

LOD Bias和Maximum LOD Level

- 执行unity编辑器菜单:Edit > Project Settings > Quality,会打开Quality Setting窗口
,找到Other下的参数,如图所示:

Maximum LOD
Level:是最大LOD级别,表示游戏中使用的最高LOD级别。在该级别以上的模型不会被使用,并且在编译时忽略。(这将节省存储空间和内存空间)。

Bias LOD:LOD偏离
,LOD级别基于物体在屏幕上的大小。当物体大小在两个LOD级别之间,可以选择使用低细节模型或高细节模型。数值取值范围为0-1,数值越接近0,越偏向于选择低细节模型。大白话描述即是:如果该值小那么,摄像机离物体距离稍微有些变化,不同细节物体即会切换,该值大,那么摄像机需要与物体有很大的距离才会切换。

Unity基础

第三方插件及使用

BestHttp : 功能主要有连接池 缓存 超时 代理 重定向 gzip 大文件上传下载 断点续传 socket
已经封装了一个类HttpUtils

文档[https://docs.google.com/document/d/181l8SggPrVF1qRoPMEwobN_1Fn7NXOu-
VtfjE6wvokg/edit?pref=2&pli=1#](https://docs.google.com/document/d
/181l8SggPrVF1qRoPMEwobN_1Fn7NXOu-VtfjE6wvokg/edit?pref=2&pli=1)

pro版提供源码https://www.assetstore.unity3d.com/en/#!/content/10872

1.9.8版本下载<http://www.seedpeer.eu/details/10707104/Unity-Asset---Best-HTTP-Pro-
Edition-v1.9.8%5BAKD%5D%5BCTRC%5D.html>

LitJson : 支持ORM对象关系映射 对象和json互转 和gson一样 官网http://lbv.github.io/litjson/

PoolManager : 对象缓存池
用法参考http://blog.csdn.net/henren555/article/details/42100881http://www.xuanyusong.com/archives/2974

工程文件的作用

Assembly-CSharp-vs.csproj 和 Assembly-CSharp.csproj :Visual Studio(带有-
vs后缀)和MonoDevelop为C#脚本生成的项目文件。

Assembly-UnityScript-vs.unityproj 和 Assembly-
UnityScript.unityproj:相同的项目文件,只不过是为JavaScript脚本。

testproject.sln 和 testproject-
csharp.sln:IDE的解决方案文件,第一个包括所有的C#、JavaScript和Boo脚本;而第二个只包括C#脚本,被设计用来在Visual
Studio中打开,因为VS不知道如何处理JavaScript和Boo项目。

testproject.userprefs 和 testproject-
csharp.userprefs:MonoDevelop用来存储当前打开文件、断点、观测等的配置文件。

Assets:存储所有游戏资源的文件夹,包括脚本、纹理、声音、编辑器定制等。当然是项目中最重要的文件夹。

ProjectSettings:在这个文件夹中Unity存储所有的项目设置,如物理、标签、角色设置等。或者说,所有你从 Edit → Project
的菜单中设置的都在这个文件夹中。

Library:被导入资源的本地缓存,当使用外部版本控制系统时应当被完全忽略。

obj 和 Temp:存储构建时产生的临时文件的文件夹,第一个用于MonoDevelop,第二个用于Unity。

看完了以上的内容就可以知道,我们只需要将Assets和ProjectSettings两个文件夹纳入版本控制即可。但在编写.gitignore文件前,还需要以下几个步骤,将设置以文本形式存储以利于版本控制:

在 Edit->Project Settings->Editor->Version Control Mode 中选择 Visible Meta files。

表示以meta文件来记录资源版本。 默认为Disabled,这样在无Library目录情况下会出现各种问题(后面会讲到Library不会提到版本库)。

在 Edit->Project Settings->Editor->Asset Serialization Mode 中选择 Force Text。

表示以纯文本形式保存unity文件。 Mixed和Force Binary都是二进制,不利于版本管理。

将Assets、ProjectSettings目录传到SVN、GIT或其它版本库

别人CheckOut这两目录后,第一次在Unity Editor中Open
Project…后会自动生成Library目录,所以Library无需纳入版本管理

特殊文件夹及作用

http://www.xuanyusong.com/archives/3229

渲染顺序和层级关系

http://blog.csdn.net/kingsea168/article/details/50252733

1.Unity3d中的渲染顺序如下:

不同的Camera的Depth

相同Camera下的不同SortingLayer

相同SortingLayer下的不同Z轴/Order in Layer

2.改变控件之间的层级关系

(1)同一canvas下:

改变控件transform的SiblingIndex,

1
2
3
transform.GetSiblingIndex();

transform.SetSiblingIndex(int index); //index值越大,越后渲染,层级越大,越显示在前面

(2)不同Canvas下:

设置Canvas下的Sort Order //Sort Order值越大,越后渲染,层级越大,越显示在前面

属性面板定制化

http://blog.sina.com.cn/s/blog_5b6cb9500101857b.html

http://www.360doc.com/content/15/1205/14/25502502_518083734.shtml

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×