参考文档:https://blog.csdn.net/qq_25601345/article/details/78497537?tdsourcetag=s_pcqq_aiomsg#_Toc31475
VRTK:3.2.1 版本 Steam VR:Assets Store下载
直
射线渲染脚本(或 VRTK_Bezier Pointer Renderer 曲
射线脚本组件,射线的模型和目标点模型等参数可自定义),VRTK_Pointer脚本中指定Pointer Render类型;给手柄控制器添加 VRTK_Controller_Events 脚本(手柄事件机制必需);
注:指定默认的抓取按键 Grab Button
)注:指定默认的使用按键 Use Button
)抓取和使用脚本中,按钮若指定默认值,被交互物体所挂脚本中按钮可默认不更改;按钮若不指定,被交互物体所挂脚本中按钮要自定义;否则,被交互物体不能响应手柄的事件
Rigidbody
和Collider
组件,
注:
七种抓取方式:
VRTK_FixedJointGrabAttach 固定关节抓取(系统默认方式)
VRTK_SpringJointGrabAttach 弹簧关节抓取(手柄和被抓取物体之间弹簧链接效果,比如抽屉的弹性效果)
VRTK_CustomJointGrabAttach 自定义关节抓取(添加所需类型的Joint组件,并指定给自定义关节参数 Custom Joint)
VRTK_TrackObjectGrabAttach 对象追踪抓取(被抓取物体跟踪手柄,受外力阻挡时不会掉落)
VRTK_ClimbableGrabAttach 可攀爬抓取(实现手抓物体可攀爬效果),另外需要在场景上挂载 VRTK_Player Climb 脚本
VRTK_RotatorTrackGrabAttach 旋转体抓取 (效果和弹簧关节相似,比如门旋转的弹性效果,笔者猜测钟摆效果也可)
VRTK_ChildOfControllerGrabAttach 作为控制器子物体(抓取物体成为手柄控制器模型子物体,射箭的典型例子)
(第25个例子未研究,一些物体的使用)
手柄控制器添加 VRTK_Interact Use 脚本,
被使用物体添加自定义脚本,继承VRTK_Interactable Object 类(勾选 Is Usable),重写该类的 StartUsing () { //自定义“使用”功能 } 和 StopUsing () 方法
注:
- 若多个物体组成被交互对象,其中有使用对象,脚本挂在父容器上即可
射线使用物体:
勾选 Use Options 中的 Pointer Activates Use 实现
TriggerHapticPulse() 函数实现手柄震动:
TriggerHapticPulse
( int index ,float strength,float duration);//最简单的手柄碰撞震动脚本,脚本挂载Stick物体上,VRTK_ChildOfControllerGrabAttach 抓取方式
public class Stick : VRTK_InteractableObject{
//控制器引用(即 Left/RightCntroller)
private VRTK_ControllerReference controllerReference;
public override void Grabbed(VRTK_InteractGrab currentGrabbingObject = null)
{
base.Grabbed(currentGrabbingObject);
//获取当前抓取物体的控制器
controllerReference = VRTK_ControllerReference.GetControllerReference(currentGrabbingObject.controllerEvents.gameObject);
}
public override void Ungrabbed(VRTK_InteractGrab previousGrabbingObject = null)
{
base.Ungrabbed(previousGrabbingObject);
controllerReference = null;
}
private void OnCollisionEnter(Collision collision)
{
if (VRTK_ControllerReference.IsValid(controllerReference) && IsGrabbed())
{
//手柄震动函数
VRTK_ControllerHaptics.TriggerHapticPulse(controllerReference, 5000f);
}
}
}
1、手柄控制器上挂载 VRTK_Touchpad Control 脚本组件控制圆盘
2、RadialMenu 预制体,VRTK_Radial Menu 菜单设置脚本 和 VRTK_Radial Menu Controller 菜单控制脚本
(VRTK_Policy List)
以瞬移为例,如下图
VRTK_Policy List 属性解析:
- Operation为Ignore/Include(忽略),Types为Tag(标签)和Script(脚本)等,Element里面设置了ExcludeTeleport,这样设置,如果游戏物体上挂载有 ExcludeTeleport 这个名称的脚本或是游戏物体的标签为ExcludeTeleport,都不能瞬移到这个游戏物体上
(VRTK_UI Pointer、VRTK_UI Canvas)
注:实现射线与UI交互,需要给控制器添加 VRTK_UI Pointer 脚本
三种UI交互方式:
public class UI_Keyboard : MonoBehaviour
{
private InputField input; //输入框
private void Start()
{ //获取输入框组件
input = GetComponentInChildren<InputField>();
}
//点击键盘上的字母时执行
public void ClickKey(string character)
{
input.text += character;
}
//点击空格时执行
public void Backspace()
{ //如果输入文本长度不为零
if (input.text.Length > 0)
{ //文本分割,去掉最后一位
input.text = input.text.Substring(0, input.text.Length - 1);
}
}
//点击Enter键时执行
public void Enter()
{ //提示语
VRTK_Logger.Info("You've typed [" + input.text + "]");
//输入框文本清空
input.text = "";
}
}
1、基本瞬移:场景中挂载脚本 VRTK_Basic Teleport 实现
挂载 VRTK_Dash Teleport 脚本,可以优化瞬移效果,不是硬生生的出现在目标点,而是像冲过去一样
2、适应高度的瞬移:场景中挂载脚本 VRTK_Height Adjust Teleport 实现
3、模拟过程的瞬移:场景中挂载脚本 VRTK_Basic Teleport 实现
4、头盔确定目标点的瞬移
Pointer 要自定义手柄控制器,也就是使用哪个手柄触发头盔瞬移
笔者测试,用曲线实现此种瞬移比较好;如果选用直射线,射线有角度变化,目标点光标会变形
可以根据需要自行选择光标的形状、光标和射线路径是否显示
要特别注意 Transform Follow 中的赋值
VRTK_MoveInPlace 脚本挂载到场景中,原地踏步就能实现移动,方向控制还需晃动头部,要是有万向走步机就更好了。
双手同时操作物体
1、VRTK_AxisScaleGrabAction 脚本实现双手缩放物体
2、VRTK_ControlDirectionGrabAction 脚本实现双手同时拿起同一个物体,一般是长物体
//获取右手手柄的引用
rightControllerReference = VRTK_ControllerReference.GetControllerReference(VRTK_DeviceFinder.GetControllerRightHand(true));
//获取手指是否触摸手柄圆盘,返回Bool值
isTouchPadTouch = VRTK_SDK_Bridge.GetControllerButtonState(SDK_BaseController.ButtonTypes.Touchpad, SDK_BaseController.ButtonPressTypes.Touch, rightControllerReference);
isTouchPadUp = VRTK_SDK_Bridge.GetControllerButtonState(SDK_BaseController.ButtonTypes.Touchpad, SDK_BaseController.ButtonPressTypes.TouchUp, rightControllerReference);