下面我们来讲解事件层代码了哦!这个也比较难的哦!如果一会你实在看不懂理解不了也没有关系,因为这些东西吧!只要会用就行,会和后端定协议就可以哦!协议一会我来教你怎么定吧!首先我们来看看如何与后端定消息哦!
这是一个枚举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();
}
}
}
如果大家看了这么多的代码还是不太理解的话,我们一会再开发背包时会使用这些事件的哦!会用就行了哦!具体里面怎么写的逻辑,不需要管,知道如何派发和侦听事件就行了哦!
本篇小结:写到这里,框架的脚本基本上都讲解完了哦!不知道大家能够理解多少呢!下篇博客我会带大家一起来完成一个背包模块的开发哦!大家也可以自己去试试开发,看看你能否开发出来的哦!