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

news2024/11/16 1:28:06

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

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

首先创建脚本:IEventInfo.cs

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

创建脚本:EventInfo.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

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)icon-default.png?t=O83Ahttps://www.bilibili.com/video/BV1rZY4e9Ebs/?spm_id_from=333.999.0.0&vd_source=547091a95b03acfa8e8a9e46ef499cd6

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2134020.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Centos入门必备基础知识

CentOS&#xff08;Community ENTerprise Operating System&#xff09;是一个开源的Linux发行版&#xff0c;基于Red Hat Enterprise Linux&#xff08;RHEL&#xff09;源代码构建。以下是CentOS入门必备的一些基础知识&#xff1a; 前言 本文由浪浪云赞助发布&#xff0c;…

设计模式 桥接模式(Bridge Pattern)

文章目录 桥接模式简绍桥接模式的核心概念包括以下几个部分&#xff1a;桥接模式的工作流程桥接模式优缺点桥接模式优点桥接模式缺点 UML图代码示例适用场景 桥接模式简绍 桥接模式&#xff08;Bridge Pattern&#xff09;是对象结构型设计模式中的一种&#xff0c;它将抽象与…

艾丽卡的区块链英语小课堂

系列文章目录 IT每日英语&#xff08;三&#xff09; 文章目录 系列文章目录前言1.principle2.efficient3.implement4.accumulated5,occupation6.phases7.validator8.nominated9.commissions10.significantly 前言 欢迎来到艾丽卡的区块链英语小课堂&#xff0c;在这里&…

650人微软员工被裁,动视暴雪制作团队调整,游戏行业风云再起

易采游戏网9月14日消息&#xff1a;微软宣布将裁员650人&#xff0c;这一消息在游戏行业引起了广泛的关注和讨论。此次裁员主要集中在微软的子公司动视暴雪&#xff0c;涉及到《魔兽大作战》和《使命召唤&#xff1a;战争地带》这两个备受瞩目的游戏团队。尽管裁员让很多玩家感…

基于python+django+vue的二手电子设备交易平台

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的二…

wget不管用的情况下,如何在centos中手动安装yum

wget不管用的情况下&#xff0c;如何在centos中手动安装yum 1、卸载python和yum2、手动下载需要的包3、更换yum源4、清理yum缓存&#xff0c;并生成新的缓存5、更新yum6、最后试试安装wget 问题背景&#xff0c;我在使用yum遇到了问题&#xff0c;想着重新安装一下&#xff0c;…

生成式人工智能(AIGC)对职业院校“云课堂”的赋能路径与价值边界

一、前言 随着教育技术的快速发展&#xff0c;生成式人工智能&#xff08;Artificial Intelligence General Content, AIGC&#xff09;正在成为推动教育改革的重要力量。生成式人工智能&#xff08;AIGC&#xff09;技术的应用&#xff0c;为职业院校的“云课堂”提供了新的教…

Oracle数据库软件的下载与安装步骤(适用于初学者)

目录 背景: 安装过程&#xff1a; 验证是否安装成功&#xff1a; 背景: Oracle&#xff0c;全程Oracle Corporation(甲骨文公司)&#xff0c;是全球领先的企业级软件公司&#xff0c;其最著名的产品是Oracle数据库&#xff0c;Oracle数据库是一款关系型数据库系统(RDBMS)&am…

世界主要国家跨境数据流动的政策法规及其启示

文章目录 前言一、主要国家加强跨境数据流动的监管措施二、全球跨境数据流动的关键问题三、中国跨境数据流动治理的不足与对策前言 随着数据成为全球经济发展的战略资源,各国政府正积极构建安全有效的治理体系,以扩大数据的社会和经济效益,探讨世界主要国家跨境数据流动的政…

LeetCode题练习与总结:翻转二叉树--226

一、题目描述 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,3,1…

可维护性例题2

答案&#xff1a;C 解析&#xff1a; 选项A 维护性是软件质量的重要指标 选项B 软件开发受软件开发文档因素影响&#xff0c;因此受开发文档影响 选项C 维护占软件开发的比较长的时期 选项D 说法正确

【Python爬虫系列】_020.异步协程asyncio

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈…

水壶问题00

题目链接 水壶问题 题目描述 注意点 1 < x, y, target < 1000 解答思路 首先想到的是深度优先遍历&#xff0c;对于任意一个状态&#xff0c;可以有以下六种操作&#xff1a; 将x水壶中的水倒空将y水壶中的水倒空将x水壶灌满将y水壶灌满将x水壶中的水倒给y水壶&…

Leetcode3275. 第 K 近障碍物查询

Every day a Leetcode 题目来源&#xff1a;3275. 第 K 近障碍物查询 解法1&#xff1a;大根堆 维护前 k 小元素&#xff0c;可以用最大堆。 遍历数组 queries&#xff0c;计算点 (x,y) 到原点的曼哈顿距离 d∣x∣∣y∣。 把 d 入堆&#xff0c;如果堆大小超过 k&#xff…

OpenAI o1来是来了,但...

北京时间昨天凌晨&#xff0c;OpenAI正式发布了o1&#xff0c;这次来是来了&#xff0c;但...结合前一阵的思考和环境&#xff0c;说一下自己的感想吧&#xff1a; Ⅰ. 感觉OpenAI要有朝着Close一条道走到黑的趋势了..且看起来Close的很蹩脚(原因见下)&#xff0c;在这种Close下…

杂七杂八-部署框架

杂七杂八-部署框架 docker docker dockerhub&#xff1a;Docker发布/上传镜像到dockerhub&&下载/拉取镜像&&删除dockerhub镜像 仅个人笔记使用&#xff0c;感谢点赞关注 目前仅专注于 NLP 大模型 机器学习和前后端的技术学习和分享 感谢大家的关注与支持&…

ModuleNotFoundError: No module named ‘transformers_modules.chatglm2-6b

ModuleNotFoundError: No module named ‘transformers_modules.chatglm2-6b 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武…

基于python+django+vue的农业管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的农…

Linux 防火墙:iptables (二)

文章目录 SNAT 原理与应用SNAT 应用环境SNAT 原理SNAT 转换前提条件SNAT 格式SNAT 转换规则配置 DNAT 原理与应用DNAT 应用环境DNAT 原理DNAT 转换前提条件DNAT 格式DNAT 转换规则配置 iptables 规则的备份和还原导出&#xff08;备份&#xff09;所有表的规则导入&#xff08;…

精益思维如何在医疗电子领域实现持续创新?

随着科技的飞速发展&#xff0c;医疗电子设备不仅要求更高的技术精度和稳定性&#xff0c;还需满足日益增长的个性化需求&#xff0c;而精益思维正是实现这一目标的有效途径。 精益思维起源于制造业&#xff0c;强调以最小的资源投入获得最大的运营效益。在医疗电子领域&#x…