EasyTouch

EasyTouch


概述:

在任何手遊動作類項目中,總少不了搖桿(joystick),今天來寫一篇關於搖桿的文章,從插件到運用來說說(EasyTounch)是如何爲手遊項目服務的,工程及插件下載地址我會放在文章最後面。


學習目標:

1.瞭解EasyTouch原理和使用

2.瞭解EasyButton原理及使用

3.重點掌握EasyJoystick的原理及用法


實現過程:


一 EasyButton部分

新建一個工程,導入EasyTouch插件,創建三個EasyButton按鈕,會默認創建EasyTouch,我們用三個按鈕來模擬遊戲項目中的技能:



首先,先來看看EasyButton的屬性面板有哪些重要屬性,下圖中黃色勾選的是重點屬性,它是EasyButton按下之後事件處理的根本。


其他屬性:

①.ButtonProperties:主要參數有,按鈕名字(ButtonName),是否禁用按鈕(EnableButton),是否激活(Active),是否禁用按鈕debug區域(Show Debug Area)以及是否使用GUI的分佈佈局(Use GUI Layer)。


②.ButtonPosition&Size見名知意,這個就是用來修改Button位置和尺寸的,以及一個修改猛烈進入猛烈退出的動畫效果的。


③.這個就是重中之重了,eventhandle就是靠這個處理的,有兩種方式,Event註冊方式(因爲EasyTouch腳本提供好了處理不同按鍵響應機制的委託方法),還有一種就是使用通知指定遊戲物體身上的方法來處理不同按鍵響應。(=Use specific method.)


④.最後一個屬性就是修改按鈕Texture,這個自己去使用相應的技能素材就好。



好了,EasyButton屬性參數已經介紹完了,接下里我們重點來學習如何做事件響應處理!

using UnityEngine;
using System.Collections;

public class ButtonHandler : MonoBehaviour {

    #region 技能1事件監聽

    void SkillButton1DownMethod()
    {
        Debug.Log("按下技能1時");
    }
    void SkillButton1PressMethod()
    {
        Debug.Log("按住技能1");
    }
    void SkillButton1UpMethod()
    {
        Debug.Log("擡起技能1");
    }

    #endregion

    #region 技能2事件監聽

    void SkillButton2DownMethod()
    {
        Debug.Log("按下技能2時");
    }
    void SkillButton2PressMethod()
    {
        Debug.Log("按住技能2");
    }
    void SkillButton2UpMethod()
    {
        Debug.Log("擡起技能2");
    }

    #endregion

    #region 技能3事件監聽

    void SkillButton3DownMethod()
    {
        Debug.Log("按下技能3時");
    }
    void SkillButton3PressMethod()
    {
        Debug.Log("按住技能3");
    }
    void SkillButton3UpMethod()
    {
        Debug.Log("擡起技能3");
    }

    #endregion
}

同時要給每個Button事件處理那裏進行接收者賦值,方法賦值,如下圖:


運行遊戲經過測試,效果如圖:


好了,這是第一種響應EasyButton觸摸事件的方式,接下來我們說第二種就是使用Event註冊的形式(注:有註冊就要有解註冊)

先看看EasyButton中的源碼:

	#region Delegate
	public delegate void ButtonUpHandler(string buttonName);
	public delegate void ButtonPressHandler(string buttonName);
	public delegate void ButtonDownHandler(string buttonName);
	#endregion
	
	#region Event
	/// <summary>
	/// Occurs when the button is down for the first time.
	/// </summary>
	public static event ButtonDownHandler On_ButtonDown;
	/// <summary>
	/// Occurs when the button is pressed.
	/// </summary>
	public static event ButtonPressHandler On_ButtonPress;
	/// <summary>
	/// Occurs when the button is up
	/// </summary>
	public static event ButtonUpHandler On_ButtonUp;
	#endregion

源碼中聲明瞭三個不同階段的委託變量,所以我們要做的就是通過腳本給這幾個變量進行函數賦值。

    void Start()
    {
        RegistButtonEvent();
    }

    void Destory()
    {
        UnRegistButtonEvent();
    }


    void RegistButtonEvent() { EasyButton.On_ButtonDown += SkillButton1DownMethod; }

    void UnRegistButtonEvent() { EasyButton.On_ButtonDown -= SkillButton1DownMethod; }



    #region 技能1事件監聽

    void SkillButton1DownMethod(string btn1Name)
    {
        Debug.Log("按下技能1時");
    }

效果:


EasyButton這一塊就這些東西,剩下的就是多用多熟悉的事情了,接下來說一下EasyJoystick,也叫搖桿。

二 EasyJoyStick 部分

首先還是創建一個搖桿,然後看右邊檢視面板屬性有哪些?


