Unity官方教程——VR in Unity: A Beginner‘s Guide (using VRTK)转译

摘要

对于缺少经验的新手来说如何使用Unity快速创建虚拟现实内容,本案例示范了利用流行的免费插件VRTK创建名为“Jump Start Your Car Battery”的VR项目的方法和步骤。(笔者注:案例使用Unity版本是2018.3.1)

目标

通过本案例你将学会如何:

  1. 创建场景——摆放物体,使用3D模型搭建场景。

  2. 创建交互行为(拾取,投掷)。

  3. 吸附到目标区域(当你在SDZ附近放置一个对象时,它会自动吸附到位)。

  4. 自定义触发高亮区域。

  5. 自定义高亮颜色和3D模型。

本案例所需素材

Low Poly Car

Clamp.fbx

Gooery.fbx

Deaery.fbx

Lesson Plans-VR in Unity.zip

第1课 下载示例项目并配置VRTK环境

(一)准备工作

  1. 下载VRTK-master项目压缩包,本压缩包已经包含有VRTK插件。
  2. 解压缩到本地磁盘。
  3. 在Unity Hub窗口,添加该项目。

(二)打开下载的VRTK-master项目,在Unity中检查Virtual Reality Supported是否勾选:

  1. 在Unity软件中,选择主菜单->编辑->Project Settings->Player,在检视器中打开PlayerSettings设置面板。
  2. 在设置面板找到“XR Settings”项展开,确认“Virtual Reality Supported”已经勾选。

(三)确认Scripting Runtime Version已经设置为“.NET 4.x Equivalent”

连接好HTC VIVE套件,打开项目中的ExampleScene场景,试玩。

第2课 搭建VR场景VR Placing Assets (using VRTK)

(一)复制示例场景

  1. 在Assets根目录下新建“Scenes”文件夹。
  2. 导航到VRTK > Samples > Farm > Scenes,按住Ctr键将ExampleScene场景拖动到上一步创建的Scenes文件夹以创建副本。
  3. 将场景副本重命名为“JumpStart”,双击打开。

(二)从资源商店导入小汽车3D模型

  1. 在Unity资源商店以关键词“low poly car”搜索。
  2. 找到需要的小汽车模型,导入到Unity项目中。

(三)下载/重命名Clamp(夹具)和 2 Batteries(电池)模型

  1. 在Assets根目录下新建“Models”文件夹。
  2. 将准备好的Clamp.fbx、GoodBattery.fbx、DeadBattery.fbx和小汽车模型拖到此文件夹。

(四)添加小车和电池到场景中

  1. 导航至Assets > Models > Car V1文件夹,拖到 "car_v1" 到场景中,放置到黄色箭头附近(世界坐标原点附近)。

  2. 在Inspector面板,将小车沿Y轴旋转180度。

  3. 在Hierarchy 面板, 展开 car_v1 以显示子物体。

  4. 选择其下的 hood ,在Inspector面板沿X轴旋转hood,使引擎盖打开至适合的角度(参考值-37度)。

  5. 在Hierarchy 面板对小车复制一份,分别重命名为"Good Car" 和"Dead Car"。

  6. 选择Dead Car, 使用移动工具将其移至Good Car前面,,沿Y轴旋转180度 (使两辆车面对面位于 yellow starting arrows对侧)。

  7. 将Models文件中的good battery 和dead battery模型拖到场景中,分别放置到Good Car和Dead Car的引擎中,摆好位置。

  8. 创建两个立方体,分别放置到两辆小车驾驶员后视镜附近。

(五)调整模型大小

  1. 在Inspector面板,分别缩放两辆小车模型的尺寸至(0.6,0.6,0.6)。
  2. 同样,分别缩放两个立方体的尺寸至(0.6,0.6,0.6)。
  3. 使用“顶点捕捉”,通过按住V键并抓住立方体底部的方形图标,可以将立方体完美地贴合在地面上。

第3课 添加可交互物体VR Interactable Objects (using VRTK)

(一)创建材质(红色材质和黑色材质)

  1. 在Project面板Assets根目录下创建文件夹“Materials”。
  2. 在Materials文件夹中创建两个材质,分别更改材质颜色为红色和黑色,并把材质分别命名为“Red”和“Black”。

(二)添加可交互立方体

  1. 在Assets文件夹中,依次展开VRTK>prefables>Interactions>interactiables,拖动"Interactable.Primary_Grab.Secondary_Swap" 预置体到场景中;这看起来就是一个普通的立方体。
  2. 缩放立方体的尺寸至(0.5,0.5,0.5)。
  3. 把上一步创建的Red材质指定给立方体。
  4. 运行,试着用HTC VIVE手柄拾取立方体。

(三)改变可交互立方体的形状为夹具(Clamp)

  1. 如上图所示,在 Hierarchy面板展开 Interactable.Primary_Grab物体,选择其中的DefaultMesh。
  2. 在Inspector面板找到"Cube (Mesh Filter)" ,单击右侧拾取按钮,然后选择资源中的夹具模型(“Mesh1_Model”)。
  3. 该预置体的形状看起来像个夹具了。

