1,这个可以实现扣动板机出现射线。射线与物体碰撞的地方用小球来表示。
使用的是SteamVR自己带的脚本SteamVR_LaserPointer脚本就可以。但这个是射线会一直显示。
sphere是小球申请变量后面板上拖动把新建的三维物体sphere为这个变量赋值赋值。
需要碰撞点的那个物体上加 collider组件。
public SteamVR_TrackedObject trackedObj;
底下的写在updata()里面
SteamVR_Controller.Device device=SteamVR_Controller.Input((int)trackedObj.index);
if (device.GetPress(SteamVR_Controller.ButtonMask.Trigger))
{
//print ("GetPress");
Ray ray = new Ray(trackedObj.transform.position, trackedObj.transform.forward);
//var point = Camera.main.ScreenToWorldPoint(Input.mousePosition);
RaycastHit hit;
if (GetComponent<Collider>().Raycast(ray, out hit, 50))
{
var point = hit.point;
print (point);
GameObject go = Instantiate (sphere, point,sphere.transform.rotation);
go.transform.parent = ARACP.transform;
}
}
2,参考SteamVR_LaserPointer重新写脚本实现扣板机出射线,触摸手柄上的触摸板射线消失。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RayLine : MonoBehaviour {
public SteamVR_TrackedObject trackedObj;
public bool active = true;
public Color color;
public float thickness = 0.002f;
public float thicknessIn = 0.0f;
public GameObject holder;
public GameObject pointer;
// Use this for initialization
void Start () {
holder = new GameObject();
holder.transform.parent = this.transform;
holder.transform.localPosition = Vector3.zero;
pointer = GameObject.CreatePrimitive(PrimitiveType.Cube);
pointer.transform.parent = holder.transform;
pointer.transform.localScale = new Vector3(thicknessIn, thicknessIn, 100f);
pointer.transform.localPosition = new Vector3(0f, 0f, 50f);
}
// Update is called once per frame
void Update () {
if (trackedObj==null)
{
//print ("NULL");
return;
}
SteamVR_Controller.Device device=SteamVR_Controller.Input((int)trackedObj.index);
//SteamVR_Controller.Device device=SteamVR_Controller.Input(4);
if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Trigger))
{
}
// else if (device.GetTouch(SteamVR_Controller.ButtonMask.Trigger))
else if (device.GetPress(SteamVR_Controller.ButtonMask.Trigger))
{
pointer.transform.parent = holder.transform;
pointer.transform.localScale = new Vector3(thickness, thickness, 100f);
pointer.transform.localPosition = new Vector3(0f, 0f, 50f);
BoxCollider collider = pointer.GetComponent<BoxCollider>();
//print ("GetPress");
Ray ray = new Ray(trackedObj.transform.position, trackedObj.transform.forward);
//var point = Camera.main.ScreenToWorldPoint(Input.mousePosition);
}
//touch the pad to clear lines(linerender)
else if(device.GetTouch(SteamVR_Controller.ButtonMask.Touchpad))
{
pointer.transform.localScale = new Vector3(thicknessIn, thicknessIn, 100f);
}
}
}
3,使用VRTK就可以简单实现相关功能。
在新建的工程中将steamvr中这两个拖上去。
把VRTK的sample中第三个simplepointer的打开,把 【VRTK】复制到自己的工程里
把相关的设置搞好
有时间在hTC的视角无法看见射线,这时可以调整HTC的相机要看到 Ignore Raycast层。