1. 程式人生 > >Unity中NGUI點選事件委託的應用

Unity中NGUI點選事件委託的應用

  大家好!我是小唐,今天在這裡給大家分享一下我在Unity開發過程學習中的我自己認為一些比較好的開發程式設計方法。

一說到點選事件我們最初首先能想到的就是OnClick(),好多開發者在開始學習的時候都是把Button的點選事件好多一大堆的方法都放在一個OnClick()方法裡面,但是有沒有想過在修改的時候會很麻煩,就是說程式之間要求高質量程式設計是耦合度比較低的,方法之間儘量的避免過多的聯絡,這樣在我們以後專案的維護中都會很方便。下面我就說一下NGUI點選事件的幾種常用的方法:

  1、OnClick()方法,這個方法是我們平時經常用到的,點選的事件的邏輯直接放在這個方法裡面就好了。不過多的解釋這個。

  2、UIButtonMessage()這個是一個Button的元件,這個元件的用法是我們給需要點選的Button新增這個元件然後關聯元件的自身Button的物件。然後在方法的一欄中輸入C#指令碼中的方法名稱。這個也是比較簡單的,如果想詳細的瞭解一下這個的用法可以去官網具體的看。這個都 不是我們今天說的重點。

  3、UIEventListener對一些常用的事件進行了封裝和繼承。

一:常用事件:

void OnClick(): 點選事件

void OnDoubleClick(): 二次或多次點選事件

void OnHover(bool isOver): 手指覆蓋事件

void OnPress(bool isPressed): 手指點選事件,包含按下、擡起;isPressed=true為按下,false為擡起

void OnSelect(bool selceted): 是否被選擇

void OnKey(KeyCode Key): "鍵"事件

二:實質:

這些監聽事件都是建立在委託事件上。

其實,這個UIEventListener監聽事件是我今天說的委託方法的一種吧算是。這個是比較方便的一種方法,然後我們每個點選事件只需要為它都單獨獨立的寫一個方法,方法彼此之間都是相互不干擾的。這就方便了我們以後的維護。

用法很簡單: UIEventListener.Get(GameObject).onClick += 方法名;

  4、委託事件在點選事件中的應用。這是我說的重點,當然上面的監聽方法和這個是差不多的,只不過是監聽方法都是已經封裝好了,不需要我們再去寫,直接拿過來呼叫來用就好了,我說的這個點選事件主要是說一下我們開發時候編寫程式程式設計的這種模式,好了不多說,下面是我寫的程式碼demo:

為了方便以後自己學習及你們測試學習原始碼如下:

using UnityEngine;
using System.Collections;
using System;

using Object = UnityEngine.Object;

public class CommonTeswt : MonoBehaviour
{
    /// <summary>
    /// 事件訊息
    /// </summary>
    EventMessage em;
    /// <summary>
    /// 傳送
    /// </summary>
    Publisher publish;
    public void Start()
    {
        //初始化
        em = new EventMessage();
        em.obj = this.gameObject;
        em.name = this.gameObject.name;
        publish = new Publisher();

    }

    public void OnClick()
    {
        //方法的呼叫
        publish.publish += new Publisher.PublishEventHandler(ButtonhanderRead.DoButton);
        publish.publish += new Publisher.PublishEventHandler(ImagehanderRead.DoImage);

        publish.Excute(em);
    }
}

/// <summary>
/// 傳送訊息委託類
/// </summary>
public class Publisher
{
    /// <summary>
    /// 定義事件的委託
    /// </summary>
    /// <param name="sender">物件</param>
    /// <param name="e">事件</param>
    public delegate void PublishEventHandler(GameObject sender, EventMessage e);

    /// <summary>
    /// 定義委託的事件
    /// </summary>
    public event PublishEventHandler publish;

    /// <summary>
    /// 事件的方法
    /// </summary>
    /// <param name="e">事件</param>
    protected virtual void OnPbulish(EventMessage e)
    {
        if (publish != null)
        {
            this.publish(e.obj, e);
        }
    }

    /// <summary>
    /// 執行
    /// </summary>
    /// <param name="e"></param>
    public void Excute(EventMessage e)
    {
        //Debug.LogError(e.obj.name);
        OnPbulish(e);
    }
}

public class ButtonhanderRead
{
    public static void DoButton(GameObject sender, EventMessage e)
    {
        Debug.LogError(sender.name + "按鈕處理");
    }
}

public class ImagehanderRead
{
    public static void DoImage(GameObject sender, EventMessage e)
    {
        Debug.LogError(sender.name+"圖片處理");
    }
}

/// <summary>
/// 事件訊息類
/// </summary>
public class EventMessage : EventArgs
{
    public GameObject obj;

    public string name = "Fuck";
}

測試和列印結果如下圖:

好了,今天的 分享就是分享一下委託在應用中,我們把點選事件的各個點選方法內容可以封裝成一個個的單獨的類,以後在專案維護過程中,你會發現這樣的好處的。謝謝支援,繼續學習,記錄學習中的點滴。在之前的部落格中我就說了,我分享這些是為了和自己以前看看自己什麼地方不足,然後以後便於更好的學習,改變程式設計的舊思想,打破我們剛開始學習的時候的一大堆的廢程式碼,高效才是我追求的目標。——小唐