这主要是利用手柄操作的模板,具体改动自己尝试即可,当然网上这个都有,我主要拿来自己也改了下,添加补充了点。
首先在Unity项目里已经下载好了SteamVR插件,这个没有的话去asset store下载即可。然后在Hierarchy下面添加[CameraRig]。
1.[CameraRig]下面的 left 或者 right 添加 “SteamVR_LaserPointer” 和 “SteamVR_TrackedController”,上面两个脚本是发射线和手柄控制器。
3.添加自己写的脚本。脚本如下:
using UnityEngine;
public class laser_shoot : MonoBehaviour {
SteamVR_LaserPointer slp; //射线对象
SteamVR_TrackedController stc; //控制器对象
SteamVR_TrackedObject trackdeObjec;
GameObject target = null; //指向可以拾取的物体
void Start () {
slp = GetComponent<SteamVR_LaserPointer>(); //得到射线对象
slp.PointerIn += OnpointerIn; //响应射线的进入事件
slp.PointerOut += OnpointerOut; //响应射线的离开事件
stc = GetComponent<SteamVR_TrackedController>(); //得到手柄控制器的对象
stc.TriggerClicked += OnTriggerClicked; //响应手柄扣动事件
stc.TriggerUnclicked += OnTriggerUnclicked; //响应手柄松开事件
stc.MenuButtonClicked += OnMenuClicked; //圆盘上方的菜单键
trackdeObjec = GetComponent<SteamVR_TrackedObject>();
}
// Update is called once per frame
void Update () {
if (trackdeObjec)
{
var device = SteamVR_Controller.Input((int)trackdeObjec.index);
if (device.GetPress(SteamVR_Controller.ButtonMask.Touchpad))
{
Vector2 cc = device.GetAxis();
float angle = VectorAngle(new Vector2(1, 0), cc); //调用角度计算公式
//下,这里是控制器圆盘的上下左右控制
if (angle > 45 && angle < 135)
{
}
//上
if (angle < -45 && angle > -135)
{
}
//左
if ((angle < 180 && angle > 135) || (angle < -135 && angle > -180))
{
}
//右
if ((angle > 0 && angle < 45) || (angle > -45 && angle < 0))
{
}
}
}
}
float VectorAngle(Vector2 from, Vector2 to)
{
float angle;
Vector3 cross = Vector3.Cross(from, to);
angle = Vector2.Angle(from, to);
return cross.z > 0 ? -angle : angle;
}
void OnpointerIn(object sender, PointerEventArgs e) //射线进入事件
{
GameObject obj = e.target.gameObject;//得到指向的物体
if (obj.tag.Equals("Can Cach")) //如果我们选择的物体他的标签是Can Cach
{
target = obj; //用全局变量记录这个物体
}
}
void OnpointerOut(object sender, PointerEventArgs e)//射线离开事件
{
if (target != null) //如果是在能拾取的物体上离开
{
target = null; //不再记录这个物体了
}
}
void OnTriggerClicked(object sender, ClickedEventArgs e)//用来响应扳机扣动事件的行为
{
if (target != null)
{
}
}
void OnTriggerUnclicked(object sender, ClickedEventArgs e)//用来响应扳机松开事件的行为
{
}
void OnMenuClicked(object sender, ClickedEventArgs e) //圆盘上方的菜单键
{
}
}