一、新建一个空物体,重命名为Door,将门作为Object的子物体,玻璃作为门的子物体,将门的位置和大小信息拷贝到空物体上
二、当手柄接触门时打开
1、创建一个脚本door继承自VRTK_InteractableObject(当挂载到物体上时会用于父类VRTK_InteractableObject所有的方法),并添加到物体Door上
脚本内容:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using VRTK;
using DG.Tweening;
public class Door : VRTK_InteractableObject {
private bool isOpen = false;
//重写Start,该方法已经过时,使用后不会调用,使用下面的方法代替
//public override void StartUsing(GameObject currentUsingObject)
//{
//base.StartUsing(currentUsingObject);
//transform.rotation = Quaternion.Euler(new Vector3(3,140,0));
//Debug.LogError("Start Using......................");
//}
public override void StartUsing(VRTK_InteractUse currentUsingObject = null)
{
base.StartUsing(currentUsingObject);
//transform.rotation = Quaternion.Euler(new Vector3(-90,140,90));//三个参数分别是最终位置时物体x,y,z轴上的旋转角度,该方法没有缓动效果
if (isOpen)
{
//transform.DORotate(new Vector3(-90, 0, 90), 1.5f) 通过1.5s的时间旋转到x,y,z轴分别为0,0,0的位置
//SetEase(Ease.OutBounce) 设置回弹类型
//transform.DORotate(new Vector3(-90,0,90),1.5f).SetEase(Ease.OutBounce);
//transform.DORewind(true);
transform.DORotate(new Vector3(-90, 0, -270), 1.5f).SetEase(Ease.OutBounce);
}
else
{
//transform.DORotate(new Vector3(-90, 140, 90), 1.5f) 通过1.5s的时间旋转到x,y,z轴分别为0,0,0的位置
//SetEase(Ease.OutBounce) 设置回弹类型
// transform.DORewind(true);
transform.DORotate(new Vector3(-90, 140, 90), 1.5f).SetEase(Ease.OutBack);
}
isOpen = !isOpen;
}
}
挂载到Door上,并且勾选isUsable
2、给左右手柄都添加以下组件
3、勾选VRTK_Pointer下的Interact With Object,这时当指针移动到门上并且按下扳机键的时候,可以开关门
4、运行后的结果
指针指到门上,并按下扳机键,门由关闭变成打开
门打开的时候,指针指到门上,并按下扳机键,门关闭
门关闭的时候,手柄移动到门上,按下扳机键后门打开
门开启的时候手柄碰到门并按下扳机键,门由开启变成关闭
开启状态
关闭状态
三、抓取物体
1、选中物体,点击Window-->VRTK-->SetUp Interactable Object,设置完成后点击Setup Selected object(s)
2、勾选Precision Grap的复选框(精确抓取)
注:
1、参考资料:http://edu.manew.com/course/344/learn#lesson/5751
2、遇到的问题:VRTK的脚本方法不调用
复写了该方法,但是并没有调用,并且方法下面有波浪线标注
原因:方法过时了,已经被新的方法替代了。当鼠标移动到方法名上时会提示新的方法名
解决办法:使用新的方法替代老的方法。如把上面的方法改为下面的方法,就可以正常调用了
3、物体没有进行旋转
原因:物体的static属性被勾选了,此时物体不会参与任何关于运动的行为
解决办法:取消勾选static复选框,此时就可以正常运行了