消息中心(事件中心)

转眼回来半个月了,
以前感觉吃了睡,醒了趴,趴了饿,饿了吃的猪一般的生活挺容易的,现在自己体会了三十和初一,刚体验了两天,感觉自己坚持不住了,他丫的,突然感觉猪也挺不容易的啊,无所事事的生活真心难受.
我还是努力工作吧,起码能找到自我!实现自己的价值!还有钱赚,多好!

不多说,上代码


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

/// <summary>
/// 事件类
/// </summary>
public class DelegateEvent
{
    //定义委托函数
    public delegate void EventHandler(EventData data);

    //定义基于委托函数的事件
    public event EventHandler eventHandler;

    //触发监听事件,处理和分发
    public void Handle(EventData data)
    {
        if (eventHandler != null)
        {
            eventHandler(data);
        }
    }

    //删除
    public void DelListener(EventHandler delHandler)
    {
        if (eventHandler != null)
        {
            eventHandler -= delHandler;
        }
    }

    //添加
    public void AddListener(EventHandler addHandler)
    {
        eventHandler += addHandler;
    }

}

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

/// <summary>
/// 事件数据
/// </summary>
public class EventData
{
    public GameEvent.EventType type;
    public object data;
}
using System.Collections.Generic;
using GameEvent;

/// <summary>
/// 事件管理
/// </summary>
public class EventManager
{
    private static Dictionary<EventType, DelegateEvent> eventListenerPool = new Dictionary<EventType, DelegateEvent>();

    //添加
    public static void AddEventListner(EventType type, DelegateEvent.EventHandler handler)
    {
        DelegateEvent delegateEvent;
        if (eventListenerPool.ContainsKey(type))
        {
            delegateEvent = eventListenerPool[type];
        }
        else
        {
            delegateEvent = new DelegateEvent();
            eventListenerPool[type] = delegateEvent;
        }
        delegateEvent.AddListener(handler);
    }

    //删除
    public static void DelEventListener(EventType type, DelegateEvent.EventHandler handler)
    {
        if (handler == null)
        {
            return;
        }
        if (eventListenerPool.ContainsKey(type))
        {
            return;
        }
        DelegateEvent delegateEvent = eventListenerPool[type];
        delegateEvent.DelListener(handler);
    }

    //发送消息
    public static void SendEvent(EventType type, object data)
    {
        if (!eventListenerPool.ContainsKey(type))
        {
            return;
        }
        //创建数据包
        EventData eventData = new EventData();
        eventData.type = type;
        eventData.data = data;
        DelegateEvent delegateEvent = eventListenerPool[type];
        //传递
        delegateEvent.Handle(eventData);
    }


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

/// <summary>
/// 游戏事件行为
/// </summary>
namespace GameEvent
{
    //UI消息号
    public enum UI_MsgCode
    {
        STARTUI,
        CLOSEUI,
    }

    //玩家行为
    public enum Player_MsgCode
    {
        PLAYER_BEHAVIOR,
    }

    //玩家事件类型
    public enum EventType
    {
        MOVE,
        ATTACK,
        LOGIN,
        ATTACKANIM,
    }

}

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

/// <summary>
/// 消息体
/// </summary>
public class MoveBsehaviorProcess
{
    public GameEvent.EventType eventType;
    public Player_MsgCode playermsg;

}

目前为止,只写了一些基本的方法,用来创建数据和发送消息,然后简单的做了个登录界面

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

public class LoginUI : MonoBehaviour
{
    InputField username, password;
    Button LoginBtn;

    // Start is called before the first frame update
    void Start()
    {
        EventManager.AddEventListner(GameEvent.EventType.LOGIN, LoginToMain);

        username = transform.Find("username").GetComponent<InputField>();
        password = transform.Find("password").GetComponent<InputField>();

        LoginBtn = transform.Find("LoginBtn").GetComponent<Button>();
        LoginBtn.onClick.AddListener(ClickToLogin);
    }

    //登录行为
    private void LoginToMain(EventData data)
    {
        string strr = (string)data.data;
        switch (data.type)
        {
            case GameEvent.EventType.MOVE:
                break;
            case GameEvent.EventType.ATTACK:
                break;
            case GameEvent.EventType.LOGIN:
                //这里应该是本地读取到的用户名和密码,然后发送给服务器验证是否匹配,正确进入主界面
                if (strr == "a|a")
                {
                    Destroy(this.gameObject);
                }
                else
                {
                    Debug.Log("用户名或密码错误");
                }
                break;
            default:
                break;
        }
    }

    //点击登录按钮,删除本UI,进入游戏
    private void ClickToLogin()
    {
        string s1 = username.text;
        string s2 = password.text;
        string str = s1 + "|" + s2;
        EventManager.SendEvent(GameEvent.EventType.LOGIN, str);

    }

