1. 程式人生 > >UI框架簡介(五)

UI框架簡介(五)

下面我們來講解事件層程式碼了哦!這個也比較難的哦!如果一會你實在看不懂理解不了也沒有關係,因為這些東西吧!只要會用就行,會和後端定協議就可以哦!協議一會我來教你怎麼定吧!首先我們來看看如何與後端定訊息哦!

這是一個列舉3型別,用來訂閱訊息的:

public enum CEventType
{
    //----------------------- event ------------------------
    GAME_OVER,
    GAME_WIN,
    GAME_LOAD_DATA,

    //揹包相關的事件
    /// <summary>
    /// 請求得到所有的資料(剛開始的時候你肯定會向伺服器請求資料的)
/// </summary> Bag_GetAllData, /// <summary> /// 新增資料(你在遊戲中購買了或者撿到東西了就會呼叫這個訊息) /// </summary> Bag_AddData, /// <summary> /// 移除資料的訊息((你在遊戲中使用東西了就會呼叫這個訊息)) /// </summary> Bag_Remove, /// <summary> /// 更新揹包資料 /// </summary> Bag_UpdataData, ///
<summary>
/// 使用揹包裡面的東西 /// </summary> Bag_UserItem, //任務相關 //設定相關 /// <summary> /// 修改了設定 /// </summary> Set_Modification, //------------------------- C2S(表示客戶端向伺服器發起的訊息) -------------------------- /// <summary> /// 請求得到所有資料 /// </summary>
C2S_Bag_GetAllData, /// <summary> /// 請求新增資料 /// </summary> C2S_Bag_AddItem, /// <summary> /// 請求移除資料 /// </summary> C2S_Bag_RemoveItem, /* 儲存設定資訊 * vol int * alpha int * bgIndex int * resolution int * isFull int */ /// <summary> /// 儲存時發的訊息 /// </summary> C2S_Setting_SaveSet, /// <summary> /// 恢復預設設定 /// </summary> C2S_Setting_GetInitData, //------------------------- S2C (伺服器向我們客戶端發的訊息)------------------------ /// <summary> /// 發給揹包所有的訊息 /// </summary> S2C_Bag_SetAllData, /// <summary> /// 移除物品的訊息 /// </summary> S2C_Bag_RemoveData, /// <summary> /// 新增物品的訊息 /// </summary> S2C_Bag_AddData, /* 儲存設定資訊 * vol int * alpha int * bgIndex int * resolution int * isFull int */ /// <summary> /// 伺服器回的訊息儲存設定的訊息 /// </summary> S2C_Setting_SaveSet, }

說明:這個列舉就是表示我們前後端定的訊息,裡面包括前端自己定的訊息,已經前端和後端共同定的訊息。

這裡寫圖片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

/// <summary>
/// 委託
/// </summary>
/// <param name="evt"></param>
public delegate void CEventListenerDelegate(CBaseEvent evt);

public class CEventDispatcher
{
    #region  事件單例
    static CEventDispatcher instance;

    public static CEventDispatcher GetInstance()
    {
        if (instance == null)
        {
            instance = new CEventDispatcher();
        }
        return instance;

    }

    #endregion

    #region 存放所有事件的Hashtable表
    /// <summary>
    /// 存放所有事件的
    /// </summary>
    private Hashtable listeners = new Hashtable();

    #endregion

    #region 註冊偵聽事件

    /// <summary>
    /// 註冊偵聽
    /// </summary>
    /// <param name="eventType"></param>
    /// <param name="listener"></param>
    public void AddEventListener(CEventType eventType, CEventListenerDelegate listener)
    {
        //初始化一個事件物件ceventListenerDelegate
        CEventListenerDelegate ceventListenerDelegate = this.listeners[eventType] as CEventListenerDelegate;
        //給事件賦值
        //Delegate.Combine (Delegate[])  將委託陣列的呼叫列表連線在一起。 
        //Delegate.Combine 相當於事件的+=方法。
        ceventListenerDelegate = (CEventListenerDelegate)Delegate.Combine(ceventListenerDelegate, listener);

        this.listeners[eventType] = ceventListenerDelegate;
    }

