unity中通过射线用Button控制ui的出现

来源:互联网 发布:华为手机usb共享网络 编辑:程序博客网 时间:2024/05/28 15:26

-----如果有什么难解决的问题可以给我留言。

也可以给我发邮件  梦里追梦  252306098@qq.com  



很高兴给大家解答unity方面的知识,大家能够

具体实现如下:


首先准备工具:

官方的插件 ---- SteamVR插件

自己创建的东西-----------  一个button   (注意这个button带有Box Collider组件,并且要设定好碰撞范围)

一个UI(这个UI,是你要通过上面的Button 来控制它是否出现的)

一个脚本(随意命名为ConrolUI,这个下面有具体的实现方式)


插件处理---------------------拖一个Player预制体(这个预制体 可以在steamvr文件里面找到)

点开Hierarchy---》Player--》Hand1(Han1加上SteamVR_Laser Pointer 和  SteamVR_Tracked Controller 两个脚本)



细节处理:

自己创建的button         给button添加一个tag (名字自己取后面要用到,暂且取名为pointer)注意我的tag是catch ,你改成pointer 




SteamVR_Tracked Controller 改Controller Index 改为3

SteamVR_Laser Pointer将Acitve打上 √ ,将Hand1拖进 Houder,



下面是 自己的代码这个脚本要添加到 Hand1上面


using System.Collections;using System.Collections.Generic;using UnityEngine;public class ControlUI : MonoBehaviour {//这两个实际意义是给SteamVR_Laser Pointer 和  SteamVR_Tracked Controller重新起个名字    SteamVR_LaserPointer slp;    SteamVR_TrackedController stc;//这个使用来 检测 并接收 射线 射中的物体 ,让它记下button的transform组件,你也可以直接创建成GameObject类型的    Transform pointTransform;//这个UI,是你想要控制它消失与出现的UI (重要 它是public的类型 ---也就意味着--你到时要将场景中的这个UI,拖入到给它赋值的地方)    public GameObject menu;///初始化上面的变量void Start () {//注意,注意,这个脚本是要将你的 UI 赢藏掉的语句        menu.SetActive(false);// 得到手柄上的这个脚本,这个脚本可以用来检测 射线的功能        slp = GetComponent<SteamVR_LaserPointer>();//为了 重写SteamVR_LaserPointer 里面的射线检测事件        slp.PointerIn += PointerIn;        slp.PointerOut += PointerOut;//用来检测 扳机按钮 事件        stc = GetComponent<SteamVR_TrackedController>();        stc.TriggerClicked += TriggerClicked;        stc.TriggerUnclicked += TriggerUnClicked;}//当射线进入一个物体的时候执行    void PointerIn(object sender,PointerEventArgs e)    {        if(e.target.tag=="pointer") //如果接收到的这个 物体,判断他的tag为pointer(注意这个tag在button上面 也就意味着你指向button才管用) 那么执行 你想要执行的事件        {//首先将这句放在最上面一行,用来保存tag为pointer的物体的组件            pointTransform = e.target;//下面这句就是你要实现的事件//当射线进入button的时候 ,让它出现 当然这句你也可以写在TriggerClicked函数下面,当扳机扣动的时候 实现          //  menu.SetActive(true);        }    }//对偶上面这个函数 ,我就不讲了    void PointerOut(object sender,PointerEventArgs e)    {       // menu.SetActive(false);        pointTransform = null;    }//当扳机扣动的时候 你要实现的事件    void TriggerClicked(object sender,ClickedEventArgs e)    {        if(pointTransform!=null)        {//当扳机扣动的 让菜单出现         menu.SetActive(true);                  }    }    void TriggerUnClicked(object sender, ClickedEventArgs e)    {        if(pointTransform!=null)        {//当扳机松开的时候,让UI消失         menu.SetActive(false);        }    }}


注意,扣扳机的时候,要快点扣。不然 响应不了。这是unity自带的一个缺陷。

别忘了  给你自己写的脚本,在外部赋值



原创粉丝点击