#游戏unity#AR中奇妙的虚拟按钮

#游戏unity#AR中奇妙的虚拟按钮

先说点题外话,博主在调试项目的时候,什么设置也没有改,突然就运行保存,说vuforia的实例没有初始化,去网上也没有查到错误原因,吓的博主去脚本里找了好久qwq后来在群里问了相关有经验的人才知道——这只是unity打开太久的一个正常反应(???表示无奈),关闭重新打开unity就好了,当时的报错如下图(大家遇到这个错误不要怕啊,,)
这里写图片描述


好了言归正传,博主昨天很奇妙的在unity里的vuforia文件里发现了一个VirtualButton的prefab,这是高通平台提供的一个功能,里面自带了一些接口和方法,需要我们来调用。那么,这个究竟是个什么东西呢?

  • 对比普通的UI组件

    虚拟按钮和普通的UI中的按钮不一样,普通的按钮是在电脑屏幕上或者手机屏幕上进行点击,从而实现基本事件响应;而虚拟按钮是在现实世界中你的识别图上的某个你设定的位置范围内进行点选,实现基本事件的响应。类似 下图:蓝色的按钮就是虚拟按钮,颜色和材质是可以修改的
    这里写图片描述
    当然,同时,这也就要求识别图的清晰度要很高,才能准确的进行事件响应。

    - 关于虚拟按钮的添加与基本设置
    从vuforia文件中将VirtualButton的prefab拖入ImageTarget,成为其子物体。
    在VirtualButton添加脚本组件VirtualButtonBehaviour,我一般把灵敏度设为high
    将虚拟按钮拖到图片上的对应位置,还有就是按钮的大小最好不要超过识别图片的10%

    - 脚本编写

    在实际项目中,不需要计算按钮位置,直接使用Virtual Button的prefab即可。
    在unity3d平台下,主要涉及到一个类和一个接口:
    IVirtualButtonEventHandler。必须要实现这个接口。
    其中这个接口包含两个方法:
    public void OnButtonPressed(VirtualButtonAbstractBehaviour vb)
    public void OnButtonReleased(VirtualButtonAbstractBehaviour vb)
    跟普通按钮一样,点击和释放的两个功能。 因为是实现了一个接口,所以这两个方法必须都有基础的实现,要不然会报错。当事件处理程序被调用时,您将通过一个实例的虚拟按钮,包括按钮的名称。通过这种方式,可以应对不同的按钮事件。虚拟按钮示例应用程序的一个完整的例子:用虚拟按钮实现茶壶材质的变化——
    指定m_TeapotMaterials1数组0元素为default材质,数组1元素为red材质。

using UnityEngine;  
using System.Collections.Generic;  
using Vuforia;  
public class changeMaterial : MonoBehaviour,  
                                         IVirtualButtonEventHandler  
{  

    public Material[] m_TeapotMaterials1;  

    private GameObject m1Teapot;  

    private int pressNum = 0;//记录点击按钮的次数  


    void Start()  
    {  
        // Register with the virtual buttons TrackableBehaviour  
        VirtualButtonBehaviour[] vbs = GetComponentsInChildren<VirtualButtonBehaviour>();  
        for (int i = 0; i < vbs.Length; ++i)  
        {  
            vbs[i].RegisterEventHandler(this);  
        }  

        m1Teapot = transform.FindChild("teapot").gameObject;  
    }  

    void Update()  
    {   
        switch(pressNum)  
        {  
            case 0:  
                m1Teapot.GetComponent<Renderer>().material = m_TeapotMaterials1[1];  
                break;  
            case 1:  
                m1Teapot.GetComponent<Renderer>().material = m_TeapotMaterials1[0];  
                break;  
        }  
    }  

    /// <summary>  
    /// 当点击或者触碰虚拟按钮的时候,该函数会被调用  
    /// </summary>  
    public void OnButtonPressed(VirtualButtonAbstractBehaviour vb)  
    {  
        Debug.Log("OnButtonPressed::" + vb.VirtualButtonName);  

        pressNum++;  
        if (pressNum >= 2) pressNum = 0;  
    }  

}  

这里写图片描述
点击不同的虚拟按钮,茶壶的材质会发生变化。

对于我们的项目,我做了一个测试,用虚拟按钮实现对角色动画的控制;脚本如下:

using UnityEngine;  
using System.Collections.Generic;  
using Vuforia;  
public class changeidle : MonoBehaviour,IVirtualButtonEventHandler

{
    Animation anim;
    private GameObject role;
    private int pressNum = 0;//记录点击按钮的次数  
    void Start()
    {
        role = GameObject.Find("TestACT2");
        anim = GameObject.Find("TestACT2").GetComponent<Animation>();
        // Register with the virtual buttons TrackableBehaviour  
        VirtualButtonBehaviour[] vbs = GetComponentsInChildren<VirtualButtonBehaviour>();
        for (int i = 0; i < vbs.Length; ++i)
        {
            vbs[i].RegisterEventHandler(this);
        }
    }

    void Update()
    {
         switch (pressNum)
          {
              case 0:
                  {
                      role.GetComponent<Animation>().Play("idle");
                      break;
                  }
              case 1:
                  {
                      role.GetComponent<Animation>().Play("attack");
                      break;
                  }
              case 2:
                  {
                      anim.Play("die");
                      break;
                  }
          }

    }

    /// <summary>  
    /// 当点击或者触碰虚拟按钮的时候,该函数会被调用  
    /// </summary>  
    public void OnButtonPressed(VirtualButtonAbstractBehaviour vb)
    { role.GetComponent<Animation>().Play("attack");

        Debug.Log("OnButtonPressed::" + vb.VirtualButtonName);
        pressNum++;
        if (pressNum > 2) pressNum = 1;

    }
    public void OnButtonReleased(VirtualButtonAbstractBehaviour vb)
    {
       Debug.Log("OnButtonReleased::" + vb.VirtualButtonName);
    }

}

这就实现了点击次数播放不同的动画。

- 虚拟按钮在运行时的重新配置
一个虚拟按钮,在运行时更改以下属性:
灵敏度 - 设置一个虚拟按钮的灵敏度通过设置SensitivitySetting 资源在VirtualButtonBehaviour实例。
在图像上目标的位置和面积的大小 - 改变通过改变部件在转换中的虚拟按钮的游戏对象的位置,和缩放的虚拟按钮的位置和大小。

搭建其他游戏对象的虚拟按键
重新配置虚拟按钮在运行时的一个典型用例是,当你想要一个按钮,创建对象。为了适应这种情况,一个虚拟按钮,将不需要图像目标中的一个子对象,但可以连接到另一个对象,其本身具有的图像目标作为父。对象移动时,虚拟按钮一起移动,重新配置自动适应。
注意:这仅适用于预先定义的条件下编辑脚本执行。必须位于它的父对象的中心的虚拟按钮。它始终是轴对准目标图像。此外,父不能有一个非均匀的规模。如果确实如此,编辑器,脚本会自动重新调整对象,并显示警告。


好了,以上就是这篇博客的全部内容了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章