#遊戲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實例。
在圖像上目標的位置和麪積的大小 - 改變通過改變部件在轉換中的虛擬按鈕的遊戲對象的位置,和縮放的虛擬按鈕的位置和大小。

搭建其他遊戲對象的虛擬按鍵
重新配置虛擬按鈕在運行時的一個典型用例是,當你想要一個按鈕,創建對象。爲了適應這種情況,一個虛擬按鈕,將不需要圖像目標中的一個子對象,但可以連接到另一個對象,其本身具有的圖像目標作爲父。對象移動時,虛擬按鈕一起移動,重新配置自動適應。
注意:這僅適用於預先定義的條件下編輯腳本執行。必須位於它的父對象的中心的虛擬按鈕。它始終是軸對準目標圖像。此外,父不能有一個非均勻的規模。如果確實如此,編輯器,腳本會自動重新調整對象,並顯示警告。


好了,以上就是這篇博客的全部內容了。

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