Unity3d VR手柄射线拾取,投掷,发射可拿去的物体

using UnityEngine;
/// <summary>
/// 手柄射线原代码要添加好1. SteamVR_LaserPointer  2.SteamVR_TrackedController
/// 以下是负责射线抓取的代码
/// </summary>
public class catchObject : MonoBehaviour
{
    SteamVR_LaserPointer slp;   //射线对象
    SteamVR_TrackedController stc;    //控制器对象
    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;    //响应手柄松开事件
    }
    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)  //如果拾取到了东西
        {
            Rigidbody r = target.GetComponent<Rigidbody>();    //如果物体有刚体就拿到这个刚体
            Destroy(r);    //销毁掉这个对象
            target.transform.position = transform.position;//这个拾取的物体位置等于手柄位置
            target.transform.parent = transform;//这个可以拾取的物体的父节点是手柄的节点
        }
    }
    void OnTriggerUnclicked(object sender, ClickedEventArgs e)//用来响应扳机松开事件的行为
    {
        if (target != null)  //如果拾取到了东西
        {
            target.AddComponent<Rigidbody>().AddForce(transform.forward * 500);//给被拾取的物体增加刚体跟向前的力      
            target.transform.parent = null;//不再是手柄的子物体   
        }
    }
}

using UnityEngine;

/// <summary>
/// 添加VR模块1.SteamVR_TrackedController
/// 以下代码负责发射物体
/// </summary>
public class SteamVR_TrackedController_Shoot : MonoBehaviour
{
    SteamVR_TrackedController stc;    //控制器对象
    void Start()
    {
        stc = GetComponent<SteamVR_TrackedController>();    //得到手柄控制器的对象
        stc.TriggerClicked += OnTriggerClicked;    //响应手柄扣动事件

    }
    void OnTriggerClicked(object sender, ClickedEventArgs e)
    //用来响应扳机扣动事件的行为
    {
        GameObject testObject = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        //创造一个原始的圆形模块(CreatePrimitive创造原始)(PrimitiveType原始模型)
        testObject.transform.position = transform.position;
        //创造模型的位置就是手柄的位置
        testObject.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
        //将原始模块按0.1比例进行缩放
        testObject.AddComponent<Rigidbody>().AddForce(transform.forward * 1000);
        //将这个模块增加刚体组件(AddComponent)并增加力(AddForce)
        testObject.tag = "Can Cach";
        //增加标签 这个标签设定的是可以拾取的物体
    }
}


猜你喜欢

转载自blog.csdn.net/qq_41996509/article/details/80399104
今日推荐