(四)调节夹具物体的碰撞盒

原来的碰撞盒是Box Collider,相比夹具模型而言尺寸太大了。调节该碰撞盒的尺寸和位置使之贴合夹具模型。也可以采用另一种方法,就是删除原来的Box Collider,重新添加一个Box Collider,会自动适配模型的尺寸。具体步骤省略。

(五)放置夹具(Clamps)

  1. 在Hierarchy面板选择夹具的父对象,使用顶点捕捉(按住V键),将夹具模型放置到作为工作台的立方体上面,命名为“RedClamp”。
  2. 复制RedClamp,命名为BlackClamp,分别指定Red材质和Black材质,摆放好位置。
  3. 选择RedClamp和BlackClamp(按住Shift键并单击),然后单击鼠标右键>复制。将新的夹具组移动到另一个桌子立方体上,并在Y轴上将它们旋转-90度。

第4课 创建可触发区域VR Snap Zones (using VRTK)

(一)测试新的激活区(New Snap Zone Testing)

  1. 在Prodejc面板,找到Assets>VRTK>prefables>Interactions>interactivatablesnapzone,将其拖到场景中,放置到两车之间空闲的地方。
  2. 为了让我们清楚SZ在哪里,创建一个圆柱体作为桌子使用(GameObject 菜单 >3D Object > Cylinder),并将其移动到SZ附近的桌子高度。
  3. 移动SZ至圆柱体顶部位置。

(二)设置SZ激活区(SZ Activation Area)

  1. 在 Hierarchy面板,展开InteractiableSnapZone,选中Activation Area。

  2. 在Inspector面板找到Sphere Collider,这就是激活区,尝试将其中的半径值更改为0.2。

运行,试着用手柄拾取其中一个夹具,靠近激活区观察变化。

(三)更改激活区高亮显示模型(Changing the Snap Zone Highlight Mesh)

  1. 在 Hierarchy面板依次展开InteractableSnapZone > SnapDestination > DestinationHighlight > HighlightableMeshContainer,选中其下的子物体DefaultHighlightMesh。
  2. 在Inspector面板找到Mesh组件,更改为Clamp模型。
  3. 将其尺寸改为(0.5,0.5,0.5)。

(四)改变高亮显示物体的外观(Changing Highlight from Outline to Translucent)

  1. 确认选中DefaultHighlightMesh的情况下,在Inspector面板中找到并选择SnapZoneHighlight,将其复制到Marerials文件夹;修改材质类型为Standard,拖动到Inspector面板原来位置以替代之前的材质。(笔者注:把VRTK线框材质更改为标准材质)
  2. 在Shader下拉列表中选择Standard。
  3. 更改颜色的透明度(参考值41),使呈现半透明效果。

