UI框架简介(五)

9 篇文章 1 订阅
5 篇文章 0 订阅

下面我们来讲解事件层代码了哦!这个也比较难的哦!如果一会你实在看不懂理解不了也没有关系,因为这些东西吧!只要会用就行,会和后端定协议就可以哦!协议一会我来教你怎么定吧!首先我们来看看如何与后端定消息哦!

这是一个枚举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();
        }
    }
}

如果大家看了这么多的代码还是不太理解的话,我们一会再开发背包时会使用这些事件的哦!会用就行了哦!具体里面怎么写的逻辑,不需要管,知道如何派发和侦听事件就行了哦!

本篇小结:写到这里,框架的脚本基本上都讲解完了哦!不知道大家能够理解多少呢!下篇博客我会带大家一起来完成一个背包模块的开发哦!大家也可以自己去试试开发,看看你能否开发出来的哦!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值