Unity3D VR HTCVIVI手柄射线拾取,投掷,发射可拿取的物体(补充版)

版权声明:欢迎交流,本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_42513339/article/details/82992329

这主要是利用手柄操作的模板,具体改动自己尝试即可,当然网上这个都有,我主要拿来自己也改了下,添加补充了点。

首先在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)   //圆盘上方的菜单键
    {

    }
     
}

猜你喜欢

转载自blog.csdn.net/weixin_42513339/article/details/82992329