Unity HTC vive 物体的拾取

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class Pickup : MonoBehaviour {


    SteamVR_LaserPointer LaserPoniter;//射线
    SteamVR_TrackedController stc;//扳机


    bool ispickup = false;//是否拾取


    public GameObject plane;//地面 
    GameObject obj_pickup;//拾取物体


    // Use this for initialization
    void Start () {
        //获取激光组件
        LaserPoniter = GetComponent<SteamVR_LaserPointer>();
        LaserPoniter.PointerIn += OnPointerIn;//添加射中事件
        LaserPoniter.PointerOut += OnPointerOut;//添加射线离开事件
        //获取跟踪控制组件
        stc = GetComponent<SteamVR_TrackedController>();
        stc.TriggerClicked += OnTriggerClicked;//添加扳机扣下事件
        stc.TriggerUnclicked += OnTriggerUnclicked;//添加扳机抬起事件
    }

// Update is called once per frame
void Update () {

}


    /// <summary>
    /// 射线射中事件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    void OnPointerIn(object sender, PointerEventArgs e)
    {

        print("射线" + e.target.name);

//射线射中后判定物体标签是否为拾取物品(物体标签自设)

        if (e.target.gameObject.tag == "pickup")
        {
            obj_pickup = e.target.gameObject;
            ispickup = true;
        }
              
    }


    /// <summary>
    /// 射线离开事件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    void OnPointerOut(object sender, PointerEventArgs e)
    {

//射线离开后就物体置空
        ispickup = false;
    }


    /// <summary>
    /// 扳机扣下事件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    void OnTriggerClicked(object sender, ClickedEventArgs e)
    {

        print("扳机被按下!!");

//是否为可拾取,是就将物体父节点设置为手柄并置为原点,将物体重力关闭,拿到手柄上

        if(ispickup)
        {
            obj_pickup.transform.SetParent(this.transform);
            obj_pickup.GetComponent<Rigidbody>().useGravity = false;
            obj_pickup.transform.localPosition = Vector3.zero;
        }
        else
        {
            Debug.Log("没有物体");
        }
        
    }


    /// <summary>
    /// 扳机抬起事件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    void OnTriggerUnclicked(object sender, ClickedEventArgs e)
    {

        print("扳机被抬起!!");

//扳机抬起后,如果是拾取状态就将物体父节点设为地面,并将刚体组件添加重力,物体自由落体

        if(ispickup)
        {
            obj_pickup.transform.SetParent(plane.transform);
            obj_pickup.GetComponent<Rigidbody>().useGravity = true;
            obj_pickup = null;     
        }
        


    }


}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值