当前位置: 首页 > news >正文

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

我们打开上一篇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.mrgr.cn/news/26455.html

相关文章:

  • Java中的服务发现机制:Eureka与Consul的比较
  • openCV的python频率域滤波
  • 2024122读书笔记|《人生歪理,歪的很有道理》——生活奇奇怪怪,你要可可爱爱
  • Velocity基本内容、语法、规则介绍
  • 创建一个简单的思维导图生成器
  • Golang | Leetcode Golang题解之第404题左叶子之和
  • NISP 一级 | 5.1 浏览器安全
  • Github 2024-09-14 Rust开源项目日报Top10
  • 用Python实现时间序列模型实战——Day 20: 时间序列预测的综合练习
  • 数据备份的几种方法
  • C++语法应用:深复制的一种替代方案
  • Upstage 将发布新一代 LLM “Solar Pro “预览版
  • sharding-jdbc metadata load优化(4.1.1版本)
  • 工具方法 - 高我法
  • 在国内版Office 365中通过PowerShell命令查询指定主题的邮件详解
  • Java 每日一刊(第6期):整数运算
  • AI+RPA:开启智能自动化新时代
  • Flask中的蓝图如何进行模块化
  • Git 中的refs
  • CSS基本布局理解——WEB开发系列38