屬性面板:


這個屬性就不用說了和前面的EasyButton相同地方挺多,不同的地方自己可以試試。


這裏主要重點就是第一個參數,勾選之後,搖桿區域不是固定的了,比較方便,挺多項目都用過,其他的屬性都可以自己試試。


這個屬性塊比較重要


這個設置顯示的參數,沒什麼重點,設置好自己喜歡的圖就好了。

那我們已經瞭解了虛擬杆的屬性,那麼我們怎麼用它來做控制呢?(通過什麼來進行事件處理)

我們知道的是,Joystick是虛擬杆,那麼它肯定是有X軸和Y軸值的,那如何獲取這個軸值?

    //指定虛擬杆
    public EasyJoystick mJoyStick;

    void Update()
    {
        //輸出軸值
        print(mJoyStick.JoystickAxis);
    }

移動虛擬杆,輸出效果:


通過測試我們可知:左爲-1,上爲1。我們使用EasyJoyStick,主要就是爲了控制人物移動,接下來看看如何實現控制人物前後左右旋轉移動。

我們應該還記得有一種控制移動的方式是通過獲取軸值,來改變移動的:

        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
那麼我們就可以思考一下,人物的移動控制是不是也可以使用這種方式,通過獲取joystick軸值來改變人物的transform位置信息呢?答案是可以的!


在層次面板當中創建一個主角,命名爲Player,然後修改joyStick參數:



基本EasyJoyStick,控制移動或者控制攝像機轉動的方法就是這樣的,其中插件裏面的例子可以去研究一下,挺好的,最後一個部分就是EasyTouch部分了

三 EasyTouch部分

手勢事件檢測這一塊也有幾種檢測方式。

關鍵字:通過原名字來觸發事件

新建遊戲物體,命名爲GestureListener,層次面板結構如圖,我們將通過第一種方式,就是制定手勢檢測接收方的方式來實現功能需求!





腳本:

public class GestureListener : MonoBehaviour {
    /// <summary>
    /// 名字一定要和EasyTouch源碼中的手勢檢測函數簽名一致
    /// </summary>
    void On_TouchStart(Gesture myGesture)
    {
        //將輸出手指在屏幕上面的位置//原點在左下角
        Debug.Log("TouchStart"+ myGesture.position);
    }
}

測試效果:


這種方式只要指定的函數和源碼中的函數簽名一致就可以觸發。接下來我們使用事件註冊的方式,我說明一下,這裏可能會有人有疑惑,說我事件註冊進去了,他怎麼知道我到底是哪個事件源呢?就像上面的EasyButton例子一樣,圖中有三個技能button,那我使用事件註冊的方式,當我遊戲運行的時候,它是怎麼知道我是哪個button點擊的?其實這個一定都不必擔心,就拿上面的EasyButton例子來說,我們可以註冊很多OnDown的函數,你把所有的button得Down函數註冊進去之後,他就幫你存在了一個事件管理器中,當你按下某個button時候,它會自動去執行那個註冊進來的方式,所以EasyTouch的事件註冊機制是一模一樣的。

public class GestureListener : MonoBehaviour {

    void Start()
    {
        RegistButtonEvent();
    }

    void Destory()
    {
        UnRegistButtonEvent();
    }


    void RegistButtonEvent()
    {
        EasyTouch.On_TouchStart += On_MyTouchStart;
    }

    void UnRegistButtonEvent()
    {
        EasyTouch.On_TouchStart -= On_MyTouchStart;
    }


    void On_MyTouchStart(Gesture myGesture)
    {
        //將輸出手指在屏幕上面的位置//原點在左下角
        Debug.Log("TouchStart"+ myGesture.position);
    }
}

經過測試,效果一樣。

最後一種方式就是應對,比如說我們只想手指觸摸到某個遊戲物體身上了,纔會執行下一步的eventHandler,這個情況該怎麼處理呢?


創建一個遊戲物體,讓其做手勢事件的唯一接收者:


實現過程:

修改遊戲物體的層爲GUICamera,然後設置EasyTouch的檢測層,設置好了之後,記得啓用BroadcastMessage,因爲EasyTouch底層是通過消息廣播機制來實現事件播報的。


這樣通過運行遊戲測試我們可以發現,無論我們點擊哪裏,只要沒點到cube身上,都不會有消息,當我們點擊到Cube之後纔會出現消息:



好了,EasyTouch插件的學習就到這裏結束了,還是那句話,插件自帶的Demo挺不錯的,可以去看一下,然後還有就是每個事件腳本源碼中上面例子沒有講到的也可以自己底下去實踐實踐。

示例下載地址以及插件:

鏈接:http://pan.baidu.com/s/1o8MzR30 密碼:t9c0

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