开发前的准备
开发工具
1.unity 2017.3.1f1
2.HTC VIVE
3.steam
开发所需插件
1.steam VR(去steam上下载即可)
2.Steam VR Plugin(unity的商店下载即可,我的版本是V1.2.3)
3.VIVE Input Utility(unity的商店即可下载,我的版本是V1.8.3)
4.UGUI
安装
去百度里找HTC VIVE的安装教程即可(两个基站的通道一个是A一个是b即可)
开发测试过程
- 首先导入VIVE Input Unility包,导入时如下图,选择Accept All。
- 导入后会出现一个HTC.UnityPlugin文件夹,在文件夹里会有给的案例,可以通过案例进行学习
- 导入Steam VR Plugin包,因为我用的unity是2017.3.1f1版本,所有会一些错误,接下来开始改错
- 通过报错找到代码所指向的地方,把所有的VR全部改成XR,但是这里面还会有一个错误,XRSetting的一个方法过时了,换成另一个方法即可
案例一:button 按钮
- 首先新建一个场景,在场景中把main camera去掉,然后在刚才导入的文件夹的Prefabs文件里找到ViveCameraRig和VivePointers两个预制体,导入到场景中即可
- 在场景中添加UGUI的button按钮,然后把EventSystem去掉
- 把canvas物体上的canvas组件中的Render Mode改为World space(世界坐标)
- 把canvas画布上面的canvas Scaler和Graphic Raycaster组件去掉
- 把canvas上canvas组件中的Addition Shader Channes的值选中TexCoord1、Normal和Tangent(每次打开选中一个,打开三次依次选中三个即可)
- 在canvas上面添加canvas Raycast Target脚本
- 然后把canvas缩小到原来的0.01,然后把canvas移动到ViveCameraRig摄像头能看到的地方,最好先移动到摄像头在的位置,然后微调,离摄像头近一些,否则手柄射线无法扫描到button,就无法进行点击
- 接着连接HTC VIVE设备直接运行即可
案例二:2D Drag&Drop(拖拽)
- 跟案例一一样建立一个UGUI的场景,把案例一中的button换成image
- 创建一个脚本(作者脚本名字UIDropDrag),然后在脚本中继承IBeginDragHandler,IDragHandler,IEndDragHandler并实现接口
脚本如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class UIDropDrag : MonoBehaviour, IBeginDragHandler,IDragHandler,IEndDragHandler
{
private RectTransform DragObject; //保留拖拽物体
public void OnBeginDrag(PointerEventData eventData) //开始拖拽
{
DragObject = eventData.pointerEnter.transform as RectTransform; //初始化拖拽物体
SetDraggedPosition(eventData); //设置拖拽物体的坐标
}
public void OnDrag(PointerEventData eventData) //正在拖拽
{
if (DragObject != null) //判断拖拽物体是否为空
SetDraggedPosition(eventData); //设置拖拽物体的坐标
}
public void OnEndDrag(PointerEventData eventData)
{
if (DragObject != null)
{
SetDraggedPosition(eventData); //设置拖拽物体的坐标
DragObject = null; //清空拖拽物体
}
}
//设置拖拽物体坐标
private void SetDraggedPosition(PointerEventData eventData)
{
var rt = DragObject.GetComponent<RectTransform>();
Vector3 globalMousePos;
if (RectTransformUtility.ScreenPointToWorldPointInRectangle(DragObject, eventData.position, eventData.pressEventCamera, out globalMousePos))
{
rt.position = globalMousePos;
rt.rotation = DragObject.rotation;
}
}
}
案例三:3D Drag&&Drop(拖拽)
- 如案例一搭建一个VR场景,但是不用创建UGUI画布
- 在场景中新建一个3D物体(作者创建的是个cube)
- 在3D物体上添加一个rigibody组件和一个Draggable脚本,组件和脚本的设置如下
- 接下来直接运行就好了,通过手柄扳机进行拖拽,手柄触摸区域进行远近拉伸
案例四:Telrport(远程传送)
- 新建一个场景,把默认添加的相机去掉,然后在场景中搭建添加ViveCameraRig和ViveCurvePointers两个物体,把这俩物体挂在空物体上(作者空物体名字VROrigins)
- 在场景中搭建一个用来移动的场景,最好设置一些障碍
- 在允许位移的物体上添加一个Teleportable组件,这样就可以在物体上移动了,障碍物不添加这个组件就不会移动到这个组件中了
- 接下来直接运行游戏就行了,通过按下触摸键来改变位置移动
案例五:Collider Evenrt(碰撞事件)
- 新建一个场景,把默认添加的相机去掉,然后在场景中搭建添加ViveCameraRig、ViveCurvePointers和ViveColliders三个物体,把这俩物体挂在空物体上(作者空物体名字VROrigins)
- 在场景中搭建一个场景,分别创建5个3D物体(作者使用的是5个Capsule,并且用颜色区分开),并且分别为他们添加了Rigibody,并且把Use Gravity取消掉,是为了方便抓取
- 为前两个Capsule添加Basic Grabbable脚本,并且两个Unblockable Grab一个勾选上,一个不勾选
- 为后两个Capsule添加Sticky Grabbable脚本,并且两个Unblockable Grab一个勾选上,一个不勾选
- 运行脚本进行抓取,可以发现抓取Basic Grabbable脚本物体的时候手柄扳机一直扣着才可以一直抓取,扳机松开就会结束,然而抓取Sticky Grabbable脚本物体的时候扣动一次扳机就代表抓取,扳机松开后还是一直抓取,再次扣动扳机就松开了,两个脚本的Unblockable Grab功能其实是一样的,如果打上对勾,代表的是抓取过程中无视障碍,不会被阻挡,不勾选代表抓取过程中会被物体阻挡,在抓取过程中碰撞物体就可以试试了
- 为场景添加一个新的Capsule,为其添加一个Material Changer脚本,这个脚本是根据触碰物体后扣动扳机来触发材质改变,类似于button的点击
案例六:Collider Evenrt Manager(控制器事件管理)
- 如案例五新建一个3D的场景,并且能够瞬间移动
- 在场景中添加一个Capsule,并且如案例一添加一个UI界面,并且在界面里添加一个image和Test用来输出触发事件信息,方便监测
- 在Capssule身上添加Material Changer脚本,用来观测触发事件
- 新建一个脚本(作者脚本名字ColliderEventManage),并且悬挂在Capsule物体上
- 脚本中添加一个Text变量,用来修改显示数据,监测事件触发,脚本继承,IColliderEventHoverEnterHandler,IColliderEventHoverExitHandler,IColliderEventPressEnterHandler, IColliderEventPressExitHandler分别实现接口,这些接口就可以触发事件。
脚本内容如下
using HTC.UnityPlugin.ColliderEvent;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ColliderEventManage : MonoBehaviour
, IColliderEventHoverEnterHandler
, IColliderEventHoverExitHandler
, IColliderEventPressEnterHandler
, IColliderEventPressExitHandler
{
public Text Message;
public void OnColliderEventHoverEnter(ColliderHoverEventData eventData)
{
Message.text = "OnColliderEventHoverEnter";
}
public void OnColliderEventHoverExit(ColliderHoverEventData eventData)
{
Message.text = "OnColliderEventHoverExit";
}
public void OnColliderEventPressEnter(ColliderButtonEventData eventData)
{
Message.text = "OnColliderEventPressEnter";
}
public void OnColliderEventPressExit(ColliderButtonEventData eventData)
{
Message.text = "OnColliderEventPressExit";
}
}
- 连接设备,运行程序即可发现触发的事件
本文仅仅是带领读者入门,看完本文后从**点击这里**可进行详细学习
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 841774407@qq.com