『功能项目』事件中心【43】

我们打开上一篇42怪物的有限状态机的项目,

本章要做的事情是利用事件中心(和观察者模式相仿)将Update()函数中写的GameObject.Find()这些语句替换掉,因为在Update()函数中每帧的执行频率非常快,如果在Update()函数中写GameObject.Find()语句特别消耗性能,本章主题意义在于利用事件中心优化脚本代码,提升项目质量

首先创建脚本:IEventInfo.cs

cs 复制代码
using UnityEngine;
//事件的存储与管理 订阅者
public class IEventInfo : MonoBehaviour{
    
}

创建脚本:EventInfo.cs

cs 复制代码
using UnityEngine.Events;
//事件的存储与管理 订阅者
public class EventInfo : IEventInfo { 
    public UnityAction actions;
    public EventInfo(UnityAction actions){
        this.actions += actions;
    }
}
public class EventInfo<T> : IEventInfo {
    public UnityAction<T> actions;
    public EventInfo(UnityAction<T> action){
        actions = action;
    }
} 

创建脚本:EventCenter.cs

cs 复制代码
using System.Collections.Generic;
using UnityEngine.Events;
//中介者
public class EventCenter : Singleton<EventCenter>{
    //存储事件列表
    Dictionary<string,IEventInfo> eventDic = new Dictionary<string,IEventInfo>();
    //订阅消息
    public void AddEventListener(string name, UnityAction action) {
        if (eventDic.ContainsKey(name)){
            (eventDic[name] as EventInfo).actions += action;
        }
        else {
            eventDic.Add(name, new EventInfo(action));
        }
    }
    //通知消息
    public void EventTrigger(string name) {
        if (eventDic.ContainsKey(name)) {
            if ((eventDic[name] as EventInfo).actions != null) {
                (eventDic[name] as EventInfo).actions.Invoke();
            }
        }
    }
    public void RemoveEventListener(string name, UnityAction action) {
        if (eventDic.ContainsKey(name)) {
            (eventDic[name] as EventInfo).actions -= action;    
        }
    }
    //添加带参数事件的监听
    public void AddEventListener<T>(string name, UnityAction<T> action){
        //旧事件
        if (eventDic.ContainsKey(name)){
            (eventDic[name] as EventInfo<T>).actions += action;
        }
        //新事件
        else{
            eventDic.Add(name, new EventInfo<T>(action));
        }
    }
    //移除带参数事件的监听
    public void RemoveEventListener<T>(string name, UnityAction<T> action){
        if (eventDic.ContainsKey(name)){
            (eventDic[name] as EventInfo<T>).actions -= action;
        }
    }
    //分发带参数的事件
    public void EventTrigger<T>(string name,T info){
        if (eventDic.ContainsKey(name)){
            if ((eventDic[name] as EventInfo<T>).actions != null){
                (eventDic[name] as EventInfo<T>).actions.Invoke(info);
            }
        }
    }
    public void Clear() {
        eventDic.Clear();
    }
}

修改脚本:PlayerRayClickNavigation.cs

修改脚本:

运行项目 - 功能不变没有报错

本章利用事件中心(与观察者模式相仿)替换掉了Update()函数中的GameObject.Find()语句提升项目质量

接下来的内容:

1.战士职业平A(按A键)使怪物掉血的功能

2.窗口可拖拽脚本

3.点击名称寻找地点功能

4.隐藏怪物的生成

5.怪物I攻击范围内的主动攻击

6.掉落坐骑蛋的获取

7.异步传送转换场景

以及开放回合制、坐骑系统、宠物系统、背包系统、神炼系统、商城系统、Boss的目标跟随任务导航系统以及UI播放3D动画效果等等。

具体项目运行效果请关注water1024的b站视频项目演示《破碎纪元》

【Unity回合2.5D】破碎纪元_单机游戏热门视频 (bilibili.com)https://www.bilibili.com/video/BV1rZY4e9Ebs/?spm_id_from=333.999.0.0&vd_source=547091a95b03acfa8e8a9e46ef499cd6

相关推荐
一枚小小程序员哈3 小时前
基于微信小程序的家教服务平台的设计与实现/基于asp.net/c#的家教服务平台/基于asp.net/c#的家教管理系统
后端·c#·asp.net
Eternity_GQM5 小时前
【Word VBA Zotero 引用宏错误分析与改正指南】【解决[21–23]参考文献格式插入超链接问题】
开发语言·c#·word
cimeo10 小时前
【C 学习】06-算法&程序设计举例
c#
百锦再10 小时前
.NET 的 WebApi 项目必要可配置项都有哪些?
java·开发语言·c#·.net·core·net
WYH28720 小时前
C#控制台输入(Read()、ReadKey()和ReadLine())
开发语言·c#
hqwest1 天前
C#WPF实战出真汁06--【系统设置】--餐桌类型设置
c#·.net·wpf·布局·分页·命令·viewmodel
做一位快乐的码农1 天前
基于.net、C#、asp.net、vs的保护大自然网站的设计与实现
c#·asp.net·.net
DavieLau1 天前
C#项目WCF接口暴露调用及SOAP接口请求测试(Python版)
xml·服务器·开发语言·python·c#
张人玉1 天前
C#Encoding
开发语言·c#
hqwest1 天前
C#WPF实战出真汁05--左侧导航
开发语言·c#·wpf·主界面·窗体设计·视图viewmodel