(五)对SZ进行转换、缩放和旋转设置(Transition,Scale, and Rotation of SZ's)

  1. 在 Hierarchy面板选择父物体InteractiableSnapZone,在Inspector面板将“Transition Duration”修改为0.5。这意味着当物体被释放时,它需要半秒钟的时间才能在新的位置显现。

  2. 要对SZ做缩放或旋转,在 Hierarchy面板选择InteractiableSnapZone>SnapDestination>DestinationLocation,在Inspector面板修改相应的参数。作为示范,我使用了Scale: 5,5,5 Rotation: 70,70,70。在游戏测试中,你会发现到一个夹具被放在SZ中时将会出现一个看起来很庞大的半透明夹具。

(六)设置激活区的有效性(Snap Zone Validity)——只对特定物体起作用

  1. 正式开始新的步骤前,让我们先整理一下项目的 Hierarchy面板:把靠近Good Car的红色夹具命名为“RedClampGood”,黑色夹具命名为“BlackClampGood”;同样,靠近Dead Car的红色夹具命名为“RedClampDead”,另一个命名为“BlackClampDead”;重设DestinationLocation的变换值至初识参数(Scale 1,1,1)。
  2. 仅让SZ对红色夹具起作用,对其他物体不起作用的做法如下:
  • 在 Hierarchy面板选中InteractableSnapZone,在Inspector面板为其添加组件“List Contains Rule”。

  • 添加另一个名为“Unity Object Observable List”的组件,以保存可以放入SZ的对象列表。

  • 在“Unity Object Observable List”组件的底部,将Element size从0更改为1。

  • 从 Hierarchy面板将RedClampGood拖到“Unity Object Observable List”组件的Element 0字段中。

  • 将“Unity Object Observable List”组件拖到“List Contains Rule”组件的Objects field 。

  • 将“List Contains Rule”拖给“Snap Zone Facade”组件的Snap Validity字段。

  • 播放测试。

(七)放置Red SZ(Positioning the Red SZ)

  1. 复制前面添加的interactiablesnapzone,将其中一个命名为“test SZ”,另一个命名为“GoodRedSZ”。
  2. 将GoodRedSZ移动到Good Battery 正极端子的位置(将其在Y轴上旋转-90度,同时将Z轴旋转约13度)。
  3. 在 Hierarchy面板,选择GoodRedSZ > Activation Area,调节半径值(我使用的是0.25)。

(八)在运行模式细调GoodRedSZ的位置(Positioning in Play Mode)

  1. 进入运行模式,然后将RedClampGood 放到电池正极上。这时从VR眼镜看的话,显得太大了,位置也不对!
  2. 不退出播放模式,在 Hierarchy面板选择GoodRedSZ > Snap Destination > DestinationLocation,到Inspector面板调节其Transform组件的值,使RedClampGood的位置和大小看起来更加真实。
  3. 在运行模式下更改的参数停止运行后将恢复原来的值,所以我们要在运行模式 下复制Transform组件的值,退出运行模式后粘贴Transform组件的值。

(九)复制出Black SZ(Duplicate Red to Black SZ)

  1. 复制GoodRedSZ,并重命名为“GoodBlackSZ”,移动到Good Battery的负极端子的位置。
  2. 在层级面板依次展开InteractiableSnapZone>SnapDestination>DestinationHighlight>HighlightableMeshContainer,然后选择DefaultHighlightMesh,更改材质颜色为黑色。
  3. 选择根“GoodBlackSZ”,在名为“Unity Object observatable List”的组件中,用BlackClampGood替换RedClampGood。

第5课 VR用户界面(VR User Interface)

在本课你将学习如何使用Text Mesh Pro创建好看的文本,导入自定义字体并与Text Mesh Pro一起使用,精确设置交互对象的抓取位置,避免游离于你的手之外。

(一)创建新的世界空间画布(New Canvas in World Space)

  1. GameOBject > UI > Canvas。
  2. 在检视器面板,设置画布的Render Mode为 World Space。
  3. 将“宽度”设置为3,“高度”设置为4,将X位置设置为-4.23,Y位置设置为2.06,在Y轴上旋转画布-90。
  4. 为画布添加文本对象(右键单击>UI>TextMeshPro)。如果没有TMP,请转到Window > Package Manager ,安装它。
  5. 在检视器面板,将“文字宽度”设置为3,将“高度”设置为4,将“字体大小”设置为0.7,并将文本居中。

(二)自定义文本(Custom Google Fonts)

  1. 找一个字体文件,导入到Unity资源文件夹。
  2. 要让字体为TextMeshPro(TMP),转到Window > TextMeshPro > Font Asset Creator。
  3. 在Font Asset Creator窗口,拖拽字体文件给 "Source Font File",点击 "Generate Font Atlas" 按钮,点击"Save As"。(作为示范,我选择的存放位置是 Assets > TextMeshPro > Resources > Fonts & Materials文件夹。)关闭Font Asset Creator窗口
  4. 在层级面板选择TextMeshPro文本后,将新创建的TMP字体资源(F icon) 拖到检视器面板的 "Font Asset"字段中。

(三)格式化文本(Formatting Text)

  1. 调整字体大小,使“Jump Start!”位于同一行。

  2. 在检视器面板添加“Underlay”(阴影)。我使用了设置:偏移X:.46,偏移Y:-.82,柔和度:.137。

  3. 在层级面板,复制TMP文本(Control+D),将标题命名为“JumpStartText”,将新副本命名为“Directions”。

  4. 在Inspector的文本字段中,添加导航文字,我用了这段文字:

Red Good
Red Dead
Black Good
Black Dead

文本左对齐,在层级面板中选择画布并将其沿Y轴向下移动到适合的位置,使文字排版美观易阅读。

(四)为文本添加布告牌背景(Billboard Background for Text)

  1. 从Assets>VRTK>prefables>Interactions>interactivatables中选择我们之前曾经使用过的预置立方体"Interactable.Primary_Grab.Secondary_Swap"。

  2. 将立方体比例设置为X:1、Y:2.59、Z:3.2,位置设置为X:-4.85、Y:1.31和Z:-0.8。

  3. 在层级面板,将可交互预制体重命名为“Billboard”。

  4. 将前面创建的画布放给Billboard,成为其子对象。

(五)Clipboard-sized Instructions

  1. 在层级面板,复制(control+D)Billboard,将其命名为 "Clipboard"。

  2. 将 "Clipboard"的比例设置为X:0.1、Y:0.2、Z:0.2,使用顶点捕捉(控制+拖动)将其放置到夹具工作台上。

提示:为方便操作,可临时隐藏“testsz”和Cylinder。

(六)调整交互对象的精确抓取位置(Adjustments and Precision Grabbing Objects)

  1. 在层级面板中,选择Clipboard中的画布,调整它的X位置,使它更靠近立方体。我用X:0.51。
  2. 在层级面板依次展开Clipboard > Interaction Logic > Interactable.GrabLogic > Actions > PrimaryAction ,选中其下 Interactable.GrabAction.FollowAction。

  3. 在检视器面板找到Grab Interactable Follow Action(Script)组件,在“Grab Offset”字段右侧下拉菜单选择“Precision Point”。

  4. 运行,测试差异。

猜你喜欢

转载自blog.csdn.net/weixin_42350593/article/details/113609307