麻烦问下,现在养殖什么前景好VR的前景可以么?想学Unity,行不

Unity全球新计划 旨在深度发展VR领域_网易数码
Unity全球新计划 旨在深度发展VR领域
用微信扫码二维码
分享至好友和朋友圈
(原标题:Unity全球新计划 旨在深度发展VR领域)
[PChome资讯组报道]:作为目前世界主流的虚拟现实(VR)开发引擎公司之一,Unity致力于深度发展VR领域。
近日,Unity推出了全球性的新计划&&全球授权的培训和认证合作伙伴计划。此举旨在和全球不同机构建立合作并提供Unity培训和认证考试,为全球增加更多的Unity专业开发人员。
Unity Technologies全球教育主管Megan Stewart表示:&我们正在努力,为一个蓬勃发展的行业带来更多的合格的求职者&,
&通过向合作伙伴开放我们的大门,并在当地为他们提供Unity的培训和认证考试,我们可以加快消除开发人员教育的障碍,并使更多的个人找到事业上的成功&。
此次公告发布了首批授权培训及认证机构,具体如下:
美国的Ledet Training、英国的Academy Class、西班牙的CICE S.A. 、哥伦比亚的NASKA Digital 、新西兰最牛艺术学校:Media Design School 、均地处香港的Fevaworks IT教育中心及UFO(Unity Future Optimizer )、新加坡的 COMAT 、菲律宾的 iAcademy 和De La Salle 大学、以及南韩的Like Corp。
此次认证计划,更有利于开发者在世界范围内来检验他们所掌握的Unity的知识和技能,为开发者提供一个展示自己的世界性平台。
本文来源:pchome电脑之家
责任编辑:"王晓易_NE0011"
用微信扫码二维码
分享至好友和朋友圈
加载更多新闻
热门产品:   
:        
:         
热门影院:
阅读下一篇
用微信扫描二维码
分享至好友和朋友圈5136人阅读
游戏--Unity3D(10)
  为了准备好学习使用Unity开发VR应用,我们首先要检查下自己的电脑硬件和软件配置是否满足要求。简单来说,显卡要NVIDIA GTX970或AMD290以上,CPU要Intel i5-459以上,内存8GB以上,要有两个USB3.0接口,一个USB2.0接口,一个HDMI 1.3接口。
  操作系统比较坑爹,不支持Mac,也不支持Linux。支持Win7,Win8,Win10。
  当然,还要把自己的显卡驱动升级到最新版本。
  Oculus官方的检测地址:
  http://oculus.us5./track/click?u=88dbdcbf84bbc2e&id=b436d0da47&e=86f0296884
  一旦完成了这种烧钱的工作,就该安装Unity了。注意在打开Unity前要把DK2连接好并开启。 在继续之前,打开Oculus Configuration Utility应用,并检查Demo Scene可以正常运行。注意在运行Demo Scene之前看可能需要在Oculus Configuration Utility中设置一个新用户。
  创建第一个VR项目
  接下来我们将使用Unity创建一个简单的VR项目demo,其效果是在VR头盔中观察一个立方体。如果你想研究更多VR示例,不妨下载我们在上一篇教程中提到的VR示例项目(Asset Store:https://www./en/#!/content/51519)。
  Step 1
  打开Unity,创建一个新的空项目。
  说明一下,我当前用的Unity版本是5.3.1f1,可能你看到这篇教程的时候又已经升级换代了。
  Step 2
  在Unity的菜单中选择Fiel- Build Settings,并选中PC,Mac& Linux Standalone。
  Step 3
  在场景中创建一个新的立方体,从菜单中选择Game Object – 3D Object -Cube ,通过Translate工具把立方体放到默认的Main Camera 前面,类似下面。
  Step 4
  保存界面(File- Save Scene,或是使用快捷键)。
  Step 5
  在菜单中选择Edit- Project Settings – Player,在”Other Settings“部分勾选”Virtual Reality Supported”
  Step 6
  点击Unity界面上的Play按钮进入Play模式。
  如果之前的设置没有问题,现在你应该可以通过DK2看到这个场景,四处看看,Unity中的摄像机将自动根据DK2的位置和旋转变化反应。
  出错了怎么办?
  如果你没有在DK2中看到期望的场景,那么检查以下的事项:
  1、确保你在打开Unity项目前就已经把DK2接好并且开启了;
  2、打开Oculus自带的Oculus Configuration Utility,看看Demo Scene是不是可以正常运作;
  3、更新你的显卡驱动到最新版本;
  4、确保你在电脑上装了最新的Oculus Runtime 0.8,或更高版本;
  当然,如果还是有问题,可以到论坛里面参与讨论。(Virtual Reality:/forums/virtual-reality.80/)
  关于VR开发的一些有用信息:
  虽然VR应用开发和标准Unity应用开发很相似,不过还是有些区别需要注意的。
  1、编辑器中显示的帧速(Frame rate)
  当你通过编辑器查看项目时,注意体验上可能有些延迟,因为电脑需要将同样的内容渲染两次。所以在实际测试项目的时候,最好创建一个可执行版本,在测试设备上实际体验。
  2、摄像机的移动
  注意,我们不能在Unity中直接移动VR摄像机。如果你希望调整摄像机的位置和旋转,需要确保将它设置为其它游戏物体GameObject的子物体,然后通过所依附的物体进行移动。
关于这一点,可以查看VR
Samples项目中的Flyer和Maze场景。
  3、相机节点
  左眼和右眼的摄像机并不是由Unity创建的。如果你在开发中需要获取这些节点的位置,则必须使用InputTracking类。
  如果你想要获取场景中眼睛的不同位置(比如测试时),请使用下面的示例脚本,并将其attach到摄像机上。
  C#脚本
  using UnityEngine;
  using UnityEngine.VR;
  public class UpdateEyeAnchors : MonoBehaviour
  GameObject[] eyes = new GameObject[2];
  string[] eyeAnchorNames ={ “LeftEyeAnchor”, “RightEyeAnchor” };void Update()
  for (int i = 0; i & 2; ++i)
  // If the eye anchor is no longer a child of us, don’t use it
  if (eyes[i] != null && eyes[i]。transform.parent != transform)
  eyes[i] = null;
  // If we don’t have an eye anchor, try to find one or create one
  if (eyes[i] == null)
  Transform t = transform.Find(eyeAnchorNames[i]);
  if (t)
  eyes[i] = t.gameObject;
  if (eyes[i] == null)
  eyes[i] = new GameObject(eyeAnchorNames[i]);
  eyes[i]。transform.parent = gameObject.transform;
  // Update the eye transform
  eyes[i]。transform.localPosition = InputTracking.GetLocalPosition((VRNode)i);
  eyes[i]。transform.localRotation = InputTracking.GetLocalRotation((VRNode)i);
  4、VR中的图像效果(Image Effect)
  在VR项目中使用众多图像效果是很奢侈的事情。考虑到你需要两次渲染同一个场景(每只眼睛一次),因此很多当前经常使用的图像效果对VR应用来说会很浪费,会严重影响游戏的运行帧速。
  因为VR将用户的眼睛置入一个虚拟的空间,因此部分图像效果对VR来说没有任何意义。举例来说,深度视角、模糊效应和镜头光晕效果对VR来说没有任何意义,因为在现实世界中我们是看不到这些效果的。不过如果以后VR头戴设备可以支持眼动跟踪,那么深度视角可能会有意义。
  不过有些效果还是可以考虑使用的:比如抗锯齿是有用的(特别是考虑到某些头戴设备的低分辨率),色彩分级也很有用(关于这一点可以查看这个链接:Color Grading with Unity and the Asset Store://color-grading-with-unity-and-the-asset-store/),对有些游戏来说Bloom会有用。不过在使用任何效果之前,最好先在游戏中实际测试下有没有用。
  Unity自身提供了很多图像效果(Assets-Import Package-Effects),此外Asset Store里面也提供了很多效果,比如Colorful,Chromatica,Amplify Color,还有更多。
  5、Render Scale
  根据VR互动应用场景的复杂度和所运行的硬件环境,你可能需要更改render scale设置。通过此项设置可以调整镜头校正前texel:pixel的比率,这样可以牺牲游戏性能来换取画面的清晰度。
  这项设置应该通过代码进行,可以参考这里:
  /cn/VRSettings.renderScale
  通过使用以下代码可以改变render scale的设置:
  using UnityEngine;
  using System.Collections;
  using UnityEngine.VR;
  namespace VRStandardAssets.Examples
  public class ExampleRenderScale : MonoBehaviour
  [SerializeField] private float m_RenderScale = 1f;
  //The render scale。 Higher numbers = better quality, but trades performance
  void Start ()
  VRSettings.renderScale = m_RenderScale;
  关于这项设置,可以参考我们的VR Samples,具体示例是Scenes/Examples/RenderScale场景。此外在MainMenu场景中也有该项设置的应用。
  更改render scale的效果示例如下:
  Unity的默认render scale是1.0,效果如下:
如果将render scale设置成1.5,可以看到显示效果更锐利:
接下来把renderscale设置成0.5,可以看到像素化很严重:
  根据游戏场景的不同,可以考虑降低render scale来提升游戏运行性能,或者通过增加render scale的数值让画面效果更锐利,但会以牺牲游戏运行性能作为代价。
  好了,看到这里,你应该知道如何在Unity项目中整合VR,如何设置游戏中摄像机的移动,以及和非VR游戏相比应该如何使用图像效果。
from:游戏陀螺
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:424882次
积分:7256
积分:7256
排名:第3243名
原创:277篇
转载:242篇
评论:146条
阅读:1097
文章:10篇
阅读:23173
阅读:7284
阅读:7328
推荐:以下都是博客老前辈.点击传送门.不知道怎么开发VR游戏?Unity5.3官方VR教程重磅登场-系列3 VR中的交互方式 - 知乎专栏
{"debug":false,"apiRoot":"","paySDK":"/api/js","wechatConfigAPI":"/api/wechat/jssdkconfig","name":"production","instance":"column","tokens":{"X-XSRF-TOKEN":null,"X-UDID":null,"Authorization":"oauth c3cef7c66aa9e6a1e3160e20"}}
{"database":{"Post":{"":{"contributes":[{"sourceColumn":{"lastUpdated":,"description":"Learning by Playing,游戏改变学习,让k12青少年爱上编程。","permission":"COLUMN_PUBLIC","memberId":10925,"contributePermission":"COLUMN_PUBLIC","translatedCommentPermission":"all","canManage":true,"intro":"Learning by Playing,游戏改变…","urlToken":"kidscoding","id":602,"imagePath":"f9a1d3e049.jpeg","slug":"kidscoding","applyReason":"","name":"笨猫快乐学编程","title":"笨猫快乐学编程","url":"/kidscoding","commentPermission":"COLUMN_ALL_CAN_COMMENT","canPost":true,"created":,"state":"COLUMN_NORMAL","followers":7442,"avatar":{"id":"f9a1d3e049","template":"/{id}_{size}.jpeg"},"activateAuthorRequested":false,"following":false,"imageUrl":"/f9a1d3e049_l.jpeg","articlesCount":86},"state":"accepted","targetPost":{"titleImage":"/7ad35cf7b1ad7a9a8ba410_r.jpg","lastUpdated":,"imagePath":"7ad35cf7b1ad7a9a8ba410.jpg","permission":"ARTICLE_PUBLIC","topics":[],"summary":"概览:在VR项目中,我们需要在用户”凝视“某个物体时将其激活。在VRSamples中,我们构建了一个简单的,可拓展的轻度系统,让用户跟场景中的物体进行交互。其中包含了三个主要的脚本文件:VREyeRaycaster,VRInput和VRInteractiveItem,下面将对这三个重要的…","copyPermission":"ARTICLE_COPYABLE","translatedCommentPermission":"all","likes":0,"origAuthorId":10925,"publishedTime":"T11:13:48+08:00","sourceUrl":"","urlToken":,"id":384905,"withContent":false,"slug":,"bigTitleImage":false,"title":"不知道怎么开发VR游戏?Unity5.3官方VR教程重磅登场-系列3 VR中的交互方式","url":"/p/","commentPermission":"ARTICLE_ALL_CAN_COMMENT","snapshotUrl":"","created":,"comments":0,"columnId":602,"content":"","parentId":0,"state":"ARTICLE_PUBLISHED","imageUrl":"/7ad35cf7b1ad7a9a8ba410_r.jpg","author":{"bio":"Apple,SF,Psychology","isFollowing":false,"hash":"4c9dd7ce259e3e6ae2f0fa6ca42801ee","uid":00,"isOrg":false,"slug":"eseedo","isFollowed":false,"description":"Create a world like Caprica.","name":"王寒","profileUrl":"/people/eseedo","avatar":{"id":"7dd67dbfe","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},"memberId":10925,"excerptTitle":"","voteType":"ARTICLE_VOTE_CLEAR"},"id":319927}],"title":"不知道怎么开发VR游戏?Unity5.3官方VR教程重磅登场-系列3 VR中的交互方式","author":"eseedo","content":"概览:在VR项目中,我们需要在用户”凝视“某个物体时将其激活。在VRSamples中,我们构建了一个简单的,可拓展的轻度系统,让用户跟场景中的物体进行交互。其中包含了三个主要的脚本文件:VREyeRaycaster,VRInput和VRInteractiveItem,下面将对这三个重要的类进行简要的介绍。相关的源代码也做了注释。VREyeRaycaster该脚本需要和Main Camera关联。在每次调用Update()时,该脚本都会使用Physics.Raycast来投射一条射线,以确认该射线是否命中任何collider(碰撞体)。使用该脚本还可以排除特定的-在某些场景中,我们可能为了性能考虑,把所有的可交互对象移到一个单独的层。如果某个碰撞体被射线命中,那么该脚本将尝试在GameObject上找到一个VRInteractiveItem组件。C#脚本:VRInteractiveItem interactible = hit.collider.GetComponent&VRInteractiveItem&();
//attempt to get the VRInteractiveItem on the hit object从这里我们就可以判断用户究竟在”凝视“哪个物体,或是停止”凝视“某个物体。如果用户开始或停止”凝视“某个物体,那么我们就可以进行一些处理,比如调用一个方法。VRInputVRInput是个简单的类,可以判断用户在GearVR上(或是使用DK2时在PC上)所进行的一些简单操作,比如滑动、触碰、或双触。我们可以直接在VRInput上订阅事件:C#脚本:public event Action&SwipeDirection& OnS
// Called every frame passing in the swipe, including if there is no swipe.public event Action OnC
// Called when Fire1 is released and it's not a double click.public event Action OnD
// Called when Fire1 is pressed.public event Action OnUp;
// Called when Fire1 is released.public event Action OnDoubleC
// Called when a double click is detected.public event Action OnC
// Called when Cancel is pressed.关于订阅事件的更多信息,请参考这里。VRInteractiveItem我们可以把该组件添加到任何希望在VR场景中进行交互的GameObject上,在该物体上需要绑定一个碰撞体。对此我们可以选择订阅六种不同的事件:C#脚本:public event Action OnO
// Called when the gaze moves over this objectpublic event Action OnO
// Called when the gaze leaves this objectpublic event Action OnC
// Called when click input is detected whilst the gaze is over this object.public event Action OnDoubleC
// Called when double click input is detected whilst the gaze is over this object.public event Action OnUp;
// Called when Fire1 is released whilst the gaze is over this object.public event Action OnD
// Called when Fire1 is pressed whilst the gaze is over this object.此外还有一个布尔值用于判断用户是否”凝视“在当前物体上?C#脚本:public bool IsOver{
get{ return m_IsO }
// Is the gaze currently over this object?}我们也可以创建自己的脚本对以上事件作出响应。下面是一个简单的示例:C#脚本:using UnityEusing VRStandardAssets.Unamespace VRStandardAssets.Examples{
// This script is a simple example of how an interactive item can
// be used to change things on gameobjects by handling events.
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
}如果想看到实际的示例,不妨看看VRSampleScens/Scens/Examples/的InteractiveItem场景。SelectionRadial和SelectionSlider我们同时利用了radial选择条(SelectionRadial),以及选择滑动条(SelectionSlider),这样用户就可以按住Fire1来确认某个交互:当按住输入键时,选择条会进行填充,并在填充完整后分发OnSelectionComplete或OnBarFilled事件。关于此部分的代码,可以在SelectionRadial.cs和SelectionSlider.cs中找到,并进行了详细的注释。在VR的世界里,从用户交互的角度看,用户需要时刻知道自己在做什么,而且可以掌控一切。通过这种“held input”的确认输入方式,可以确保用户不会出现误操作。VR Sample项目中的交互示例现在让我们来一起看看VR Sample项目中的部分交互示例。我们将提到每个场景中所使用的交互方式,以及具体实现的方式。Menu 场景中的交互每个menu场景都包含了几个组件,其中我们需要重点关注的是MenuButton,VRInteractiveItem和Mesh Collider。MenuButton组件订阅了VRInteractiveItem组件上的OnOver和OnOut事件,这样当十字准星移到menu上时,selection radial会出现。当用户的实现离开菜单选项时,selection radial会消失。而当selection radial可见,且用户按住Fire1键时,则radial会自动填充:该类还订阅了OnSelectionRadial的OnSelectionComplete事件,这样当radial被填充满的时候,会调用HandleSelectionComplete。该方法的作用是让摄像机淡出,并调用所选的关卡。C#脚本: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(){
// When the user looks at the rendering of the scene, show the radial.
m_SelectionRadial.Show();
m_GazeOver =}private void HandleOut(){
// When the user looks away from the rendering of the scene, hide the radial.
m_SelectionRadial.Hide();
m_GazeOver =}private void HandleSelectionComplete(){
// If the user is looking at the rendering of the scene when the radial's selection finishes, activate the button.
if(m_GazeOver)
StartCoroutine (ActivateButton());}private IEnumerator ActivateButton(){
// If the camera is already fading, ignore.
if (m_CameraFade.IsFading)
// If anything is subscribed to the OnButtonSelected event, call it.
if (OnButtonSelected != null)
OnButtonSelected(this);
// Wait for the camera to fade out.
yield return StartCoroutine(m_CameraFade.BeginFadeOut(true));
// Load the level.
SceneManager.LoadScene(m_SceneToLoad, LoadSceneMode.Single);}让我们来看看Selection Radial的部分示例,注意截图中间的粉色元素:Reticle only当用户“凝视”菜单选项时,空白的Selection Radial可见。Selection Radial 填充(当用户“凝视”菜单选项,且按下fire1输入键)在整个示例项目中,我们尝试用同样的风格,也就是使用bar和radial以固定的速度进行填充。在此建议大家在开发自己的VR项目时注意到这一点,因为交互设计中的连贯性对用户很重要,特别是对于VR这种新媒介。Maze场景中的交互Maze(迷宫)游戏中提供了一个桌面式的交互示例,其中我们可以指引游戏角色到出口,并避免触发炮塔。在选择角色的目的地时,会出现一个目的地标记,同时还会显示一个角色的路径。玩家可以通过在触摸板上使用swipe,按下方向键,或是使用游戏操纵杆上的左键来旋转视图。在MazeFloor游戏对象上关联了MeshCollider和VRInteractiveItem,从而允许在VR场景中进行交互:MazeCourse 游戏对象是一个parent对象,其中包含了MazeFloor和MazeWalls GameObjects,这两个对象依次包含了迷宫布局中的几何信息。MazeCourse关联了一个MazeTargetSetting脚本,其中包含了对MazeFloor对象上VRInteractiveItem组件的引用。MazeTargetSetting订阅了VRInteractiveItem上的OnDoubleClick事件,随后会分发OnTargetSet事件。该事件将把十字准星的Transform作为参数:C#脚本:public event Action&Transform& OnTargetS
// This is triggered when a destination is set.
private void OnEnable(){
m_InteractiveItem.OnDoubleClick += HandleDoubleC}private void OnDisable(){
m_InteractiveItem.OnDoubleClick -= HandleDoubleC}private void HandleDoubleClick(){
// If target setting is active and there are subscribers to OnTargetSet, call it.
if (m_Active && OnTargetSet != null)
OnTargetSet (m_Reticle.ReticleTransform);}MazeCharacter游戏对象上的Player组件和MazeDestinationMarketGUI游戏对象上的DestinationMarker组件都会订阅该事件,并作出相应的响应。游戏角色可以使用Nav Mesh systems在迷宫中进行路径判断。Player组件使用HandleSetTarget函数来判断Nav Mesh Agent到十字准星间的方向,并更新Agent的轨迹-游戏角色路径的视觉渲染。C#脚本:private void HandleSetTarget(Transform target){
// If the game isn't over set the destination of the AI controlling the character and the trail showing its path.
if (m_IsGameOver)
m_AiCharacter.SetTarget(target.position);
m_AgentTrail.SetDestination();}DestinationMarker可以将标记移动到Reticle的Transform位置:C#脚本:private void HandleTargetSet(Transform target){
// When the target is set show the marker.
// Set the marker's position to the target position.
transform.position = target.
// Play the audio.
m_MarkerMoveAudio.Play();
// Play the animation on whichever layer it is on, with no time offset.
m_Animator.Play(m_HashMazeNavMarkerAnimState, -1, 0.0f);}在下图中可以看到reticle,目的地标记,玩家和轨迹。迷宫中的切换开关也是在VR中和物体进行交互的示例,其中用到了Collider,以及VRInteractiveItem,和SelectionSlider三个类。正如上图中显示的,和其它交互对象一起,SelectionSlider脚本会监听由VRInteractiveItem和VRInput所分发的事件。C#脚本:private void OnEnable (){
m_VRInput.OnDown += HandleD
m_VRInput.OnUp += HandleUp;
m_InteractiveItem.OnOver += HandleO
m_InteractiveItem.OnOut += HandleO}Flyer场景中的交互Flyer场景是一个计时”无尽飞行”游戏,在其中玩家可以通过四处看来引导飞船的方向,并使用Fire1输入键进行射击,通过击中陨石或是引导飞船穿越空中的门来得分,跟Pilotwings或Starfox这两款游戏有点类似。在交互方面,Flyer使用了更简单的方式,也就是让FlyerLaserController订阅VRInput的OnDown事件,从而发射激光。C#脚本:private void OnEnable(){
m_VRInput.OnDown += HandleD}private void HandleDown(){
// If the game isn't running return.
if (!m_GameController.IsGameRunning)
// Fire laser from each position.
SpawnLaser(m_LaserSpawnPosLeft);
SpawnLaser(m_LaserSpawnPosRight);}Shooter180和Shooter360场景中的交互(Target Gallery/ Target Arena)。在VR Samples包含了两个射击游戏,其中一个是回廊射击游戏,玩家在180度视角的走廊中对潜在目标射击。另外还有一个竞技场射击游戏,玩家被类似X战警场景的潜在目标包围。这两款游戏中的每个目标对象都有一个Collider,VRInteractiveItem和ShootingTarget。ShootingTarget组件订阅了VRInteractiveItem的OnDown事件,以判断目标是否被击中。该方法适用于瞬间命中(比如激光枪这种)的设定,如果要展示子弹时间,我们就需要考虑其它解决方案了。现在我们应该对基本的VR交互组件有了大概的印象,包括任何在VR Samples项目中具体使用这些组件。现在让我们来看看VR Samples项目中如何使用gaze(凝视)和reticles(十字星)。GAZE(凝视)在VR应用中判断用户正在看什么很重要,可能是用于判断用户和游戏对象的交互,或是触发一个动画,也可能是向目标发射子弹。我们将VR中“看”这个动作定义为gaze(凝视),而在后续的教程中我们将频繁使用这个词。考虑到目前大多数HMD头戴设备还不支持眼部追踪,因此我们只能估计用户的gaze(凝视)。透镜的扭曲意味着用户正看着正前方,有一个简单的解决方案。正如在概览中提到的,我们只需要从摄像机的中心发射一条射线,然后找到这条射线所碰撞的物体即可。当然,这就意味着所有要被碰撞(或是需要通过“凝视”进行交互)的对象都必须关联一个Collider组件。Reticle(十字准星)十字准星用于辅助标记用户视野的中心。十字准星的样式可能是简单的点,也可能是一个十字准线,具体形式取决于项目需求。在传统的3D游戏中,十字准星被设置为空间中的固定点,比如通常是屏幕的中央。但是在VR中使用十字准星变得非常复杂:当用户在VR环境中四处观望时,双眼将汇集在靠近摄像机的物体上。如果十字准星处在一个固定的位置,那么用户会看到两个准星:我们在现实世界里面可以轻易模仿这种效果。把某个手指放在眼睛前面,然后聚焦到近处和远处的物体上。当我们聚焦在这个手指上时,就会看到两个背景,反之亦然。这就是传说中的 现象。为了避免用户在查看周围环境和注视不同距离的物体时看到两个准星,我们需要将准星放到3D空间的同一个点,也就是用户所关注对象的表面。将准星放在空间的这个点意味着从远处看准星将非常小,当靠近时会变大。为了让准星的大小不随距离发生变化,我们需要根据它到摄像机的距离对其进行缩放。为了说明这一点,我们从Examples/Reticle场景中找了一些例子,展示了处于不同距离和比例的准星。准星放置在靠近摄像机的物体上:准星放置在稍远的物体上:准星放置在远处:根据所处的位置和自身比例,用户在任何距离上看到的准星大小都是相同的。如果没有击中任何对象,那么我们只需把准星放到一个预设的距离上。在室外环境中,可能会放在摄像机的Far clip plane前面,在室内场景中可能会近得多。将十字准星渲染到其它游戏对象的表面如果十字准星恰好和某个对象的位置相同,那么准星可能会嵌入到临近的对象中。为了解决这个问题,我们需要确保将准星渲染到场景中所有对象的前面。在VR Samples中,我们提供了一个shader,基于Unity现有的名为UIOverlay.shader的”UI/Unlit/Text” shader。在选择某个材质的shader时,可以在”UI/Overlay”中找到。这个shader对UI 元素和文本都适用,会在场景中其它物体的前面绘制。将准星和场景中的游戏对象对齐我们希望准星的旋转方向和它所命中的对象的法线相匹配。通过RaycastHit.normal就可以实现这一点,以下是具体的实现代码:C#脚本:public void SetPosition (RaycastHit hit){
m_ReticleTransform.position = hit.
m_ReticleTransform.localScale = m_OriginalScale * hit.
// If the reticle should use the normal of what has been hit...
if (m_UseNormal)
// ... set it's rotation based on it's forward vector facing along the normal.
m_ReticleTransform.rotation = Quaternion.FromToRotation (Vector3.forward, hit.normal);
// However if it isn't using the normal then it's local rotation should be as it was originally.
m_ReticleTransform.localRotation = m_OriginalR}我们可以在Maze场景中看到这个action。下图展示了准星如何匹配墙壁的法线:下图展示了准星如何匹配地板的法线:我们还提供了一个示例的Reticle脚本。该脚本可以跟VREyeRaycaster一起适用,从而将准星放置到场景的正确位置,并且可以选择跟所命中的对象法线帖齐。以上内容都可以在VRSampleScens/Scens/Examples/中看到。在VR项目中头部的旋转和位置 在头戴设备中跟踪头部的旋转和位置可以用沉浸式的体验来感受周围环境,但同时也可以让对象根据这些数值所相应的相应。为了获取这些数值我们需要用到VR.InputTracking类,并指定我们要访问的VRNode。为了获取头部的旋转,我们会希望用到VRNode.Head,而不是两只眼睛。想了解更多的信息,可以参考Getting Started with VR Development一文中的Camera Nodes。使用头部旋转作为输入方式的可能应用是精细旋转菜单或是其它对象。在VRSampleScenes/Examples/Rotation场景中可以看到这一点的示例。下面是ExampleRotation的脚本:C#脚本:// Store the Euler rotation of the gameobject.var eulerRotation = transform.rotation.eulerA// Set the rotation to be the same as the user's in the y axis.eulerRotation.x = 0;eulerRotation.z = 0;eulerRotation.y = InputTracking.GetLocalRotation(VRNode.Head).eulerAngles.y;下面的图展示了游戏对象如何根据用户所注视的位置来进行旋转:在Flyer游戏场景中,我们将看到太空飞船基于头部的旋转来调整自身位置,具体参考FlyerMovementController:C#脚本:Quaternion headRotation = InputTracking.GetLocalRotation (VRNode.Head);m_TargetMarker.position = m_Camera.position + (headRotation * Vector3.forward) * m_DistanceFromC在VR游戏中使用触摸板和键盘进行交互Gear VR在头戴设备的侧边配备了一个触摸板。Unity把这个触摸板当做鼠标来使用,所以我们可以使用以下方法:
Input.mousePosition Input.GetMouseButtonDown
Input.GetMouseButtonUp在使用Gear VR时,开发者可能会希望从触摸板中获取swipe数据。我们提供了一个名为VRInput的示例脚本,可以处理swipe,触碰和双触。此外它还支持方向键和键盘上的左Ctrl键(在Unity中的默认输入术语是Fire1),或者是鼠标上的左键,以此来处罚swipe和触摸。在Unity Editor中,我们可能会希望使用DK2来测试Gear VR的内容。因为目前暂时无法直接从Unity直接关联到Gear VR进行测试。考虑到Gear VR的触摸板作用跟鼠标类似,我们可以考虑使用鼠标来模拟输入。当用户佩戴HMD设备时操控键盘会更容易,因此VRInput同时也会讲方向键操作处理成swipe,将Left-Ctrl(Fire1)处理成触碰。在使用游戏手柄时,左侧的stick可以用作swipe,其中的某个按键可以用作触碰。关于如何处理swipe,可以参考VRSampleScenes/Scenes/Examples/Touchpad以下是ExampleTouchpad脚本,其中根据swipe的方向将AddTorque方法作用于一个刚体,从而让对象旋转。C#脚本:using UnityEusing VRStandardAssets.Unamespace VRStandardAssets.Examples{
// This script shows a simple example of how
// swipe controls can be handled.
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
//Handle the swipe events by applying AddTorque to the Ridigbody
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 Samples项目中的VRInput示例正如上面所提到的,我们所有的示例游戏都使用VRInput来处理触摸屏和键盘的输入。Maze游戏中的摄像机也会对swipe作出响应:Maze在这个场景中,CameraOrbit对swipe进行监听,从而允许对视点进行调整:C#脚本:private void OnEnable (){
m_VrInput.OnSwipe += HandleS}private void HandleSwipe(VRInput.SwipeDirection swipeDirection){
// If the game isn't playing or the camera is fading, return and don't handle the swipe.
if (!m_MazeGameController.Playing)
if (m_CameraFade.IsFading)
// Otherwise start rotating the camera with either a positive or negative increment.
switch (swipeDirection)
case VRInput.SwipeDirection.LEFT:
StartCoroutine(RotateCamera(m_RotationIncrement));
case VRInput.SwipeDirection.RIGHT:
StartCoroutine(RotateCamera(-m_RotationIncrement));
}}如果想了解为什么场景中的摄像机按照某个轨道运行,而不是旋转迷宫本身,可以参考这篇文章。在看完本文后,我们应该对VR Sample场景中的基本交互有更深入的理解。虽然还有其它方式来实现VR交互,但这种方法是最简单易行的。在下一篇文章中,我们将讨论不同类型的VR用户界面。如果在学习中有任何问题,可以到中参与讨论。","updated":"T03:13:48.000Z","canComment":false,"commentPermission":"anyone","commentCount":3,"collapsedCount":0,"likeCount":32,"state":"published","isLiked":false,"slug":"","lastestTipjarors":[],"isTitleImageFullScreen":false,"rating":"none","titleImage":"/7ad35cf7b1ad7a9a8ba410_r.jpg","links":{"comments":"/api/posts//comments"},"reviewers":[],"topics":[],"adminClosedComment":false,"titleImageSize":{"width":666,"height":444},"href":"/api/posts/","excerptTitle":"","column":{"slug":"kidscoding","name":"笨猫快乐学编程"},"tipjarState":"activated","tipjarTagLine":"真诚赞赏,手留余香","sourceUrl":"","pageCommentsCount":3,"tipjarorCount":0,"annotationAction":[],"hasPublishingDraft":false,"snapshotUrl":"","publishedTime":"T11:13:48+08:00","url":"/p/","lastestLikers":[{"bio":"HCI18fall ,可以私信我一起交流啊","isFollowing":false,"hash":"8afd910f04cb9df9a4e3","uid":88,"isOrg":false,"slug":"gao-xiao-biao","isFollowed":false,"description":"","name":"Rita Gao","profileUrl":"/people/gao-xiao-biao","avatar":{"id":"v2-e749aa74c45fb961c8c7c0cf649f1eb3","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},{"bio":null,"isFollowing":false,"hash":"117b2f5c5fd","uid":88,"isOrg":false,"slug":"yaoneil","isFollowed":false,"description":"","name":"Neil Yao","profileUrl":"/people/yaoneil","avatar":{"id":"fb0ce654d","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},{"bio":"幻想本无形,吾等形之","isFollowing":false,"hash":"c9e7d31b1e5fc7aba17fb0bd88ca591c","uid":743000,"isOrg":false,"slug":"wang-xiao-jian-48-30","isFollowed":false,"description":"混蛋一个","name":"王小贱","profileUrl":"/people/wang-xiao-jian-48-30","avatar":{"id":"faa60ab67f584c80ed87","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},{"bio":"看完b乎怀疑人生","isFollowing":false,"hash":"ccdd62dfdd5b14bf0b75a5cd","uid":001200,"isOrg":false,"slug":"ban-tai-63","isFollowed":false,"description":"いけ!日本語サムライ Programming / Art ","name":"Tim Huang","profileUrl":"/people/ban-tai-63","avatar":{"id":"v2-6a4552dcec73cde49bc3","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},{"bio":"","isFollowing":false,"hash":"afcaea9d3","uid":48,"isOrg":false,"slug":"jyin-shi","isFollowed":false,"description":"不要相信那些高票答案!","name":"人格分裂男","profileUrl":"/people/jyin-shi","avatar":{"id":"v2-492dd108bcb7f8f70fdafa12","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false}],"summary":"概览:在VR项目中,我们需要在用户”凝视“某个物体时将其激活。在VRSamples中,我们构建了一个简单的,可拓展的轻度系统,让用户跟场景中的物体进行交互。其中包含了三个主要的脚本文件:VREyeRaycaster,VRInput和VRInteractiveItem,下面将对这三个重要的…","reviewingCommentsCount":0,"meta":{"previous":{"isTitleImageFullScreen":false,"rating":"none","titleImage":"/50/fa920c8a5a3bf4dc582c_xl.jpg","links":{"comments":"/api/posts//comments"},"topics":[],"adminClosedComment":false,"href":"/api/posts/","excerptTitle":"","author":{"bio":"Apple,SF,Psychology","isFollowing":false,"hash":"4c9dd7ce259e3e6ae2f0fa6ca42801ee","uid":00,"isOrg":false,"slug":"eseedo","isFollowed":false,"description":"Create a world like Caprica.","name":"王寒","profileUrl":"/people/eseedo","avatar":{"id":"7dd67dbfe","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},"column":{"slug":"kidscoding","name":"笨猫快乐学编程"},"content":"欢迎继续我们的学习。北京时间日凌晨,Oculus正式开放对首款消费版Rift产品CV1的预订。599刀的价格让很多VR粉丝心头一紧,不过想想第一代iPhone的价格也是这样,只能期待后续的版本降价了。筑基为了准备好学习使用Unity开发VR应用,我们首先要检查下自己的电脑硬件和软件配置是否满足要求。简单来说,显卡要NVIDIA GTX970或AMD290以上,CPU要Intel i5-459以上,内存8GB以上,要有两个USB3.0接口,一个USB2.0接口,一个HDMI 1.3接口。操作系统比较坑爹,不支持Mac,也不支持Linux。支持Win7,Win8,Win10。当然,还要把自己的显卡驱动升级到最新版本。Oculus官方的检测地址:关于电脑配置的相关信息,可以参考:一旦完成了这种烧钱的工作,就该安装Unity了。注意在打开Unity前要把DK2连接好并开启。 在继续之前,打开Oculus Configuration Utility应用,并检查Demo Scene可以正常运行。注意在运行Demo Scene之前看可能需要在Oculus Configuration Utility中设置一个新用户。创建第一个VR项目接下来我们将使用Unity创建一个简单的VR项目demo,其效果是在VR头盔中观察一个立方体。如果你想研究更多VR示例,不妨下载我们在上一篇教程中提到的VR示例项目()。Step 1.打开Unity,创建一个新的空项目。说明一下,我当前用的Unity版本是5.3.1f1,可能你看到这篇教程的时候又已经升级换代了。Step 2.在Unity的菜单中选择Fiel- Build Settings,并选中PC,Mac& Linux StandaloneStep 3.在场景中创建一个新的立方体,从菜单中选择Game Object - 3D Object -Cube ,通过Translate工具把立方体放到默认的Main Camera 前面,类似下面。Step 4.保存界面(File- Save Scene,或是使用快捷键)。Step 5.在菜单中选择Edit- Project Settings - Player,在”Other Settings“部分勾选”Virtual Reality Supported”Step 6.点击Unity界面上的Play按钮进入Play模式。如果之前的设置没有问题,现在你应该可以通过DK2看到这个场景,四处看看,Unity中的摄像机将自动根据DK2的位置和旋转变化反应。出错了怎么办?如果你没有在DK2中看到期望的场景,那么检查以下的事项:1.确保你在打开Unity项目前就已经把DK2接好并且开启了。2.打开Oculus自带的Oculus Configuration Utility,看看Demo Scene是不是可以正常运作3.更新你的显卡驱动到最新版本4.确保你在电脑上装了最新的Oculus Runtime 0.8,或更高版本。当然,如果还是有问题,可以到论坛里面参与讨论。关于VR开发的一些有用信息:虽然VR应用开发和标准Unity应用开发很相似,不过还是有些区别需要注意的。1.编辑器中显示的帧速(Frame rate)当你通过编辑器查看项目时,注意体验上可能有些延迟,因为电脑需要将同样的内容渲染两次。所以在实际测试项目的时候,最好创建一个可执行版本,在测试设备上实际体验。2.摄像机的移动注意,我们不能在Unity中直接移动VR摄像机。如果你希望调整摄像机的位置和旋转,需要确保将它设置为其它游戏物体GameObject的子物体,然后通过所依附的物体进行移动。关于这一点,可以查看VR Samples项目中的Flyer和Maze场景。3.相机节点左眼和右眼的摄像机并不是由Unity创建的。如果你在开发中需要获取这些节点的位置,则必须使用InputTracking类。如果你想要获取场景中眼睛的不同位置(比如测试时),请使用下面的示例脚本,并将其attach到摄像机上。C#脚本using UnityEusing UnityEngine.VR;public class UpdateEyeAnchors : MonoBehaviour{
GameObject[] eyes = new GameObject[2];
string[] eyeAnchorNames ={ \"LeftEyeAnchor\", \"RightEyeAnchor\" };void Update()
for (int i = 0; i & 2; ++i)
// If the eye anchor is no longer a child of us, don't use it
if (eyes[i] != null && eyes[i].transform.parent != transform)
// If we don't have an eye anchor, try to find one or create one
if (eyes[i] == null)
Transform t = transform.Find(eyeAnchorNames[i]);
eyes[i] = t.gameO
if (eyes[i] == null)
eyes[i] = new GameObject(eyeAnchorNames[i]);
eyes[i].transform.parent = gameObject.
// Update the eye transform
eyes[i].transform.localPosition = InputTracking.GetLocalPosition((VRNode)i);
eyes[i].transform.localRotation = InputTracking.GetLocalRotation((VRNode)i);
}}4.VR中的图像效果(Image Effect)在VR项目中使用众多图像效果是很奢侈的事情。考虑到你需要两次渲染同一个场景(每只眼睛一次),因此很多当前经常使用的图像效果对VR应用来说会很浪费,会严重影响游戏的运行帧速。因为VR将用户的眼睛置入一个虚拟的空间,因此部分图像效果对VR来说没有任何意义。举例来说,深度视角、模糊效应和镜头光晕效果对VR来说没有任何意义,因为在现实世界中我们是看不到这些效果的。不过如果以后VR头戴设备可以支持眼动跟踪,那么深度视角可能会有意义。不过有些效果还是可以考虑使用的:比如抗锯齿是有用的(特别是考虑到某些头戴设备的低分辨率),色彩分级也很有用(关于这一点可以查看这个链接: ),对有些游戏来说Bloom会有用。不过在使用任何效果之前,最好先在游戏中实际测试下有没有用。Unity自身提供了很多图像效果(Assets-Import Package-Effects),此外Asset Store里面也提供了很多效果,比如Colorful,Chromatica,Amplify Color,还有更多。5.Render Scale根据VR互动应用场景的复杂度和所运行的硬件环境,你可能需要更改render scale设置。通过此项设置可以调整镜头校正前texel:pixel的比率,这样可以牺牲游戏性能来换取画面的清晰度。这项设置应该通过代码进行,可以参考这里:通过使用以下代码可以改变render scale的设置:using UnityEusing System.Cusing UnityEngine.VR;namespace VRStandardAssets.Examples{
public class ExampleRenderScale : MonoBehaviour
[SerializeField] private float m_RenderScale = 1f;
//The render scale. Higher numbers = better quality, but trades performance
void Start ()
VRSettings.renderScale = m_RenderS
}}关于这项设置,可以参考我们的VR Samples,具体示例是Scenes/Examples/RenderScale场景。此外在MainMenu场景中也有该项设置的应用。更改render scale的效果示例如下:Unity的默认render scale是1.0,效果如下:如果将render scale设置成1.5,可以看到显示效果更锐利:接下来把renderscale设置成0.5,可以看到像素化很严重:根据游戏场景的不同,可以考虑降低render scale来提升游戏运行性能,或者通过增加render scale的数值让画面效果更锐利,但会以牺牲游戏运行性能作为代价。好了,看到这里,你应该知道如何在Unity项目中整合VR,如何设置游戏中摄像机的移动,以及和非VR游戏相比应该如何使用图像效果。在下一篇教程中,我们将学习如何跟场景中的物体进行交互,敬请期待~","state":"published","sourceUrl":"","pageCommentsCount":0,"canComment":false,"snapshotUrl":"","slug":,"publishedTime":"T17:13:46+08:00","url":"/p/","title":"不知道怎么开发VR游戏?Unity5.3官方VR教程重磅登场-系列2","summary":"欢迎继续我们的学习。北京时间日凌晨,Oculus正式开放对首款消费版Rift产品CV1的预订。599刀的价格让很多VR粉丝心头一紧,不过想想第一代iPhone的价格也是这样,只能期待后续的版本降价了。筑基为了准备好学习使用Unity开发VR应用,我们首先要检…","reviewingCommentsCount":0,"meta":{"previous":null,"next":null},"commentPermission":"anyone","commentsCount":13,"likesCount":28},"next":{"isTitleImageFullScreen":false,"rating":"none","titleImage":"/50/32fa52d9f8ad0ccc43abf_xl.jpg","links":{"comments":"/api/posts//comments"},"topics":[],"adminClosedComment":false,"href":"/api/posts/","excerptTitle":"","author":{"bio":"Apple,SF,Psychology","isFollowing":false,"hash":"4c9dd7ce259e3e6ae2f0fa6ca42801ee","uid":00,"isOrg":false,"slug":"eseedo","isFollowed":false,"description":"Create a world like Caprica.","name":"王寒","profileUrl":"/people/eseedo","avatar":{"id":"7dd67dbfe","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},"column":{"slug":"kidscoding","name":"笨猫快乐学编程"},"content":"在设计VR应用的用户界面时要考虑很多因素,而这些因素对于传统应用或游戏的界面设计可能都不是事儿。下面我们会看看作为一个VR开发者在设计用户界面时可能会遇到的一些问题,以及跟硬件相关的一些东西。UI分辨率和画质目前DK2的分辨率是(单目是960*1080),而Gear VR是(单目是),因此对任何在宽度或高度上要占据几个像素的物体,都会出现比较明显的像素化现象。其实特别要注意的是UI元素,记住它们在屏幕上要显示的大小。一个简单的原则是尽量使用大一点字体或粗体字,另外就是尽量不要使用在VR场景中容易变得像素化的细纹。UI的类型Non-diegetic(非剧情型UI)在传统的非VR项目中,UI通常显示在界面的顶部,用来显示生命值、得分之类的信息,通常被称为HUD。这就是所谓的非剧情型UI-用户界面跟游戏世界没有什么关联度,但是对玩游戏的玩家有一定的作用。在电影中也有所谓的“画外音”,比如电影或电视中的背景音乐。与此不同的是,剧情音通常跟故事紧密相连-比如角色之间的对话,或是实际发生的自然音效。在Unity中,添加HUD样式的非剧情型UI相对简单,只需要在UI Canvas的Render Mode中选择使用Screen Space- Overlay或是Screen Space- Camera。但这种UI界面对VR基本不适用,我们的眼镜无法聚焦在如此近的物体上,而Unity VR中根本就不支持Screen Space-Overlay。Spatial UI(空间UI)和前一种UI不同的是,我们需要将UI放置到环境之中,并在Canvas的Render Mode中选择使用World Space模式。通过这种方式,就可以让用户的眼镜聚焦到UI上。这就是所谓的Spatial UI(空间UI)。将UI元素放在世界的哪个位置也需要认真考虑。太靠近用户会导致眼部疲劳,离得太远会感觉聚焦在地平线上-这种情况可能发生在室外环境,而不是在小屋子里。此外我们还需要对UI的比例进行适当调整,具体要根据产品的实际需求来定。我们最好把UI放在一个舒适的可读距离,并进行相应的缩放。关于这一点可以参考Main Menu场景中的UI:它被放置在几米远的位置,因此图片和文字都比较大,看起来很舒服。当我们把UI放在离用户有一定距离的时候,可能会发现UI重叠到其它物体上。关于这一点可以查看上一篇教程( ),看看如何修改shader让其绘制在其它对象上,或者直接使用VR Samples项目中的shader。这个shader也适用于文本。很多开发者想要把UI关联到摄像机上,这样当玩家移动的时候,UI会保持在一个固定的位置。这样做对十字准星或其它小物体可能会比较合适,不过对于比较大的UI元素,就好比把一张报纸放到你的脸上,很容易让用户感到不舒服,甚至是眩晕。我们可以看一看Shooter 360(Target Arena)场景中的UI,其中UI会在一个较短的延迟后移动到视野中,从而可以让用户四处查看进而熟悉身边的环境,而不是直接把UI固定到他们的视野中,导致视觉模糊。虽然VR可以让用户探索360度沉浸式环境,不过有时候我们需要提醒用户关注某个特定的方向。在某些场景中,我们使用世界中的箭头来帮助引导用户的注意力。这些箭头会根据用户的朝向来淡入淡出。这些功能可以在GUIArrows 预设中找到,而且很容易重用。其工作原理是比较用户头部和目标方向之间的角度。如果头部在预设角度之外(参考下面GUIArrows组件的Show Angle),箭头就会淡入。当用户向目标的方向注视时,箭头就会开始淡出。Diegetic UI(剧情型UI)Spatial UI的替代方案是让环境中的物体自行向用户展示信息。具体的形式可能是墙上的闹钟,电视、计算机屏幕、移动手机,或是未来枪械的全息展示。这就是所谓的剧情型UI。下图展示了Flyer场景中的太空飞船,以及Shooter(Target)场景中的枪支。虽然这种交互不算严格意义上的剧情型UI,但是将用户界面跟游戏对象关联在一起,可以让我们大概了解Unity的剧情型UI是如何工作的。关于UI的延伸阅读信息关于UI类型的更详细分析(不涉及到VR),可以参考这篇文章。UI交互通过使用Interaction in VR一文中所提到的VREyeRaycaster, VRInput和VRInteractiveItem,我们可以创建基本的UI交互元素,具体方法是创建一个订阅VRInteractiveItem事件的类。关于这一点的更多信息,可以参考上一篇教程(),特别是Maze场景中的switch。此外,在VRSamples中每个游戏的开始,我们都使用了UI交互指导用户。关于如何在VR中使用Unity UI,可以参考 这篇文章,其中还提供了示例代码。VR Samples场景中的UI接下来让我们看看以上所提到的概念在VR Samples场景中的具体实现:Menu(菜单)场景Menu场景中的UI使用了定制的纹理来创造一个弯曲的密封环境。可以使用Interaction in VR一文中的相同方法跟这些纹理进行交互。Flyer场景游戏简介和游戏结束的UI使用静态的方式放置在世界空间中。不过为了呈现跟游戏相关的信息,我们可以使用跟太空飞船关联的世界空间UI,也就是剧情型UI。考虑到飞船必须时刻出现在用户的视野中,因此在飞船四周显示相关信息是靠谱的。与此同时,UI元素会旋转以面向摄像机,这样就会避免倾斜,同时确保UI的显示对用户友好。Maze场景在Maze 场景中,我们使用Spatial UI来提供游戏引导和结束。Spatial UI还可以用来提示用户进行交互:Shooter 180(Target Gallery)场景在游戏引导和结束部分,我们再次使用了静态的Spatial UI.正如上面所提到的,我们在枪支上使用剧情型UI来显示倒计时和得分。Shooter 360(Target Arena)场景在这个场景中依然使用了Spatial UI,不过做了一些小的调整:当360度竞技场中发生了某个动作,比如当用户四处查看环境时,我们会让UI元素在经过一个短时间的延迟后移动到视野中间。通过这种方式可以让用户知道四处探查所处的环境。在枪支上我们再次使用了剧情型UI。VR中的文本抗锯齿为了在VR世界中实现免费的文本抗锯齿效果,这里有一个小技巧,在Worldspace Canva中使用Canvas Scaler。在相关设置中,我们需要将”Reference Pixels Per Unit”设置为1,然后调整”Dynamic Pixels Per Unit”,直到文本的边缘柔化。在下图中,我们可以看到不同设置的实际显示效果。看完本教程,我们对不同的用户界面应该有了基本的概念,也知道在VR中应该使用哪种UI。当然,我们还可以使用VREyeRaycaster,VRInput和VRInteractiveItem来创建基本的UI交互。关于VR UI的更多信息,可以查看Oculus官方博客的在下一篇教程中,我们将了解VR中的运动。","state":"published","sourceUrl":"","pageCommentsCount":0,"canComment":false,"snapshotUrl":"","slug":,"publishedTime":"T11:26:54+08:00","url":"/p/","title":"不知道怎么开发VR游戏?Unity5.3官方VR教程重磅登场-系列4 VR中的用户界面","summary":"在设计VR应用的用户界面时要考虑很多因素,而这些因素对于传统应用或游戏的界面设计可能都不是事儿。下面我们会看看作为一个VR开发者在设计用户界面时可能会遇到的一些问题,以及跟硬件相关的一些东西。UI分辨率和画质目前DK2的分辨率是(单目是960…","reviewingCommentsCount":0,"meta":{"previous":null,"next":null},"commentPermission":"anyone","commentsCount":0,"likesCount":16}},"annotationDetail":null,"commentsCount":3,"likesCount":32,"FULLINFO":true}},"User":{"eseedo":{"isFollowed":false,"name":"王寒","headline":"Create a world like Caprica.","avatarUrl":"/7dd67dbfe_s.jpg","isFollowing":false,"type":"people","slug":"eseedo","bio":"Apple,SF,Psychology","hash":"4c9dd7ce259e3e6ae2f0fa6ca42801ee","uid":00,"isOrg":false,"description":"Create a world like Caprica.","profileUrl":"/people/eseedo","avatar":{"id":"7dd67dbfe","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false,"badge":{"identity":null,"bestAnswerer":null}}},"Comment":{},"favlists":{}},"me":{},"global":{"experimentFeatures":{"ge3":"ge3_9","ge2":"ge2_1","appStoreRateDialog":"close","nwebStickySidebar":"sticky","qrcodeLogin":"qrcode","favAct":"default","default":"None","mobileQaPageProxyHeifetz":"m_qa_page_nweb","newMore":"new","iOSNewestVersion":"4.2.0","newMobileColumnAppheader":"new_header","sendZaMonitor":"true","homeUi2":"default","answerRelatedReadings":"qa_recommend_by_algo_related_with_article","wechatShareModal":"wechat_share_modal_show","liveReviewBuyBar":"live_review_buy_bar_2","qaStickySidebar":"sticky_sidebar","androidProfilePanel":"panel_b","liveStore":"ls_a2_b2_c1_f2","zcmLighting":"zcm"}},"columns":{"next":{},"kidscoding":{"following":false,"canManage":false,"href":"/api/columns/kidscoding","name":"笨猫快乐学编程","creator":{"slug":"eseedo"},"url":"/kidscoding","slug":"kidscoding","avatar":{"id":"f9a1d3e049","template":"/{id}_{size}.jpeg"}}},"columnPosts":{},"columnSettings":{"colomnAuthor":[],"uploadAvatarDetails":"","contributeRequests":[],"contributeRequestsTotalCount":0,"inviteAuthor":""},"postComments":{},"postReviewComments":{"comments":[],"newComments":[],"hasMore":true},"favlistsByUser":{},"favlistRelations":{},"promotions":{},"switches":{"couldAddVideo":false},"draft":{"titleImage":"","titleImageSize":{},"isTitleImageFullScreen":false,"canTitleImageFullScreen":false,"title":"","titleImageUploading":false,"error":"","content":"","draftLoading":false,"globalLoading":false,"pendingVideo":{"resource":null,"error":null}},"drafts":{"draftsList":[],"next":{}},"config":{"userNotBindPhoneTipString":{}},"recommendPosts":{"articleRecommendations":[],"columnRecommendations":[]},"env":{"edition":{},"isAppView":false,"appViewConfig":{"content_padding_top":128,"content_padding_bottom":56,"content_padding_left":16,"content_padding_right":16,"title_font_size":22,"body_font_size":16,"is_dark_theme":false,"can_auto_load_image":true,"app_info":"OS=iOS"},"isApp":false},"sys":{},"message":{"newCount":0},"pushNotification":{"newCount":0}}

我要回帖

更多关于 现在开串串店前景怎样 的文章

 

随机推荐