目录
1 使用准备
注意:删除主相机,添加 VR 相机 [CameraBig]
1.更换手柄模型
a.将模型设置为Controller(left/right)的子物体,并且调节大小。
b.如果不需要手柄模型,可以将Model屏蔽掉。
2 监听手柄事件
2.1 StreamVR 原生方式
1.StreamVR 原生方式:
获取手柄上的Object组件,用于获取设备索引
根据索引获取到设备的引用
监听设别的按钮状态
通过GetTouch GetPress实现
按钮种类:
TouchPad:圆盘
Trigger:扳机
ApplicationMenu:菜单
Grip:两侧按钮
2.2 VRKT插件方式
手柄挂载VRTK_ControllerEvents组件,用于监听手柄按钮事件
i. GetComponent<VRTK_ControllerEvents>().TouchpadAxisChanged += new ControllerInteractionEventHandler(OnTouchpadAxisChanged);
3 实现功能
3.1 物品拾取
1.设为子物体方式
通过固定关节(Fixed Joint)实现
2 VRTK
a. 手柄添加VRTK_ControllerEvents 监听事件
b. VRTK_Interact Grab 拾取功能
c. 被拾取物体挂载 VRTK_Interactable Object 组件 并且勾选Is Gradable 选项
3.2 移动
1.Translate
2.瞬移
1VRTK_ControllerEvents 监听事件
直线: VRTK_SimplePointer
贝泽尔曲线: VRTK_Bezier Pointer
2给瞬移对象Camera添加 VRTK_Basic TelePort 没有高低差变化
VRTK_Height Adjust Teleport 有高低差变化
3.3 UI控制
a. Canvas RenderMode 为 World
b. 画布的Scale调节为0.03
c. 手柄挂载脚本
VRTK_ControllerEvents
VRTK_SimplePonter
VRTK_UIPointer
4 实例应用
4.1 拾取物品 抛出物品 移动
//放在ControllerLeft 上
public class SteamVRCtrlListener : MonoBehaviour
{
private SteamVR_TrackedObject tObje; //获取组件,提供索引
private FixedJoint joint; //固定关节
public Transform eyeCamera;
void Start()
{tObje = GetComponent<SteamVR_TrackedObject>();
joint = GetComponent<FixedJoint>();
}
void Update()
{
var dev = SteamVR_Controller.Input( (int) tObject.index ); //根据索引获取设备
//GetTouch 既可以监听触摸也可以监听按下
//if ( dev.GetTouch ( SteamVR_Controller.ButtonMask.Touchpad ) )
//{ debug.log(dev.GetAxis() + "触摸圆盘" ); }
//GetPress 只监听按下
//if ( dev.GetPress ( SteamVR_Controller.ButtonMask.Trigger ) )
//{ Debug.log("按下扳机") }
if ( dev.GetPressUp( SteamVR_Controller.Button.Grip ) ) //两侧按钮 抛出物品方法
{
if ( grabObj != null )
{
//grabObj.SetParent ( null ) 方法1
joint.ConnectedBody = null 方法2
grabObj.GetComponent<Rigidbody>().useGravity = true; //添加重力,并添加向前力
grabObj.GetComponent<Rigidbody>().AddForce( transform.forward *50, ForceMode.Impulse )
grabObj = null; //手里置为空
}
}
if ( dev.GetTouch( SteamVR_Controller.Button.Touchpad ) ) //移动位置
{
float x = dev.GetAxis().x;
float y = dev.GetAxis().y;
Vector3 dirForward = new Vector3( eyeCamera.forward.x, 0, eyecamera.z );
transform.parent.Translate( dirForward * 10 * Time.deltaTime * y, Space.World);
Vector3 dirRight = new Vector3( eyeCamera.right.x, 0, eyeCamera.right.z);
tran slate(dirRight * 10 * Time.deltaTime * x,Space.World);
}
}
Transform graObj = null;
void OnTriggerStay( Collider c) //拾取物品的2种方法
{
if (grabObj != null) return; //如果手里有东西,不能抓取
var dev = SteamVR_Controller.Input ( (int) tobj.index );
if( dev.GetPressDown ( SteamVr_Controller.ButtonMask.Grip) )
{
c.GetComponent<Rigibody>().useGravity = false; //重力效果取消
// c.transform.SetParent ( tranform); //方法1 父子层级方式
joint.connectedBody = c.GetComponent<Rigibody>(); //方法2 connectedBody
grabObj = c.transform;
}
}
}
4.2 射线移动
public class ARCTel :MonoBehaviour
{
public SeamVR_TrackedObject obj;
public LineRender line;
private Ray ray;
private RaycastHit hit;
void Update()
{
var dev = SteamVR_Controller.Input( (int)obj.index )
if ( dev.GetPress ( SteamVR_Controller.ButtonMask.Touchpad ))
{
line.enable = true;
ray = new Ray(transform.position, transform.forward); //从手柄向前发射一条射线 ray
if (Physics.Raycast(ray, out hit))
{
//绘制lineRender
line.SetPosition(0, transform.position);
line.SetPosition(1, hit.point);
}
else {
line.SetPosition(0, transform.position);
line.SetPosition(1, transform.forward * 100);
}
}
if ( dev.GetPressUp(SteamVR_Controller.ButtonMask.Touchpad ) )
{
line.enabled = false; //鼠标抬起,光线隐藏
transform.parent.position = hit.point; //移动父类,也就是Camera
}
}
}
4.3 手柄按钮的监听
public class VRTKCtrlListener : MonoBehaviour
{
void Start()
{
GetComponent<VRTK_ControllerEvents >().TouchpadAxisChanged +=
new ControllerInteractionEventHandler ( OnTouchpadAxisChanged );
}
private void OnTouchpadAxisChanged ( object sender, ControllerInteractionEventArgs e )
{
Debug.Log(e.touchpadAxis);
}
}
4.4 开关门的实现
VRTK实现