在VRTK的自带Demo中实现了很多项目中需要用到的功能,那么就让我来和你们一起解读一下这些功能吧。
这个实现的方法我在上个文章中已经详细的做过介绍了,这个文章就不再继续介绍了。
HTC自带的又抓取物体的功能,这个功能的实现只需要拖一些脚本上去就可以实现,在VRTK的Demo005就实现了这个功能,那么具体是哪些脚本呢?下面我就说下
首先 你需要在[VRTK_Scripts]下的手柄上,找到你需要用哪个手柄去抓取,也可以两个手柄都加上这个脚本。找到要加脚本的地方以后,把VRTK_Interact Grab(Script)这个脚本添加上去
然后 我们需要修改的是Grab Button
我们一般用到的抓取方式要么是按下扳机键去实现抓取,要么是按住侧键(即抓取键去抓取),所以 当我们要使用扳机键按下去抓取的时候,我们就选择Trigger Press这个选项,当我们要使用侧键按下抓取物体的时候,我们选择Grip Press这个选项,
手柄的部分就是这些,下面就是被抓抓取的物体上附加脚本了
首先 我们建一个Cube,然后给Cube加一个刚体组件(因为当我们不抓取的时候,需要它能自由下落),然后我们要给它加上被抓去的脚本VRTK_Interactable Object(Script)
这个里面我们需要勾选Is Grabbable这个选项,告诉系统这个物体能被抓取。其他的一些功能也都一目了然,就不细讲了,当然,在Grab Attach Mechanic Script(抓取时附加的机械组件脚本)和Secondary Grab Action Script(二次抓取动作脚本)上要把自身拖进去(加了下面两个脚本才能拖入)。然后我们给它加上一个控制抓取时到底到手上时抓到哪里的组件(比如说拿起剑之类的需要抓取后握着剑柄)VRTK_Fixed Joint Grab Attach(Script)
这里有Right Snap Handle和Left Snap Handle两个就是要抓取左端和右端的地点,我们可以给此物体加上一个子物体,子物体的位置拖入到这个地方,就是当你抓取的时候手柄抓到的地方,最后我们加上一个抓取时的动作脚本VRTK_Swap Controller Grab Action(Script)这个脚本就是抓取的时候出现一个动作,不会过多的僵硬。
在VRTK的Demo006中实现了开门和关门的功能,这个功能基本是上个功能的小拓展,唯一的区别就是在门上override了一个使用物品的方法
我们打开这个脚本看里面的代码
该方法继承与VRTK_InteractableObject并重新override重写了其中的方法。
注意:手柄上应该添加VRTK_Interact Use(Stript)脚本,否则无法使用物体
在很多情况下我们需要限制玩家的移动范围,让玩家不能出固定的范围,这除了规定玩家能位移的范围,还要让玩家的头部碰撞到某些东西的时候不能穿过去直接反弹回来。这就需要添加这个功能了。
首先 我们要在[VRTK_Scripts]下面的PlayArea里添加下面这些脚本
这些脚本会让玩家在碰撞到带有碰撞盒的物体以后眼前变黑然后反弹到可行走的区域,需要注意的是,在下图的两个脚本里面,把PlayArea拖到对应的位置
然后VRTK_PolicyList(Script)这个脚本里面的数组是选择哪些东西可以无视这个规则。可以利用tag来选择也可以用layer来选择。也可以反过来选择哪些支持,就是把ignore改成include;
需要注意的是:在反弹回来的时候脚下必须要有碰撞盒 不然人就会掉下去
在VRTK的Demo015中做到了滑动触摸板来控制小车的位移和跳跃。我们打开其脚本不难发现,就是监听了一些手柄的事件
在Start里添加了监听。当监听到值发生变化的时候,就会调用下面的方法。使小车行走和跳跃。
在VRTK的Demo16中有使手柄震动的方法,但是,我在做项目的时候并没有使用这个方法,而是使用了另一个方法。自己觉得比他这个方便。所以他的这个我就没有做任何的研究,下面我把使手柄震动的代码发出来
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class zhendong : MonoBehaviour
{
SteamVR_TrackedObject Hand;
SteamVR_Controller.Device device;
bool IsShock = false; //布尔型变量IsShock
public GameObject lighting;
// Use this for initialization
void Start ()
{
Hand = GetComponent(); //获得SteamVR_ TrackedObject组件
}
// Update is called once per frame
void Update ()
{
//防止Start函数没加载成功,保证SteamVR_ TrackedObject组件获取成功!
if (Hand.isValid)
{
Hand = GetComponent();
}
device = SteamVR_Controller.Input((int)Hand.index); //根据index,获得手柄
//如果手柄的Trigger键被按下了
if (***)//这里写你的判断条件
{
IsShock = false; //每次按下,IsShock为false,才能保证手柄震动
StartCoroutine("Shock", 1f); //开启协程Shock(),第二个参数1f即为协程Shock()的形参
}
}
//定义了一个协程
IEnumerator Shock(float durationTime)
{
//Invoke函数,表示durationTime秒后,执行StopShock函数;
Invoke("StopShock", durationTime);
//协程一直使得手柄产生震动,直到布尔型变量IsShock为false;
while (!IsShock)
{
device.TriggerHapticPulse(3000);//这里规定手柄的震动强度
yield return new WaitForEndOfFrame();
}
}
void StopShock()
{
IsShock = true; //关闭手柄的震动
}
}
这个是最简单的。VRTK自带的Prefab里面就有FramesPerSecondCanvas这个预制体,把这个拖到你的项目里面就能实时显示FPS了
中间有些Demo我并没有去介绍,因为我觉得这我这两步里面那些都已经包括和使用了,有需要的也可以自己去理解,这篇也就先写到这。第三步何时写还没有想好。等到想写的时候再写吧。