unity3d vr项目传送是怎么的效果

虚拟现实来了!不仅更容易吸引玩家和用户,它所具备的深度沉浸感,同样能在教育、医疗、设计、通讯等行业应用,它所提供的逼真视角和体验,是过去任何一种媒介所无法实现的。虚拟现实是一个新媒介,需要强大实用的开发工具做承载,目前国内开发人员常用的内容开发工具是Unity3D,本课程中,我们就将为大家讲解Unity3D特效的入门。我将从这门课中学到什么?·&如何把你的设计界面从某个设备延伸到整个世界·&如何打破二维的平面,扩展到曲面和三维空间·&如何脱离鼠标与屏幕,进行身体动作与界面的交互这门课有什么独家优势?·&从零开始,教你成为一名优秀的Unity3d特效设计师·&你不再需要对着电脑屏幕,而可以以任何姿势做设计谁适合学习这门课?·&Unity3D特效初学者·&设计师·&工程师课程精彩内容节选▼虚拟现实的发展会给我们带来怎样的脑洞:
请选择打赏金额
打赏完成之后关闭弹窗即可
多年设计从业经验,网易/腾讯课堂 、cgjoy、cgwell、翼虎网、直线网等合作讲师
虚拟现实(Virtual Reality,简称VR)是利用电脑模拟产生一个三维空间的虚拟世界,提供使用者关于视觉、听觉、触觉等感官的模拟,让使用者如同身历其境一般,可以及时、没有限制地观察三度空间内的事物。2014年Facebook以20亿美元收购了Oculus,引燃VR热潮,已经在2016年初推出第一代面向大众的商用虚拟现实头戴式眼镜Oculus Rift。Sony在3D头盔就是行业领先者,预计将于16年上半年推出PlayStation VR,与PS4搭配使用,目前已经有近20款游戏届时将同时发售。而近期,三星和Facebook联合推出了一款全新的Gear VR虚拟现实头盔,用户通过Micro USB接口将智能手机连接到头盔上,观看视频时就可以实现穿越时空,身临其境。同样,美国谷歌公司也推出了一款适用于安卓设备的简易版虚拟现实头盔——谷歌纸板。这里将集合VR的各类知识、技能,让VR不再陌生。
使用优惠券或优惠码
此优惠码无效
用微信或支付宝扫二维码支付
秒钟后自动关闭窗口。如未自动关闭,请手动刷新。用Unity3D创建简单场景漫游(图)
日&&&&评论:&&&
&&& 来源:&&& 作者:未知
&&& 1.建模中使用的图片、文件、文件夹等以及模型中物体、材质等的名称都不能使用中文或者特殊符号,可以使用英文字母、数字、下划线等
&&& 2.调整Max的单位为米
&&& 3.烘培光影的设置
&&& 4.模型的中的植物效果,第一种是单面片植物,需要设置其轴心为其物体的对称中心;第二种是十字交叉的植物效果;第三种则是到3D编辑器中通过地形编辑器系统添加
&&& 基本设置
&&& 5.Fbx导出插件下载地址:
&&& 6.将Max文件中用到的图片都拷贝到Textures目录下,如
&&&& 7.再打开Max文件,导出为FBX文件,使用默认设置,FBX文件也放置在和Max文件相同的目录下,如
&&& 导出的时候,可以将模型简单的分类,如地面、植被、楼房等,也可以将模型分为几个区域,如小区1,小区2,学校等等分开导出
&&& 8.将包含Max文件、Fbx文件和Textures文件夹的文件夹拷贝到3D项目的Assets目录下,如下图中红圈
&&& 在下一次用3D编辑器开启本项目的时候,编辑器将自动导入/更新该文件夹中的信息,并生成Materials文件夹,如
&&& 9.启动3D编辑器
&&& 10.选择刚才拷贝进来的文件中的Fbx文件,如
&&& 修改其中的Meshes下的Scale Factor和Generate Colliders,如
&&& 点击其他Fbx文件或者单击其他区域将弹出如下的对话框
&&& 点击Apply即可,类似的方式设置其他Fbx文件
&&& 注意,其中植物/植被类的Fbx文件不需要设置Generate Colliders项
&&& 11.将Fbx文件直接拖放到Hierarchy区域,如
&&& 12.点击Hierarchy区域中的对象,同时将鼠标移动三维显示区域,同时点击键f,则该对象自动适配显示到三维区域中心,如
&&& 13.将全部fbx添加完成后,提高场景亮度如下
&&& 单击Ambient Light,如下&
&&& 调整为
&&& 即可设置完成
&&& 14.设置第一人称浏览
&&& 删除场景中Main Camera
&&& 将Project区域的Standard Assets下的Prefabs下的First Person Controller拖到Hierarchy区域中
&&& 点选First Person Controller,调整First Person Controller的位置到场景中合适的位置,并设置其高度为1.37到2.1左右
&&&& 设置First Person Controller的高度在场景中地面之上
&&& 15.点击运行,即可测试
&&& 修改视角控制键为右键
&&& 16.打开Project区域中的StandardAssets下的CameraScripts下的MouseLook脚本,在
&&& 在Quaternion originalR
&&& void Update ()
&&& {&&& if (axes == RotationAxes.MouseXAndY)
&&& // Read the mouse input axis
&&& 中添加一行代码修改为
&&& Quaternion originalR
&&& void Update ()
&&& if(Input.GetAxis ("Fire2")==0)
&&& if (axes == RotationAxes.MouseXAndY)
&&& // Read the mouse input axis
&&& 如何取消浏览窗口上的右键菜单
&&& 只要设置对象的参数即可禁止右键菜单的显示,如下:
&&& &object id="Object" classid="clsid:-DE89-A-D46C3A781394"
&&& width="600" height="450"codebase="http://webplayer.unity3d.com/download_webplayer/WebPlayer.cab#version=2,0,0,0"&
&&& &param name="src" value="MyDataFile.unity3d" /&
&&& &param name="disableContextMenu" value="true" /&
&&& &embed id="Embed" src="MyDataFile.unity3d" width="600" height="450"& type="application/vnd.unity" pluginspage=""& disableContextMenu="true" /&
&&& &/object&
&&& 植物效果设置
&&& 17.对于单面片的植物效果,需要设定其材质为Transparent/VertexLit类型,并为其添加公告板脚本
&&& 设定前
&&& 设置材质类型为Transparent/VertexLit类型,如下
&&& 给单面片植物添加公告板脚本的方法是先选择该植物,然后点击菜单component下的scripts下的camera Facing Billboard即可,如下
&&& 设置材质类型和添加公告板脚本后,如下&
&&& 如果没有该脚本组件,可以打开脚本编辑器,拷贝如下代码到脚本中,保存到Assets\Scripts下,命名为CameraFacingBillboard.cs即可
&&& using E
&&&& using System.C& &&&& public class CameraFacingBillboard : MonoBehaviour&&&& {&&&&&&& public Camera cameraToLookAt;&&&& void Start()&&&& {&&&& cameraToLookAt = Camera.&&&& }& &&& void Update() &&&&&&& {&&&&&&& Vector3 v = cameraToLookAt.transform.position - transform.&&&&&&& v.x = v.z = 0.0f;&&&&&&& transform.LookAt(cameraToLookAt.transform.position - v); &&&&&&& }&&&& }
&&& 18.对于十字交叉的植物,需要将其材质设定为Nature/Vegetation Two Pass unlit类型
&&& 设置前的效果
&&& 设置后的效果&
&&& 水面效果的设置
&&& 19.创建一个网格面片&
&&& 20.给该水面面片设置水材质和水脚本,如
&&& 烘培光影贴图的处理
&&& 21.3D光影烘培的要求
&&& U3D的光影贴图使用的是3Dmax中的标准材质的自发光贴图通道来存储光影贴图相关参数,如
&&& 22.给每个物体都附上贴图,如果是纯色物体,也付给纯色贴图
&&& 23.打光后,选择要烘培的物体
&&& 设置输出路径
&&& 添加烘培输出的贴图类型
&&& 添加“LightingMap”类型
&&& 设置烘培贴图大小和目标贴图位置为“自发光”&
&&& 设置烘培材质,选择“输出到源”&
&&& 点击“渲染”即可
&&& 24.标准材质贴图的烘培光影处理
&&& a)物体据有标准材质&
&&& b)烘培渲染后,物体具有两个贴图
&&& c)导出Fbx即可
&&& 25.多重子材质贴图的烘培光影处理
&&& a)物体据有多重子材质贴图&
&&& b)渲染烘培后每个子材质都据有两个贴图&
&&& c)选择该物体,执行“多维材质2标准材质.ms”脚本,将该多维材质物体按其材质数量分解为标准材质的多个物体,新物体的名字以“原多维材质物体名字~其材质名称”命名,如&
&&& 点击“开始转换”,则将该物体从多维材质物体按期子材质分解为多个具有标准材质的物体&
&&& d)将全部的具有多维材质类型的物体分解完成后,即可导出
&&& 26.多个物体使用同一贴图的烘培光影处理
&&& 因为我们在导入fbx文件到3D编辑器中的时候,使用的都是按贴图来生成材质文件,所以多个物体使用同一贴图时会发生错误,修改其中任何一个的材质设置时,其他的使用该贴图的物体都会受到影响,解决的方法便是在3D编辑器中生成一个具有该贴图的新材质,然后重新付给当前物体。
&&& 27.在U3D编辑器中修改物体的材质类型为光影贴图
&&& 设置物体的材质类型为Lightmapped/Diffuse&
&&& 根据物体的名称将对应的光影贴图拖动到Lightmapp域,其中标准材质物体的光影贴图名称是“其物体名称LightingMap.tga”;从多维材质类型转换过来的物体的光影贴图名称是“其物体名称中~符合前的部分LightingMap.tga”
标签:,上一篇:下一篇:
网友评论:用Unity3D创建简单场景漫游(图)评论条
您可能还需要关注一下内容:··········
商家:商家:商家:商家:商家:商家:商家:商家:
北京第三维度科技有限公司 版权所有
Beijing The third dimension Inc. All Rights Reserved.
Tel:010-&Mob:(24小时)
Email:& QQ:Steam VR Unity VRTK Examples 1 简单指针与传送 - 简书
Steam VR Unity VRTK Examples 1 简单指针与传送
VRTK是个很好用的使用Unity开发Steam VR的工具集,感谢开发者团队在其中做了很多非常棒的工作。其对插件中的Scripts、Prefabs都做了很详细的介绍。对于插件中的所有例子,官方还做了视频放在了Youtube上。美中不足的是,对每个示例场景的分析不是很详细,这里对每个示例场景做一个比较详细的剖析,一遍掌握其中的用法。先做一下搬运工,以官方文档的内容开头:欢迎来到VRTK这个工具包提供了很多在Unity3d做VR开发中通用的VR功能,主要包括:具有别名的控制器按钮事件控制世界指针(激光指针)玩家瞬间转移使用控制器抓起/握住物体使用控制器与物体交互把游戏物体变成交互式的UI元素这里有什么这个工具集主要分成三个部分:Prefabs - VRTK/Prefabs/Scripts - VRTK/Scripts/Examples - VRTK/Examples/所有相关的文件都存放在VRTK这个文件夹里面,这个文件夹可以拷贝到现有工程中。Examples文件夹包含了该工具集中的示例场景。从这里开始克隆这个代码库 git clone使用Unity3d打开SteamVR_Unity_Toolkit从Unity Asset Store下载并导入SteamVR插件浏览Examples中的场景可以查看脚本的示例用法示例分析Examples文件夹包含了所有的示例场景,用来说明脚本和prefab的用法。该文件夹中还有一个/Resources/Scripts文件夹,其中包含了示例场景中实现特定功能使用的帮助脚本,例如事件监听器。这些脚本在实际项目中没必要用。下面开始进入主题:001_CameraRig_VR_PlayArea 相机配件与VR游戏区域这个简单的场景说明了[CameraRig]Prefab的用法。(官方解释到此为止)这个Prefab是SteamVR自带的,位于SteamVR文件夹下面的Prefabs中。建好场景之后,直接加到场景中,无需其他操作。运行程序之后,从头盔中就可以看到两个控制器手柄。无须赘述。[CameraRig]Prefab的结构如下图,很好理解,一个头盔,两个手柄,可以分出左右手。
CameraRig002_Controller_Events 控制器事件这个简单的场景展示了在控制台中输出控制器的事件。(官方解释到此为止)这个场景给控制手柄添加了VRTK_ControllerEvents脚本,如下图所示。
ControllerEvents下面详细的来看一下VRTK_ControllerEvents这个类的介绍。VRTK_ControllerEvents这个脚本处理了游戏控制器发出的事件。该脚本应该添加到[CameraRig]预制体下面的控制器对象上,并且对外提供了事件处理监听器。因为系统菜单按钮的行为是由Steam平台使用的,它不能被覆盖,所以不提供这个按钮的事件监听。当按下一个控制器上的按钮,这个脚本发出一个指示该按钮被按下的事件,允许其他脚本进行事件监听该事件,不用实现任何控制器逻辑。同样的,当释放一个按钮的时候,该脚本也会发出一个按钮被释放的事件。该脚本还为按钮定义了一个公共布尔型按钮按下状态,允许其他脚本来查询一个按钮是否被按住了。关于变量、事件的详细介绍,。VRTK_ControllerEvents_ListenerExample这个类示范了如何绑定事件输出事件参数等内容。003_Controller_SimplePointer 控制器简单指针该场景展示了,按下控制器上的触摸板(Touchpad),发射一道光束指向场景中的物体。控制台中显示了指针(pointer)事件。(官方解释到此为止)简单指针(SimplePointer)从控制器的顶端发出一道有颜色的光束,以此来模拟激光束。在场景中指向物体的时候非常有用,同时它也能确定它正指向的物体,以及物体和控制器之间的距离。按下控制器上的触摸板可以激活激光束。该脚本监听的事件是AliasPointer事件,可以改变VRTK_ControllerEvents脚本上的Pointer Toggle button参数来设置指针开关按钮。
SimplePointer该脚本能够添加到[CameraRig]Prefab下面的控制器对象上面,并且要求控制器对象同时具有VRTK_ControllerEvents脚本,因为它使用这个脚本监听控制器按钮事件,通过事件来开关激光束。该脚本也可以添加到其他对象上,比如[CameraRig]/Camera (head),从而允许其他物体投射光线。这种情况下,控制器这个参数赋值,它用于开关光束。具体的事件绑定和事件参数等用法,请参考VRTK_ControllerPointerEvents_ListenerExample这个脚本。其中事件参数DestinationMarkerEventArgs类中包含了丰富的内容。
DestinationMarkerEventArgs004_CameraRig_BasicTeleport 基本的传送功能该场景中有一些基本的几何体,用户可以按下控制器上触摸板,发出一条光束指向游戏世界中的一个物体。当用户松开触摸板的时候,用户就被传送(teleport)到了光束终点位置。(官方解释到此为止)该场景中在[CameraRig]预制体上添加了VRTK_BasicTeleport脚本。VRTK_BasicTeleport脚本实现了基本的传送功能,该脚本把[CameraRig]Prefab在游戏世界的x/z位置更新到了世界指针指向的位置,是在WorldPointerDestinationSet这个事件中设置。因为VRTK_BasicTeleport不会改变y方向的位置,所以它不能用于上下移动物体,只允许在一个平面上传送。VRTK_BasicTeleport脚本添加到[CameraRig]Prefab上,并且还要把WorldPointer脚本的一个具体实现添加到其他的物体上。比如,把VRTK_SimplePointer添加到控制器对象上。(之所以这样说,是因为WorldPointer是个抽象类,VRTK_SimplePointer和VRTK_BezierPointer是它的具体实现。)VRTK_BasicTeleport脚本还定义传送中和传送结束两个事件。除此之外,还有场景闪烁的速度等变量。具体的VRTK_BasicTeleport类的信息可以参考这里期待下一篇!参考:
VR项目研发主管
VR行业讲师
全国三维数字化创新设计大赛特邀评审专家
“福建省青年岗位能手”称号
海峡两岸信息服务创新大赛暨福建省计算机软件设计大赛优秀指导老师
指导作品获得多项荣誉:
全国3D大赛一等奖1项
全国3D大赛三等奖4项
全国移动通信大赛 三等奖2项
中国大学生服务外包创新大赛三等奖1项
海峡两岸信息服务创新大赛暨福建省计算机软件设计大赛一等奖3项,二等奖4项,三等奖5项
中国大学生挑战杯课外科技竞赛福建赛区二等奖1项 三等奖1项
福建省挑战杯大学生创业计划竞赛三等奖
福建省大学生智能设计大赛二等奖
福建省互联网+创新创业大赛铜奖
全国3D大赛福建赛区特等奖4项,一等奖8项,二等奖11项,三等奖5项
VRTK是个很好用的使用Unity开发Steam VR的工具集,感谢开发者团队在其中做了很多非常棒的工作。其官方文档对插件中的Scripts、Prefabs都做了很详细的介绍。对于插件中的所有例子,官方还做了视频放在了Youtube上。美中不足的是,对每个示例场景的分析不是...
This article is a record of my journey to learn Game Development and it will keep updating. 由于这篇文章的长度早已超出了简书编辑器的限制,因此后续内容将不在本文中更新,请移步本人的独...
(一)VRTK_ SimplePointer(直线简单激光指针) (二)VRTK_ControllerEvents(控制器事件) 当一个控制器按钮被按下,脚本发出一个事件表明按钮被按下了,这使得其他脚本去监听这个事件而不需要实现任何控制器逻辑。脚本也有一个公共的布尔类型的按...
005_Controller_BasicObjectGrabbing 基本物体抓取 这个场景展示了怎样实现高亮物体、抓取物体。首先使用控制器触碰物体,可以设置物体的是否高亮、高亮颜色等属性,然后按下Grip键,拿起物体。当松开Grip键的时候,物体沿着控制器的速度和方向被扔...
核心脚本和对象 在VR场景中,我们需要激活我们正在看着的物体,高亮或者交互。在VRSamples中主要包括三个脚本:VREyeRaycaster, VRInput, 以及VRInteractiveItem。 VREyeRaycaster VREyeRaycaster.png...
背景介绍 聊天机器人,我们应该很熟悉了,比如淘宝,京东的智能客服,背后就是基于聊天机器人来实现的。在湾区,很多科技公司都引入了智能机器人来帮助自己更好的工作和生活,我们可以看到在Slack上,有很多Bot,可以做各种各样的事情。那么,在本文,我们将详细介绍如何打造一个自动化...
投影仪是会议标配,没有人质疑。但是台喜X3S会议平板这款新品上线之后,淘汰投影仪竟成了不少大企业的共识,这又是因为什么呢?日新月异的科技发展,确实改变了我们的世界,当然也该表了企业的一些运行模式,其中就有会议。 看过去 投影仪称霸时代,代表了企业管理的停滞不前
耳边摇摇晃晃的节奏中,除了火车前行的声音,还有旁边旅客轻微的呼吸。终是不能入眠,不是因为归期近在眼前,而是突然生出的那种无奈与茫然。 高考毕业以后去异地上学,离家远了,骨子里对家的眷恋越发深刻。从开学就盼着放假,一天天的熬。但真正踏上归途的时候,又开始反问自己,我就这么回去...
小薇问我:“我最近总是跟男朋友吵架,情绪很不好,怎么控制自己的脾气?” 亭亭:“你首先要清楚你为什么要跟他吵架?” 小薇:“我不太清楚,脾气说上来就上来了。” 亭亭:“这个你必须细想一下,一定有原因的,比如:他工作不太细致,收入不高,或者对你不够体贴,又或者是他做事不是你喜...
实际上这只是一篇《秒速5厘米》的读后感。 这本小说的情感十分细腻,看完这本小说后我依然很懵懂,一时间不明白为何要取名叫“秒速五厘米”,上了知乎,搜到了一名知友的解释: “5cm/s*13年*365天*24小时*60分钟*60秒=2,049,840,000厘米=20,498....原文地址:
在开发中,我们经常需要激活一个用户正在盯着的物体。我们准备了一个示例,一个简单的可扩展的轻量级的系统,让用户和物体交互。这个系统由三个主要的脚本组成,VREyeRaycaster, VRInput, 和VRInteractiveItem - 下面有一些简短的说明和项目的源码。
VREyeRaycaster
这个脚本需要放在主摄像机上,每一次调用脚本的Update()向前发射一条射线, 调用来检测是不是击中了任何碰撞盒。这个功能可以设置为排除特定的,根据场景,可能需要把所有互动的物体移动到另一个层来做显示效果。
如果碰撞盒被射线集中,这个脚本会尝试在目标对象上查找VRInteractiveItem 控件:
[csharp]&&
VRInteractiveItem&interactible&=&hit.collider.GetComponent&VRInteractiveItem&();&&&&
通过这个我们可以知道用户是否正在看着某个物体,或者停止查看某个物体,如果用户开始查看或者停止查看某个物体,我们可以做一些响应,例如调用某个方法。
VRinput是个简单的类,它用来兼容动作发生的来源,是使用GearVR上触发的&swipes, taps, double-taps事件,还是使用DK2时,专为PC准备的输入事件。
可以在VRInput 中直接注册事件监听:
[csharp]&&
public&event&Action&SwipeDirection&&OnS&&&&&&&&&&&&&&&&
public&event&Action&OnC&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
public&event&Action&OnD&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
public&event&Action&OnUp;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
public&event&Action&OnDoubleC&&&&&&&&&&&&&&&&&&&&&&&&&&
public&event&Action&OnC&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
关于注册事件监听的更多信息,请查看我们的
VRInteractiveItem
任何想在VR中进行互动的物体都可以添加这个组件。需要物体上有碰撞盒。
这里有6个可以进行监听的事件:
[csharp]&&
public&event&Action&OnO&&&&&&&&&&&&&
public&event&Action&OnO&&&&&&&&&&&&&&
public&event&Action&OnC&&&&&&&&&&&&
public&event&Action&OnDoubleC&&&&&&
public&event&Action&OnUp;&&&&&&&&&&&&&&&
public&event&Action&OnD&&&&&&&&&&&&&
添加一个boolean变量,用来查看现在是不是在Over( 悬停)的状态:
[csharp]&&
public&bool&IsOver&&
&&&&get{&return&m_IsO&}&&&&&&&&&&&&&&
你可以创建自己的脚本来响应这些事件,这里有一个非常简单的例子,用到了这里的一些事件:
[csharp]&&
using&UnityE&&
using&VRStandardAssets.U&&
namespace&VRStandardAssets.Examples&&
&&&&public&class&ExampleInteractiveItem&:&MonoBehaviour&&
&&&&&&&&[SerializeField]&private&Material&m_NormalM&&&&&&&&&&&&&&&&&&
&&&&&&&&[SerializeField]&private&Material&m_OverM&&&&&&&&&&&&&&&&&&&&
&&&&&&&&[SerializeField]&private&Material&m_ClickedM&&&&&&&&&&&&&&&&&
&&&&&&&&[SerializeField]&private&Material&m_DoubleClickedM&&&&&&&&&&&
&&&&&&&&[SerializeField]&private&VRInteractiveItem&m_InteractiveI&&
&&&&&&&&[SerializeField]&private&Renderer&m_R&&
&&&&&&&&private&void&Awake&()&&
&&&&&&&&{&&
&&&&&&&&&&&&m_Renderer.material&=&m_NormalM&&
&&&&&&&&}&&
&&&&&&&&private&void&OnEnable()&&
&&&&&&&&{&&
&&&&&&&&&&&&m_InteractiveItem.OnOver&+=&HandleO&&
&&&&&&&&&&&&m_InteractiveItem.OnOut&+=&HandleO&&
&&&&&&&&&&&&m_InteractiveItem.OnClick&+=&HandleC&&
&&&&&&&&&&&&m_InteractiveItem.OnDoubleClick&+=&HandleDoubleC&&
&&&&&&&&}&&
&&&&&&&&private&void&OnDisable()&&
&&&&&&&&{&&
&&&&&&&&&&&&m_InteractiveItem.OnOver&-=&HandleO&&
&&&&&&&&&&&&m_InteractiveItem.OnOut&-=&HandleO&&
&&&&&&&&&&&&m_InteractiveItem.OnClick&-=&HandleC&&
&&&&&&&&&&&&m_InteractiveItem.OnDoubleClick&-=&HandleDoubleC&&
&&&&&&&&}&&
&&&&&&&&private&void&HandleOver()&&
&&&&&&&&{&&
&&&&&&&&&&&&Debug.Log("Show&over&state");&&
&&&&&&&&&&&&m_Renderer.material&=&m_OverM&&
&&&&&&&&}&&
&&&&&&&&private&void&HandleOut()&&
&&&&&&&&{&&
&&&&&&&&&&&&Debug.Log("Show&out&state");&&
&&&&&&&&&&&&m_Renderer.material&=&m_NormalM&&
&&&&&&&&}&&
&&&&&&&&private&void&HandleClick()&&
&&&&&&&&{&&
&&&&&&&&&&&&Debug.Log("Show&click&state");&&
&&&&&&&&&&&&m_Renderer.material&=&m_ClickedM&&
&&&&&&&&}&&
&&&&&&&&private&void&HandleDoubleClick()&&
&&&&&&&&{&&
&&&&&&&&&&&&Debug.Log("Show&double&click");&&
&&&&&&&&&&&&m_Renderer.material&=&m_DoubleClickedM&&
&&&&&&&&}&&
要查看这个基础的示例的话,可以看一下VRSampleScenes/Scenes/Examples/ 中的InteractiveItem&场景
SelectionRadial(环形选择区) 和 SelectionSlider(滑块选择区)
(用来确认选项)
我们用了一个圆形选择区,还有一个滑块选择区,玩家可以按住Fire1 来确认交互动作:
按住输入的按键, 选择条会填满, 然后发送OnSelectionComplete&(选择完成)或者&OnBarFilled(读条失败)事件。这部分代码在SelectionRadial.cs和SelectionSlider.cs 文件中并且有详细的注释。对于VR来说,站在用户体验角度考虑,用户知道他们在做什么而且能够随时把控整个各个方面。同时提供一个“held input (保持输入)”的确认模式,作为对立即响应事件的一些妥协。
VR示例场景中的一些互动示例
现在我们来研究一下VR示例项目中的一些例子。我们会讨论一下每个场景的互动效果和它们的实现方法。
在菜单场景中的互动
每个菜单画面都有几个组件。特别需要了解一下的是MenuButton,&VRInteractiveItem, 和Mesh Collider。
MenuButton 组件监听了来自 VRInteractiveItem 组件的 OnOver 和 OnOut 事件, 当准星悬停在菜单画面上的时候, 环形选择块就会出现, 当视线离开menu item(菜单选项)时, 这个环形选择块会消失。当选择圈可见的时候,按下Fire1 键, 这个环形会逐渐填满:
这个类也监听了OnSelectionComplete&事件, 当环形圈填满的时候,HandleSelectionComplete&方法会被调用,它会让显示器淡出然后读取所选择的关卡。
[csharp]&&
private&void&OnEnable&()&&
&&&&m_InteractiveItem.OnOver&+=&HandleO&&
&&&&m_InteractiveItem.OnOut&+=&HandleO&&
&&&&m_SelectionRadial.OnSelectionComplete&+=&HandleSelectionC&&
private&void&OnDisable&()&&
&&&&m_InteractiveItem.OnOver&-=&HandleO&&
&&&&m_InteractiveItem.OnOut&-=&HandleO&&
&&&&m_SelectionRadial.OnSelectionComplete&-=&HandleSelectionC&&
private&void&HandleOver()&&
&&&&m_SelectionRadial.Show();&&
&&&&m_GazeOver&=&&&
private&void&HandleOut()&&
&&&&m_SelectionRadial.Hide();&&
&&&&m_GazeOver&=&&&
private&void&HandleSelectionComplete()&&
&&&&if(m_GazeOver)&&
&&&&&&&&StartCoroutine&(ActivateButton());&&
private&IEnumerator&ActivateButton()&&
&&&&if&(m_CameraFade.IsFading)&&
&&&&&&&&yield&&&
&&&&if&(OnButtonSelected&!=&null)&&
&&&&&&&&OnButtonSelected(this);&&
&&&&yield&return&StartCoroutine(m_CameraFade.BeginFadeOut(true));&&
&&&&SceneManager.LoadScene(m_SceneToLoad,&LoadSceneMode.Single);&&
这里有一些关于Selection Radial的示例, 注意截图中央的粉色图形。
只有点状准星的:
空的选择确认圈, 因为现在正在看着menu 场景所以出现:
选择确认圈正在填充(用户正在看着菜单画面, 而且按住了 输入设备的 Fire1 键):
通过在研究示例项目中的进度条和环形试,着掌握这个模式。我们建议你在自己的VR项目上考虑一下这个方法,这样能保证用户体验的一致性,也能帮助他们适应这个新的设备。
Maze Scene 中的交互
迷宫游戏提供了一个桌游模式的交互,在这里你需要用开关(挡板)来引导角色必考炮塔,到达终点。
为角色选择目的地的时候,会出现一个目的地标记,路上会出现一条路线,让角色沿着轨迹前进。在触控板上滑动,或者按下方向键,或者用手柄左摇杆,可以旋转画面。
MazeFloor 对象 有一个MeshCollider&组件和一个VRInteractiveItem&组件, 让它能在VR中进行交互:
MazeCourse 物体 包含有MazeFloor 和MazeWalls ,包含着用作迷宫布局的几何体:
MazeCourse 物体添加了MazeTargetSetting脚本, 有一个VRInteractiveItem&的引用,指向MazeFloor物体上的VRInteractiveItem&组件:
MazeTargetSetting&监听了来自VRInteractiveItem 的&OnDoubleClick&事件, 然后它会发送OnTargetSet&事件。这个事件会把准星的Transform(空间坐标信息)当作变量一起传出:
[csharp]&&
public&event&Action&Transform&&OnTargetS&&&&&&&&&&&&&&&&&&&&&
private&void&OnEnable()&&
&&&&m_InteractiveItem.OnDoubleClick&+=&HandleDoubleC&&
private&void&OnDisable()&&
&&&&m_InteractiveItem.OnDoubleClick&-=&HandleDoubleC&&
private&void&HandleDoubleClick()&&
&&&&if&(m_Active&&&&OnTargetSet&!=&null)&&
&&&&&&&&OnTargetSet&(m_Reticle.ReticleTransform);&&
MazeCharacter 物体上的&Player&组件和&MazeDestinationMarkerGUI 物体上的&DestinationMarker&组件都监听了OnTargetSet这个事件,然后相应的做出了反应。
角色使用了(导航系统)在迷宫中寻路。Player 组件实现了HandleSetTarget方法,在方法中,把的目标点设置为准星的坐标, 然后更新它对玩家轨迹的渲染:
[csharp]&&
private&void&HandleSetTarget(Transform&target)&&
&&&&if&(m_IsGameOver)&&
&&&&&&&&&&
&&&&&&&&&&&&&&
&&&&m_AiCharacter.SetTarget(target.position);&&
&&&&m_AgentTrail.SetDestination();&&
DestinationMarker (目标点生成器)会把标记移动到准星Transform的位置:
[csharp]&&
private&void&HandleTargetSet(Transform&target)&&
&&&&Show();&&
&&&&transform.position&=&target.&&
&&&&m_MarkerMoveAudio.Play();&&
&&&&m_Animator.Play(m_HashMazeNavMarkerAnimState,&-1,&0.0f);&&
你可以看到准星,目的地制作器,玩家,和轨迹:
迷宫中的开关也是一个在VR中和物体互动的例子。使用了一个Collider(碰撞盒),像VRInteractiveItem 和SelectionSlider&这两个类一样。
像以上演示的和其他物体的互动,&SelectionSlider脚本监听了&VRInteractiveItem 和&VRInput&发出的事件:
[csharp]&&
private&void&OnEnable&()&&
&&&&m_VRInput.OnDown&+=&HandleD&&
&&&&m_VRInput.OnUp&+=&HandleUp;&&
&&&&m_InteractiveItem.OnOver&+=&HandleO&&
&&&&m_InteractiveItem.OnOut&+=&HandleO&&
Flayer 场景中的交互
飞行器场景是一个无限飞行的游戏,玩家需要控制飞船在场景中飞行,使用Fire1 进行射击, 射击小行星,穿过空中的门,都能增加分数。玩法类似飞行俱乐部和星际火狐。
在交互方面,Flyer是一个更简单的案例,&FlyerLaserController 监听了 VRInput 的O nDown 事件来发射激光:
[csharp]&&
private&void&OnEnable()&&
&&&&m_VRInput.OnDown&+=&HandleD&&
private&void&HandleDown()&&
&&&&if&(!m_GameController.IsGameRunning)&&
&&&&&&&&&&
&&&&SpawnLaser(m_LaserSpawnPosLeft);&&
&&&&SpawnLaser(m_LaserSpawnPosRight);&&
Shooter180 和 Shooter360 场景中的交互(Target Gallery/Target Arena)
VR示例实现了两个射击游戏,180度走廊打靶射击游戏,和360度的竞技场射击游戏。
每个在射击游戏里创建的靶子都有&Collider,&VRInteractiveItem&和&ShootingTarget 组件。
ShootingTarget 组件监听了VRInteractiveItem发出的OnDown事件,来判断标靶是不是被射击。这个方法适合即时射击,如果要做一个击中数的模式,我们需要另一个方案实现。
现在你可能对 VR交互组件 有了一个大概认识,知道了这些组件是如何在VR 示例项目中使用的。现在我们来讨论一下注视和准星是如何在我们的VR示例中生效的。
在VR中侦测玩家正在查看的方向是很重要的,关系到是否允许用户和物体互动,激活动画,或者对对目标发射子弹等等。我们引用的这个动作,在VR中叫做“gaze”(注视), 而且,接下来我们会在我们的VR文章中,使用这个术语。
由于大多数头戴式显示设备还不支持眼球追踪,我们现在只能估算玩家的注视。因为镜片的扭曲,这意味着玩家基本上是朝前看的,所以有一个简单的解决方案。就像在概述中提到的,我们只需要在摄像机中心朝前发射一条射线,然后查找这条射线所有碰撞的物体。当然,这意味着任何物体能被碰撞(或者通过注视进行互动)的物体都要有碰撞盒。
准星可以帮助指示出玩家的视野中心。准星可以是一个简单的点,或者是个交叉十字线,这要看项目的需求。
在传统的3D游戏中,准星通常被设置为空间中固定的点, 通常是屏幕的中心。 在VR中定位一个准星要更复杂:用户在VR场景中观察环境,视线会聚集到离摄像机比较近的物体上。如果准星有一个固定的位置, 用户会看到两个:可以把手指放在眼前然后看远处的物体来模拟一下这个感觉, 如果你聚焦到你的手指,背景的物体看起来会变成两个, 反之同样。这被叫做(自发性复视)。
要避免用户观察环境时和注视不同距离的物体时看到两个准星,需要把准星放到物体表面正在被观察的点,然后根据摄像机到这个点的距离对它进行缩放。
有一些简单的例子来演示准星如何处理不同距离和尺寸, 来自&Examples/Reticlescene (示例/准星场景)
准星被放置在一个物体上,靠近摄像机:
准星被放置在一个远处的物体上:
准星放置在远处的位置:
由于调整了位置和缩放, 准星在用户看来是一样的大小,也忽略的它到摄像机的距离。
当注视的射线上没有物体的时候,我们简单的把准星放到一个预设的距离上。在一个护腕环境,这个被简单的放在摄像机的最远端裁剪面上,或者在室内场景的话,这个位置会变得更近。
越过其他物体渲染准星
如果准星被放置在了和物体同样的位置, 这个准星可能和其他附近的物体有重叠:
要解决这个问题,我们需要保证准星渲染在所有其他物体之上。VR示例中提供了一个基于&“UI/Unlit/Text”的shader,叫做UIOverlay.shader。给材质选择shader的时候,可以在“UI/Overlay”下面找到它。
这个shader可以用在UI元素和文字,会在其它物体的最上方渲染:
调整准星到场景中的其他物体
最后,如果需要旋转准星来贴合到视线击中的物体上。我们可以用。这里演示如何在准星中设置:
[csharp]&&
public&void&SetPosition&(RaycastHit&hit)&&
&&&&m_ReticleTransform.position&=&hit.&&
&&&&m_ReticleTransform.localScale&=&m_OriginalScale&*&hit.&&
&&&&if&(m_UseNormal)&&
&&&&&&&&m_ReticleTransform.rotation&=&Quaternion.FromToRotation&(Vector3.forward,&hit.normal);&&
&&&&else&&
&&&&&&&&m_ReticleTransform.localRotation&=&m_OriginalR&&
可以在迷宫场景中看到这个动作。
下面是准星如何贴合到墙壁上:
准星贴合到地面:
我们已经引入了一个示例准星脚本。 和&VREyeRaycaster&一起把准星定位到场景中,有选项控制是否贴合到目标物体表面。
以上所有都能在VRSampleScenes/Scenes/Examples/ 文件夹下的&Reticle scene 查看。
VR中头部的旋转和坐标
HMD(头戴式显示设备)旋转和坐标的明显的用途是用来观察环境,但是这两个变量,用来和环境互动也是可以的。
需要使用&&这个类来得到这两个值,然后区分需要进入哪个&(VR节点)。我们需要使用VRNode.Head来得到头部的旋转。头部,而不是每只眼睛。关于这个的更多信息,可以参考这篇文章。
把旋转作为一种输入类型的示例,基于头部旋转来精确的旋转一个菜单或者其他物体。可以在这里找到这里示例,VRSampleScenes/Examples/Rotation&scene, 以下示例脚本:
[csharp]&&
var&eulerRotation&=&transform.rotation.eulerA&&
eulerRotation.x&=&0;&&
eulerRotation.z&=&0;&&
eulerRotation.y&=&InputTracking.GetLocalRotation(VRNode.Head).eulerAngles.y;&&
可以看到物体会根据玩家查看的方向进行旋转:
在我们的示例Flyer game(飞行器游戏)中,你可以看到FlyerMovementController中,基于头部的旋转调整飞船坐标:
[csharp]&&
Quaternion&headRotation&=&InputTracking.GetLocalRotation&(VRNode.Head);&&
m_TargetMarker.position&=&m_Camera.position&+&(headRotation&*&Vector3.forward)&*&m_DistanceFromC&&
VR 游戏中 与触控板和键盘的交互
Gear VR 在设备侧面有触控板。对于Unity来说,表现为出镖, 可以通过下面的方式调用:
使用Gear VR时,可能也许需要获取触控板的滑动数据。我们引入了一个VRInput&脚本来处理滑动,触屏点击,和触屏双击。也接受键盘输入中的方向键和左Ctrl键(Unity默认输入术语中的Fire1),来触发swipes(滑动)和taps(点击)。
在Unity编辑器中,由于现在没有办法Unity到GearVR的内容,可能用DK2来测试GearVR 的内容。由于Gear VR 触控板事件是作为鼠标事件运作的,我们可以简单的使用鼠标来模拟输入。由于使用HMD(头戴式显示设备)时,定位键盘要更简单一点, 为了方便,VRInput也会接受方向键作为滑动事件,然后左Ctrl(Fire1)作为触屏点击事件(taps)。
对于手柄的基础操作,左摇杆的动作会作为华东,然后按下其中一个按钮会作为点击。
在VRSampleScenes/Scenes/Examples/Touchpad中有一个例子监听了swipes(滑动)事件。
一下是ExampleTouchpad 脚本, 按照滑动的方向,对刚体添加扭力,让物体能够旋转起来。
[csharp]&&
using&UnityE&&
using&VRStandardAssets.U&&
namespace&VRStandardAssets.Examples&&
&&&&public&class&ExampleTouchpad&:&MonoBehaviour&&
&&&&&&&&[SerializeField]&private&float&m_Torque&=&10f;&&
&&&&&&&&[SerializeField]&private&VRInput&m_VRI&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&[SerializeField]&private&Rigidbody&m_R&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&private&void&OnEnable()&&
&&&&&&&&{&&
&&&&&&&&&&&&m_VRInput.OnSwipe&+=&HandleS&&
&&&&&&&&}&&
&&&&&&&&private&void&OnDisable()&&
&&&&&&&&{&&
&&&&&&&&&&&&m_VRInput.OnSwipe&-=&HandleS&&
&&&&&&&&}&&
&&&&&&&&private&void&HandleSwipe(VRInput.SwipeDirection&swipeDirection)&&
&&&&&&&&{&&
&&&&&&&&&&&&switch&(swipeDirection)&&
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&case&VRInput.SwipeDirection.NONE:&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&case&VRInput.SwipeDirection.UP:&&
&&&&&&&&&&&&&&&&&&&&m_Rigidbody.AddTorque(Vector3.right&*&m_Torque);&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&case&VRInput.SwipeDirection.DOWN:&&
&&&&&&&&&&&&&&&&&&&&m_Rigidbody.AddTorque(-Vector3.right&*&m_Torque);&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&case&VRInput.SwipeDirection.LEFT:&&
&&&&&&&&&&&&&&&&&&&&m_Rigidbody.AddTorque(Vector3.up&*&m_Torque);&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&case&VRInput.SwipeDirection.RIGHT:&&
&&&&&&&&&&&&&&&&&&&&m_Rigidbody.AddTorque(-Vector3.up&*&m_Torque);&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&
VR示例中的VRInput例子
像上文提到的,所有我们的示例游戏,都用VRInput来处理触控板和鼠标事件。在Maze(迷宫)中的摄像机也响应了滑动事件。
Maze(迷宫)
在这个场景中,摄像机轨道监听了swipes(滑动)事件,能够改变视角:
[csharp]&&
private&void&OnEnable&()&&
&&&&m_VrInput.OnSwipe&+=&HandleS&&
private&void&HandleSwipe(VRInput.SwipeDirection&swipeDirection)&&
&&&&if&(!m_MazeGameController.Playing)&&
&&&&&&&&&&
&&&&if&(m_CameraFade.IsFading)&&
&&&&&&&&&&
&&&&switch&(swipeDirection)&&
&&&&&&&&case&VRInput.SwipeDirection.LEFT:&&
&&&&&&&&&&&&StartCoroutine(RotateCamera(m_RotationIncrement));&&
&&&&&&&&&&&&&&
&&&&&&&&case&VRInput.SwipeDirection.RIGHT:&&
&&&&&&&&&&&&StartCoroutine(RotateCamera(-m_RotationIncrement));&&
&&&&&&&&&&&&&&
关于为什么场景的摄像机轨道而不是直接旋转这个迷宫本身,请查看&&这篇文章。
现在你对中,基础VR交互的工作原理有了一个更好的认识。有很多方法去完成这个事情,但是这个方法学起来又快又简单。在下一篇文章里,我们会讨论VR中不同类型的。同时记得,打算向同样研究VR的朋友们提问关于VR的问题的话,你可以跳转到。
在迷宫场景中看到这个动作。
下面是准星如何贴合到墙壁上:
阅读(...) 评论()

我要回帖

更多关于 unity3d vr蓝牙手柄 的文章

 

随机推荐