    // Update is called once per frame
    void Update()
    {

    }
}

还有个模型控制的

using System;
using UnityEngine;
using UnityEngine.UI;
using GameEvent;

/// <summary>
/// CubeBoss渲染类
/// </summary>
public class CubeBossCtrl : MonoBehaviour
{
    GameObject Bear;
    Animator CubeBossAnim;
    Slider CubeBossSlider;

    // Start is called before the first frame update
    void Start()
    {
        EventManager.AddEventListner(GameEvent.EventType.MOVE, MoveBsehavior);
        EventManager.AddEventListner(GameEvent.EventType.ATTACK, AttackBsehavior);

        Bear = GameObject.Find("Bear");
        CubeBossAnim = GetComponent<Animator>();
        CubeBossSlider = GameObject.Find("CubeBossSlider").GetComponent<Slider>();
    }

    /// <summary>
    /// 攻击行为
    /// </summary>
    /// <param name="data"></param>
    private void AttackBsehavior(EventData data)
    {
        string str = (string)data.data;

        switch (data.type)
        {
            case GameEvent.EventType.MOVE:
                break;
            case GameEvent.EventType.ATTACK:
                CubeBossAnim.SetBool("attack", true);
                break;
            case GameEvent.EventType.LOGIN:
                break;
            default:
                Debug.Log("无行为");
                break;
        }
    }

    /// <summary>
    /// 移动行为
    /// </summary>
    /// <param name="data"></param>
    private void MoveBsehavior(EventData data)
    {
        Vector3 vec = (Vector3)data.data;

        switch (data.type)
        {
            case GameEvent.EventType.MOVE:
                transform.LookAt(vec + transform.position);
                transform.Translate(Vector3.forward * 0.05f);
                CubeBossAnim.SetBool("walk", true);
                break;
            case GameEvent.EventType.ATTACK:
                break;
            case GameEvent.EventType.LOGIN:
                break;
            default:
                Debug.Log("无行为");
                break;
        }
    }

    // Update is called once per frame
    void Update()
    {
        CubeBossSlider.transform.position = Camera.main.WorldToScreenPoint(transform.position + Vector3.up * 2);

        if (Input.GetKey(KeyCode.Space))
        {
            string str = "attack";
            EventManager.SendEvent(GameEvent.EventType.ATTACK, str);
        }

    }

    private void FixedUpdate()
    {
        int num = 0;
        if (Input.anyKey)
        {

            if (Input.GetKey(KeyCode.W))
            {
                num += 1;
            }
            //2
            if (Input.GetKey(KeyCode.S))
            {
                num += 2;
            }
            //4
            if (Input.GetKey(KeyCode.A))
            {
                num += 4;
            }
            //8
            if (Input.GetKey(KeyCode.D))
            {
                num += 8;
            }
        }
        else
        {
            CubeBossAnim.SetBool("walk", false);
            CubeBossAnim.SetBool("attack", false);
        }

        switch (num)
        {
            //前
            case 1:
                Vector3 W = new Vector3(0, 0, 1);
                EventManager.SendEvent(GameEvent.EventType.MOVE, W);
                break;
            //后
            case 2:
                Vector3 S = new Vector3(0, 0, -1);
                EventManager.SendEvent(GameEvent.EventType.MOVE, S);
                break;
            //左
            case 4:
                Vector3 A = new Vector3(-1, 0, 0);
                EventManager.SendEvent(GameEvent.EventType.MOVE, A);
                break;
            //右
            case 8:
                Vector3 D = new Vector3(1, 0, 0);
                EventManager.SendEvent(GameEvent.EventType.MOVE, D);
                break;
            //左前
            case 5:
                Vector3 WA = new Vector3(-1, 0, 1);
                EventManager.SendEvent(GameEvent.EventType.MOVE, WA);
                break;
            //右前
            case 9:
                Vector3 WD = new Vector3(1, 0, 1);
                EventManager.SendEvent(GameEvent.EventType.MOVE, WD);
                break;
            //左后
            case 6:
                Vector3 SA = new Vector3(-1, 0, -1);
                EventManager.SendEvent(GameEvent.EventType.MOVE, SA);
                break;
            //右后
            case 10:
                Vector3 SD = new Vector3(1, 0, -1);
                EventManager.SendEvent(GameEvent.EventType.MOVE, SD);
                break;
            default:
                break;
        }
    }


}

唉,暂时就这样吧,去买口罩了,虽然我没赶上SARS的重灾区,身在北京算是捡着了吧,是个运气,哈哈哈,刚刚买了一百个口罩,给爷爷奶奶分点去,走咯

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值