UI框架簡介(五)
阿新 • • 發佈:2019-01-24
下面我們來講解事件層程式碼了哦!這個也比較難的哦!如果一會你實在看不懂理解不了也沒有關係,因為這些東西吧!只要會用就行,會和後端定協議就可以哦!協議一會我來教你怎麼定吧!首先我們來看看如何與後端定訊息哦!
這是一個列舉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();
}
}
}
如果大家看了這麼多的程式碼還是不太理解的話,我們一會再開發揹包時會使用這些事件的哦!會用就行了哦!具體裡面怎麼寫的邏輯,不需要管,知道如何派發和偵聽事件就行了哦!
本篇小結:寫到這裡,框架的指令碼基本上都講解完了哦!不知道大家能夠理解多少呢!下篇部落格我會帶大家一起來完成一個揹包模組的開發哦!大家也可以自己去試試開發,看看你能否開發出來的哦!