摘要
对于缺少经验的新手来说如何使用Unity快速创建虚拟现实内容,本案例示范了利用流行的免费插件VRTK创建名为“Jump Start Your Car Battery”的VR项目的方法和步骤。(笔者注:案例使用Unity版本是2018.3.1)
目标
通过本案例你将学会如何:
-
创建场景——摆放物体,使用3D模型搭建场景。
-
创建交互行为(拾取,投掷)。
-
吸附到目标区域(当你在SDZ附近放置一个对象时,它会自动吸附到位)。
-
自定义触发高亮区域。
-
自定义高亮颜色和3D模型。
本案例所需素材
第1课 下载示例项目并配置VRTK环境
(一)准备工作
- 下载VRTK-master项目压缩包,本压缩包已经包含有VRTK插件。
- 解压缩到本地磁盘。
- 在Unity Hub窗口,添加该项目。
(二)打开下载的VRTK-master项目,在Unity中检查Virtual Reality Supported是否勾选:
- 在Unity软件中,选择主菜单->编辑->Project Settings->Player,在检视器中打开PlayerSettings设置面板。
- 在设置面板找到“XR Settings”项展开,确认“Virtual Reality Supported”已经勾选。
(三)确认Scripting Runtime Version已经设置为“.NET 4.x Equivalent”
连接好HTC VIVE套件,打开项目中的ExampleScene场景,试玩。
第2课 搭建VR场景VR Placing Assets (using VRTK)
(一)复制示例场景
- 在Assets根目录下新建“Scenes”文件夹。
- 导航到VRTK > Samples > Farm > Scenes,按住Ctr键将ExampleScene场景拖动到上一步创建的Scenes文件夹以创建副本。
- 将场景副本重命名为“JumpStart”,双击打开。
(二)从资源商店导入小汽车3D模型
- 在Unity资源商店以关键词“low poly car”搜索。
- 找到需要的小汽车模型,导入到Unity项目中。
(三)下载/重命名Clamp(夹具)和 2 Batteries(电池)模型
- 在Assets根目录下新建“Models”文件夹。
- 将准备好的Clamp.fbx、GoodBattery.fbx、DeadBattery.fbx和小汽车模型拖到此文件夹。
(四)添加小车和电池到场景中
-
导航至Assets > Models > Car V1文件夹,拖到 "car_v1" 到场景中,放置到黄色箭头附近(世界坐标原点附近)。
-
在Inspector面板,将小车沿Y轴旋转180度。
-
在Hierarchy 面板, 展开 car_v1 以显示子物体。
-
选择其下的 hood ,在Inspector面板沿X轴旋转hood,使引擎盖打开至适合的角度(参考值-37度)。
-
在Hierarchy 面板对小车复制一份,分别重命名为"Good Car" 和"Dead Car"。
-
选择Dead Car, 使用移动工具将其移至Good Car前面,,沿Y轴旋转180度 (使两辆车面对面位于 yellow starting arrows对侧)。
-
将Models文件中的good battery 和dead battery模型拖到场景中,分别放置到Good Car和Dead Car的引擎中,摆好位置。
-
创建两个立方体,分别放置到两辆小车驾驶员后视镜附近。
(五)调整模型大小
- 在Inspector面板,分别缩放两辆小车模型的尺寸至(0.6,0.6,0.6)。
- 同样,分别缩放两个立方体的尺寸至(0.6,0.6,0.6)。
- 使用“顶点捕捉”,通过按住V键并抓住立方体底部的方形图标,可以将立方体完美地贴合在地面上。
第3课 添加可交互物体VR Interactable Objects (using VRTK)
(一)创建材质(红色材质和黑色材质)
- 在Project面板Assets根目录下创建文件夹“Materials”。
- 在Materials文件夹中创建两个材质,分别更改材质颜色为红色和黑色,并把材质分别命名为“Red”和“Black”。
(二)添加可交互立方体
- 在Assets文件夹中,依次展开VRTK>prefables>Interactions>interactiables,拖动"Interactable.Primary_Grab.Secondary_Swap" 预置体到场景中;这看起来就是一个普通的立方体。
- 缩放立方体的尺寸至(0.5,0.5,0.5)。
- 把上一步创建的Red材质指定给立方体。
- 运行,试着用HTC VIVE手柄拾取立方体。
(三)改变可交互立方体的形状为夹具(Clamp)
- 如上图所示,在 Hierarchy面板展开 Interactable.Primary_Grab物体,选择其中的DefaultMesh。
- 在Inspector面板找到"Cube (Mesh Filter)" ,单击右侧拾取按钮,然后选择资源中的夹具模型(“Mesh1_Model”)。
- 该预置体的形状看起来像个夹具了。
(四)调节夹具物体的碰撞盒
原来的碰撞盒是Box Collider,相比夹具模型而言尺寸太大了。调节该碰撞盒的尺寸和位置使之贴合夹具模型。也可以采用另一种方法,就是删除原来的Box Collider,重新添加一个Box Collider,会自动适配模型的尺寸。具体步骤省略。
(五)放置夹具(Clamps)
- 在Hierarchy面板选择夹具的父对象,使用顶点捕捉(按住V键),将夹具模型放置到作为工作台的立方体上面,命名为“RedClamp”。
- 复制RedClamp,命名为BlackClamp,分别指定Red材质和Black材质,摆放好位置。
-
选择RedClamp和BlackClamp(按住Shift键并单击),然后单击鼠标右键>复制。将新的夹具组移动到另一个桌子立方体上,并在Y轴上将它们旋转-90度。
第4课 创建可触发区域VR Snap Zones (using VRTK)
(一)测试新的激活区(New Snap Zone Testing)
- 在Prodejc面板,找到Assets>VRTK>prefables>Interactions>interactivatablesnapzone,将其拖到场景中,放置到两车之间空闲的地方。
- 为了让我们清楚SZ在哪里,创建一个圆柱体作为桌子使用(GameObject 菜单 >3D Object > Cylinder),并将其移动到SZ附近的桌子高度。
- 移动SZ至圆柱体顶部位置。
(二)设置SZ激活区(SZ Activation Area)
-
在 Hierarchy面板,展开InteractiableSnapZone,选中Activation Area。
-
在Inspector面板找到Sphere Collider,这就是激活区,尝试将其中的半径值更改为0.2。
运行,试着用手柄拾取其中一个夹具,靠近激活区观察变化。
(三)更改激活区高亮显示模型(Changing the Snap Zone Highlight Mesh)
- 在 Hierarchy面板依次展开InteractableSnapZone > SnapDestination > DestinationHighlight > HighlightableMeshContainer,选中其下的子物体DefaultHighlightMesh。
- 在Inspector面板找到Mesh组件,更改为Clamp模型。
- 将其尺寸改为(0.5,0.5,0.5)。
(四)改变高亮显示物体的外观(Changing Highlight from Outline to Translucent)
- 确认选中DefaultHighlightMesh的情况下,在Inspector面板中找到并选择SnapZoneHighlight,将其复制到Marerials文件夹;修改材质类型为Standard,拖动到Inspector面板原来位置以替代之前的材质。(笔者注:把VRTK线框材质更改为标准材质)
- 在Shader下拉列表中选择Standard。
- 更改颜色的透明度(参考值41),使呈现半透明效果。
(五)对SZ进行转换、缩放和旋转设置(Transition,Scale, and Rotation of SZ's)
-
在 Hierarchy面板选择父物体InteractiableSnapZone,在Inspector面板将“Transition Duration”修改为0.5。这意味着当物体被释放时,它需要半秒钟的时间才能在新的位置显现。
-
要对SZ做缩放或旋转,在 Hierarchy面板选择InteractiableSnapZone>SnapDestination>DestinationLocation,在Inspector面板修改相应的参数。作为示范,我使用了Scale: 5,5,5 Rotation: 70,70,70。在游戏测试中,你会发现到一个夹具被放在SZ中时将会出现一个看起来很庞大的半透明夹具。
(六)设置激活区的有效性(Snap Zone Validity)——只对特定物体起作用
- 正式开始新的步骤前,让我们先整理一下项目的 Hierarchy面板:把靠近Good Car的红色夹具命名为“RedClampGood”,黑色夹具命名为“BlackClampGood”;同样,靠近Dead Car的红色夹具命名为“RedClampDead”,另一个命名为“BlackClampDead”;重设DestinationLocation的变换值至初识参数(Scale 1,1,1)。
- 仅让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)
- 复制前面添加的interactiablesnapzone,将其中一个命名为“test SZ”,另一个命名为“GoodRedSZ”。
- 将GoodRedSZ移动到Good Battery 正极端子的位置(将其在Y轴上旋转-90度,同时将Z轴旋转约13度)。
- 在 Hierarchy面板,选择GoodRedSZ > Activation Area,调节半径值(我使用的是0.25)。
(八)在运行模式细调GoodRedSZ的位置(Positioning in Play Mode)
- 进入运行模式,然后将RedClampGood 放到电池正极上。这时从VR眼镜看的话,显得太大了,位置也不对!
- 不退出播放模式,在 Hierarchy面板选择GoodRedSZ > Snap Destination > DestinationLocation,到Inspector面板调节其Transform组件的值,使RedClampGood的位置和大小看起来更加真实。
- 在运行模式下更改的参数停止运行后将恢复原来的值,所以我们要在运行模式 下复制Transform组件的值,退出运行模式后粘贴Transform组件的值。
(九)复制出Black SZ(Duplicate Red to Black SZ)
- 复制GoodRedSZ,并重命名为“GoodBlackSZ”,移动到Good Battery的负极端子的位置。
- 在层级面板依次展开InteractiableSnapZone>SnapDestination>DestinationHighlight>HighlightableMeshContainer,然后选择DefaultHighlightMesh,更改材质颜色为黑色。
- 选择根“GoodBlackSZ”,在名为“Unity Object observatable List”的组件中,用BlackClampGood替换RedClampGood。
第5课 VR用户界面(VR User Interface)
在本课你将学习如何使用Text Mesh Pro创建好看的文本,导入自定义字体并与Text Mesh Pro一起使用,精确设置交互对象的抓取位置,避免游离于你的手之外。
(一)创建新的世界空间画布(New Canvas in World Space)
- GameOBject > UI > Canvas。
- 在检视器面板,设置画布的Render Mode为 World Space。
- 将“宽度”设置为3,“高度”设置为4,将X位置设置为-4.23,Y位置设置为2.06,在Y轴上旋转画布-90。
- 为画布添加文本对象(右键单击>UI>TextMeshPro)。如果没有TMP,请转到Window > Package Manager ,安装它。
- 在检视器面板,将“文字宽度”设置为3,将“高度”设置为4,将“字体大小”设置为0.7,并将文本居中。
(二)自定义文本(Custom Google Fonts)
- 找一个字体文件,导入到Unity资源文件夹。
- 要让字体为TextMeshPro(TMP),转到Window > TextMeshPro > Font Asset Creator。
- 在Font Asset Creator窗口,拖拽字体文件给 "Source Font File",点击 "Generate Font Atlas" 按钮,点击"Save As"。(作为示范,我选择的存放位置是 Assets > TextMeshPro > Resources > Fonts & Materials文件夹。)关闭Font Asset Creator窗口
- 在层级面板选择TextMeshPro文本后,将新创建的TMP字体资源(F icon) 拖到检视器面板的 "Font Asset"字段中。
(三)格式化文本(Formatting Text)
-
调整字体大小,使“Jump Start!”位于同一行。
-
在检视器面板添加“Underlay”(阴影)。我使用了设置:偏移X:.46,偏移Y:-.82,柔和度:.137。
-
在层级面板,复制TMP文本(Control+D),将标题命名为“JumpStartText”,将新副本命名为“Directions”。
-
在Inspector的文本字段中,添加导航文字,我用了这段文字:
Red Good
Red Dead
Black Good
Black Dead
文本左对齐,在层级面板中选择画布并将其沿Y轴向下移动到适合的位置,使文字排版美观易阅读。
(四)为文本添加布告牌背景(Billboard Background for Text)
-
从Assets>VRTK>prefables>Interactions>interactivatables中选择我们之前曾经使用过的预置立方体"Interactable.Primary_Grab.Secondary_Swap"。
-
将立方体比例设置为X:1、Y:2.59、Z:3.2,位置设置为X:-4.85、Y:1.31和Z:-0.8。
-
在层级面板,将可交互预制体重命名为“Billboard”。
-
将前面创建的画布放给Billboard,成为其子对象。
(五)Clipboard-sized Instructions
-
在层级面板,复制(control+D)Billboard,将其命名为 "Clipboard"。
-
将 "Clipboard"的比例设置为X:0.1、Y:0.2、Z:0.2,使用顶点捕捉(控制+拖动)将其放置到夹具工作台上。
提示:为方便操作,可临时隐藏“testsz”和Cylinder。
(六)调整交互对象的精确抓取位置(Adjustments and Precision Grabbing Objects)
- 在层级面板中,选择Clipboard中的画布,调整它的X位置,使它更靠近立方体。我用X:0.51。
-
在层级面板依次展开Clipboard > Interaction Logic > Interactable.GrabLogic > Actions > PrimaryAction ,选中其下 Interactable.GrabAction.FollowAction。
-
在检视器面板找到Grab Interactable Follow Action(Script)组件,在“Grab Offset”字段右侧下拉菜单选择“Precision Point”。
-
运行,测试差异。