    #endregion

    #region 移除偵聽事件

    /// <summary>
    /// 移除偵聽
    /// </summary>
    /// <param name="eventType"></param>
    /// <param name="listener"></param>
    public void RemoveEventListener(CEventType eventType, CEventListenerDelegate listener)
    {
        CEventListenerDelegate ceventListenerDelegate = this.listeners[eventType] as CEventListenerDelegate;
        if (ceventListenerDelegate != null)
        {
            ceventListenerDelegate = (CEventListenerDelegate)Delegate.Remove(ceventListenerDelegate, listener);
        }
        this.listeners[eventType] = ceventListenerDelegate;

    }

    #endregion

    #region 派發事件

    /// <summary>
    /// 派發事件
    /// </summary>
    /// <param name="evt"></param>
    public void DispatchEvent(CBaseEvent evt)
    {
        CEventListenerDelegate ceventListenerDelegate = this.listeners[evt.Type] as CEventListenerDelegate;
        if (ceventListenerDelegate != null)
        {
            try
            {
                ceventListenerDelegate(evt);
            }
            catch (System.Exception e)
            {

            }
        }
    }

    #endregion

    #region 移除所有事件

    /// <summary>
    /// 移除所有事件
    /// </summary>
    public void RemoveAll()
    {
        this.listeners.Clear();
    }

    internal void DispatchEvent(CBaseEvent cBaseEvent, object saveData)
    {
        throw new NotImplementedException();
    }

    #endregion
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

/// <summary>
/// 基礎事件類
/// </summary>
public class CBaseEvent
{

    protected Hashtable arguments;
    /// <summary>
    /// 事件型別
    /// </summary>
    protected CEventType type;
    /// <summary>
    /// 傳送的資料
    /// </summary>
    protected object sender;

    public CEventType Type
    {
        get
        {
            return this.type;
        }
        set
        {
            this.type = value;
        }
    }

    public IDictionary Params
    {
        get
        {
            return this.arguments;
        }
        set
        {
            this.arguments = (value as Hashtable);
        }
    }

    /// <summary>
    /// 資料的屬性
    /// </summary>
    public object Sender
    {
        get
        {
            return this.sender;
        }
        set
        {
            this.sender = value;
        }
    }


    public override string ToString()
    {
        return string.Format("[CBaseEvent: Type={0}, Params={1}, Sender={2}]", Type, Params, Sender);
    }

    /// <summary>
    /// 克隆一條訊息
    /// </summary>
    /// <returns></returns>
    public CBaseEvent Clone()
    {
        return new CBaseEvent(this.type, this.arguments, Sender);
    }

    /// <summary>
    /// 建構函式初始化賦值的
    /// </summary>
    /// <param name="type"></param>
    /// <param name="sender"></param>
    public CBaseEvent(CEventType type, object sender = null)
    {
        this.Type = type;
        Sender = sender;
        if (this.arguments == null)
        {
            this.arguments = new Hashtable();
        }
    }

    /// <summary>
    /// 建構函式的過載版本
    /// </summary>
    /// <param name="type"></param>
    /// <param name="args"></param>
    /// <param name="sender"></param>
    public CBaseEvent(CEventType type, Hashtable args, object sender)
    {
        this.Type = type;
        Sender = sender;
        this.arguments = args;
        if (this.arguments == null)
        {
            this.arguments = new Hashtable();
        }
    }
}

如果大家看了這麼多的程式碼還是不太理解的話,我們一會再開發揹包時會使用這些事件的哦!會用就行了哦!具體裡面怎麼寫的邏輯,不需要管,知道如何派發和偵聽事件就行了哦!

本篇小結:寫到這裡,框架的指令碼基本上都講解完了哦!不知道大家能夠理解多少呢!下篇部落格我會帶大家一起來完成一個揹包模組的開發哦!大家也可以自己去試試開發,看看你能否開發出來的哦!