HTC VIVE

开发前的准备

开发工具

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即可)

开发测试过程

  1. 首先导入VIVE Input Unility包,导入时如下图,选择Accept All。
  2. 导入后会出现一个HTC.UnityPlugin文件夹,在文件夹里会有给的案例,可以通过案例进行学习
  3. 导入Steam VR Plugin包,因为我用的unity是2017.3.1f1版本,所有会一些错误,接下来开始改错
  4. 通过报错找到代码所指向的地方,把所有的VR全部改成XR,但是这里面还会有一个错误,XRSetting的一个方法过时了,换成另一个方法即可

案例一:button 按钮

  1. 首先新建一个场景,在场景中把main camera去掉,然后在刚才导入的文件夹的Prefabs文件里找到ViveCameraRig和VivePointers两个预制体,导入到场景中即可
  2. 在场景中添加UGUI的button按钮,然后把EventSystem去掉
  3. 把canvas物体上的canvas组件中的Render Mode改为World space(世界坐标)
  4. 把canvas画布上面的canvas Scaler和Graphic Raycaster组件去掉
  5. 把canvas上canvas组件中的Addition Shader Channes的值选中TexCoord1、Normal和Tangent(每次打开选中一个,打开三次依次选中三个即可)
  6. 在canvas上面添加canvas Raycast Target脚本
  7. 然后把canvas缩小到原来的0.01,然后把canvas移动到ViveCameraRig摄像头能看到的地方,最好先移动到摄像头在的位置,然后微调,离摄像头近一些,否则手柄射线无法扫描到button,就无法进行点击
  8. 接着连接HTC VIVE设备直接运行即可

案例二:2D Drag&Drop(拖拽)

  1. 跟案例一一样建立一个UGUI的场景,把案例一中的button换成image
  2. 创建一个脚本(作者脚本名字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(拖拽)

  1. 如案例一搭建一个VR场景,但是不用创建UGUI画布
  2. 在场景中新建一个3D物体(作者创建的是个cube)
  3. 在3D物体上添加一个rigibody组件和一个Draggable脚本,组件和脚本的设置如下
  4. 接下来直接运行就好了,通过手柄扳机进行拖拽,手柄触摸区域进行远近拉伸

案例四:Telrport(远程传送)

  1. 新建一个场景,把默认添加的相机去掉,然后在场景中搭建添加ViveCameraRig和ViveCurvePointers两个物体,把这俩物体挂在空物体上(作者空物体名字VROrigins)
  2. 在场景中搭建一个用来移动的场景,最好设置一些障碍
  3. 在允许位移的物体上添加一个Teleportable组件,这样就可以在物体上移动了,障碍物不添加这个组件就不会移动到这个组件中了
  4. 接下来直接运行游戏就行了,通过按下触摸键来改变位置移动

案例五:Collider Evenrt(碰撞事件)

  1. 新建一个场景,把默认添加的相机去掉,然后在场景中搭建添加ViveCameraRig、ViveCurvePointers和ViveColliders三个物体,把这俩物体挂在空物体上(作者空物体名字VROrigins)
  2. 在场景中搭建一个场景,分别创建5个3D物体(作者使用的是5个Capsule,并且用颜色区分开),并且分别为他们添加了Rigibody,并且把Use Gravity取消掉,是为了方便抓取
  3. 为前两个Capsule添加Basic Grabbable脚本,并且两个Unblockable Grab一个勾选上,一个不勾选
  4. 为后两个Capsule添加Sticky Grabbable脚本,并且两个Unblockable Grab一个勾选上,一个不勾选
  5. 运行脚本进行抓取,可以发现抓取Basic Grabbable脚本物体的时候手柄扳机一直扣着才可以一直抓取,扳机松开就会结束,然而抓取Sticky Grabbable脚本物体的时候扣动一次扳机就代表抓取,扳机松开后还是一直抓取,再次扣动扳机就松开了,两个脚本的Unblockable Grab功能其实是一样的,如果打上对勾,代表的是抓取过程中无视障碍,不会被阻挡,不勾选代表抓取过程中会被物体阻挡,在抓取过程中碰撞物体就可以试试了
  6. 为场景添加一个新的Capsule,为其添加一个Material Changer脚本,这个脚本是根据触碰物体后扣动扳机来触发材质改变,类似于button的点击

案例六:Collider Evenrt Manager(控制器事件管理)

  1. 如案例五新建一个3D的场景,并且能够瞬间移动
  2. 在场景中添加一个Capsule,并且如案例一添加一个UI界面,并且在界面里添加一个image和Test用来输出触发事件信息,方便监测
  3. 在Capssule身上添加Material Changer脚本,用来观测触发事件
  4. 新建一个脚本(作者脚本名字ColliderEventManage),并且悬挂在Capsule物体上
  5. 脚本中添加一个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";
    }
}
  1. 连接设备,运行程序即可发现触发的事件

本文仅仅是带领读者入门,看完本文后从**点击这里**可进行详细学习


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 841774407@qq.com

×

喜欢就点赞,疼爱就打赏