【行为型之迭代器模式】游戏开发实战——Unity高效集合遍历与场景管理的架构精髓
文章目录
- 🔄 迭代器模式(Iterator Pattern)深度解析
- 一、模式本质与核心价值
- 二、经典UML结构
- 三、Unity实战代码(背包系统遍历)
- 1. 定义迭代器与聚合接口
- 2. 实现具体聚合类(背包物品集合)
- 3. 实现具体迭代器
- 4. 客户端使用
- 四、模式进阶技巧
- 1. 过滤迭代器(按类型遍历)
- 2. 协程分帧遍历
- 3. 双向迭代器
- 五、游戏开发典型应用场景
- 六、性能优化策略
- 七、模式对比与选择
- 八、最佳实践原则
- 九、常见问题解决方案
🔄 迭代器模式(Iterator Pattern)深度解析
——以Unity实现高效集合遍历与动态场景管理为核心案例
一、模式本质与核心价值
核心目标:
✅ 统一集合遍历接口,无需暴露内部数据结构
✅ 支持多种遍历方式(顺序、逆序、过滤等)
✅ 解耦集合结构与遍历算法,提升代码扩展性
关键术语:
- Iterator(迭代器接口):定义遍历操作(Next、HasNext等)
- ConcreteIterator(具体迭代器):实现特定遍历逻辑
- Aggregate(聚合接口):定义创建迭代器的方法
- ConcreteAggregate(具体聚合):实现集合数据结构
数学表达:
设集合C有元素{e₁, e₂, …, eₙ},迭代器I满足:
I© → e₁ → e₂ → … → eₙ
二、经典UML结构
三、Unity实战代码(背包系统遍历)
1. 定义迭代器与聚合接口
public interface IIterator<T> {bool HasNext();T Next();void Reset();
}public interface IAggregate<T> {IIterator<T> CreateIterator();int Count { get; }T this[int index] { get; }
}
2. 实现具体聚合类(背包物品集合)
public class Inventory : IAggregate<Item> {private List<Item> _items = new();public void AddItem(Item item) => _items.Add(item);public IIterator<Item> CreateIterator() => new InventoryIterator(this);public int Count => _items.Count;public Item this[int index] => _items[index];
}
3. 实现具体迭代器
public class InventoryIterator : IIterator<Item> {private Inventory _inventory;private int _index;public InventoryIterator(Inventory inventory) {_inventory = inventory;_index = -1;}public bool HasNext() => _index < _inventory.Count - 1;public Item Next() => _inventory[++_index];public void Reset() => _index = -1;
}
4. 客户端使用
public class InventoryUI : MonoBehaviour {[SerializeField] private Inventory _inventory;void Update() {if(Input.GetKeyDown(KeyCode.I)) {StartCoroutine(DisplayItems());}}private IEnumerator DisplayItems() {var iterator = _inventory.CreateIterator();while(iterator.HasNext()) {Item item = iterator.Next();Debug.Log($"物品:{item.Name}");yield return null; // 分帧显示避免卡顿}}
}
四、模式进阶技巧
1. 过滤迭代器(按类型遍历)
public class WeaponIterator : IIterator<Item> {private IIterator<Item> _baseIterator;public WeaponIterator(Inventory inventory) {_baseIterator = inventory.CreateIterator();}public bool HasNext() {while(_baseIterator.HasNext()) {if(_baseIterator.Next() is Weapon) {_baseIterator.ResetToPrevious();return true;}}return false;}public Item Next() => _baseIterator.Next();
}
2. 协程分帧遍历
public static class IteratorExtensions {public static IEnumerator CoIterate<T>(this IIterator<T> iterator, Action<T> action) {while(iterator.HasNext()) {action(iterator.Next());yield return null; // 每帧处理一个元素}}
}// 使用示例
StartCoroutine(_inventory.CreateIterator().CoIterate(item => {// 处理每个物品
}));
3. 双向迭代器
public interface IBidirectionalIterator<T> : IIterator<T> {bool HasPrevious();T Previous();
}public class InventoryBidirectionalIterator : IBidirectionalIterator<Item> {// 实现前后遍历逻辑
}
五、游戏开发典型应用场景
-
场景对象管理
public class SceneObjectManager : IAggregate<GameObject> {private List<GameObject> _objects = new();public IIterator<GameObject> CreateIterator() => new SceneObjectIterator(this); }
-
技能效果链
public class SkillEffectChain : IAggregate<IEffect> {public IIterator<IEffect> CreateReverseIterator() {return new ReverseEffectIterator(this);} }
-
AI决策评估
public class AIEvaluator {public void EvaluateAll(IIterator<AICondition> conditions) {while(conditions.HasNext()) {var condition = conditions.Next();condition.Evaluate();}} }
-
动态生成系统
public class WorldGenerator {public void GenerateChunks(IIterator<Vector3> positionIterator) {while(positionIterator.HasNext()) {GenerateChunkAt(positionIterator.Next());}} }
六、性能优化策略
策略 | 实现方式 | 适用场景 |
---|---|---|
批处理迭代 | 每次处理多个元素 | 大规模数据集 |
缓存迭代器 | 复用迭代器实例 | 频繁遍历操作 |
惰性求值 | 需要时再计算元素 | 复杂对象集合 |
空间分区 | 结合四叉树/八叉树 | 3D场景遍历 |
七、模式对比与选择
维度 | 迭代器模式 | 访问者模式 |
---|---|---|
关注点 | 遍历机制 | 数据操作 |
扩展性 | 新增迭代方式 | 新增操作类型 |
数据结构耦合 | 低耦合 | 需要接受访问者接口 |
典型场景 | 集合遍历 | 复杂数据结构操作 |
八、最佳实践原则
- 单一职责原则:迭代器只关注遍历逻辑
- 不可变快照:在迭代过程中防止集合修改
public class SnapshotIterator<T> : IIterator<T> {private readonly T[] _snapshot;// 基于快照的迭代实现... }
- 异常处理:处理边界条件
public T Next() {if(!HasNext()) throw new InvalidOperationException("No more elements");// ... }
- 资源释放:实现IDisposable接口
public class FileLineIterator : IIterator<string>, IDisposable {private StreamReader _reader;public void Dispose() => _reader?.Dispose(); }
九、常见问题解决方案
Q1:如何避免遍历时集合被修改?
→ 使用读写锁或副本迭代
public class ThreadSafeIterator<T> : IIterator<T> {private ReaderWriterLockSlim _lock;// 在Next/HasNext中加读锁...
}
Q2:如何实现复杂条件过滤?
→ 使用组合过滤器
public class CompositeFilterIterator<T> : IIterator<T> {private List<Predicate<T>> _filters = new();public void AddFilter(Predicate<T> filter) {_filters.Add(filter);}public bool HasNext() {while(_baseIterator.HasNext()) {var item = _baseIterator.Peek();if(_filters.All(f => f(item))) return true;_baseIterator.Next();}return false;}
}
Q3:如何优化大型场景遍历性能?
→ 实现空间分区迭代器
public class QuadTreeIterator : IIterator<GameObject> {private QuadTree _quadTree;private List<QuadTreeNode> _nodeStack = new();public bool HasNext() {while(_nodeStack.Count > 0) {var current = _nodeStack.Last();if(current.HasChildren) {// 处理子节点...} else {return current.Objects.Count > 0;}}return false;}
}
上一篇 【行为型之解释器模式】游戏开发实战——Unity动态公式解析与脚本系统的架构奥秘
下一篇 【行为型之中介者模式】游戏开发实战——Unity复杂系统协调与通信架构的核心秘诀
相关文章:
【行为型之迭代器模式】游戏开发实战——Unity高效集合遍历与场景管理的架构精髓
文章目录 🔄 迭代器模式(Iterator Pattern)深度解析一、模式本质与核心价值二、经典UML结构三、Unity实战代码(背包系统遍历)1. 定义迭代器与聚合接口2. 实现具体聚合类(背包物品集合)3. 实现具…...

Vuetify框架使用(一)之v-snackbar 组件封装及全局使用
说明:v-snackbar 组件适用于统一管理消息提示框(操作反馈的提示) 看效果: 1、在状态管理中创建文件,统一管理 // stores/snackbar.js /*** 统一管理消息提示框(操作反馈的提示)*/import { defineStore } from pinia; // 消息类型 export co…...

FPGA: UltraScale+ bitslip实现(方案+代码)
收获 一晃五年~ 五年前那个夏夜,我对着泛蓝的屏幕敲下《给十年后的自己》,在2020年的疫情迷雾中编织着对未来的想象。此刻回望,第四届集创赛的参赛编号仍清晰如昨,而那个在家熬夜焊电路板的"不眠者",现在…...

【SpeechLMs】语音大型语言模型综述《A Survey on Speech Large Language Models》
摘要 大型语言模型 (LLM) 表现出强大的上下文理解能力和显著的多任务性能。 因此,研究人员一直在寻求将 LLM 整合到更广泛的语音语言理解 (SLU) 领域。 与传统方法不同,传统方法是将 LLM 级联以处理自动语音识别 (ASR) 生成的文本,而新方法则…...
C# 实现雪花算法(Snowflake Algorithm)详解与应用
在现代分布式系统中,生成全局唯一的标识符(ID)是一个非常重要的问题。随着微服务架构和分布式系统的普及,传统的单机数据库生成 ID 的方式已无法满足高并发和高可用的需求。为了解决这个问题,Twitter 提出了 雪花算法&…...

吴恩达机器学习笔记:特征与多项式回归
1.特征和多项式回归 如房价预测问题, ℎθ (x) θ0 θ1 frontage θ2 deptℎ x1 frontage(临街宽度),x2 deptℎ(纵向深度),x frontage ∗ deptℎ area (面积)…...
Flutter 与HarmonyOS Next 混合渲染开发实践:以 fluttertpc_scan 三方库为例
一、背景与价值 在跨平台开发中,Flutter 以其高效的 UI 构建能力著称,而鸿蒙 Next(OpenHarmony)则提供了深度系统集成的原生能力。将两者结合,可实现 UI 跨平台 原生功能深度融合 的混合渲染模式。本文以扫描库 flut…...

LangChain4j正式发布-简化将 LLM 集成到 Java 应用程序过程
LangChain4j 的目标是简化将 LLM 集成到 Java 应用程序中的过程。 官网地址 源码地址 开源协议:Apache License 2.0 实现方法 统一 API:LLM 提供程序(如 OpenAI 或 Google Vertex AI)和嵌入(矢量)存储…...

【C++】汇编角度分析栈攻击
栈攻击 介绍原理示例代码汇编分析 介绍原理 核心原理是通过 缓冲区溢出(Buffer Overflow) 等漏洞,覆盖栈上的关键数据(如返回地址、函数指针),从而改变程序执行流程; 在 C 中,每个…...

Vue 3 打开 el-dialog 时使 el-input 获取焦点
运行代码:https://andi.cn/page/622178.html 效果:...

C++23 views::repeat (P2474R2) 深入解析
文章目录 引言C20 Ranges库回顾什么是Rangesstd::views的作用 views::repeat概述基本概念原型定义工作原理应用场景初始化容器模拟测试数据 总结 引言 在C的发展历程中,每一个新版本都会带来一系列令人期待的新特性,这些特性不仅提升了语言的性能和表达…...
HTML5 定位详解:相对定位、绝对定位和固定定位
在HTML5和CSS中,定位(positioning)是控制元素在页面上位置的重要机制。主要有四种定位方式:静态定位(static)、相对定位(relative)、绝对定位(absolute)和固定定位(fixed)。下面我将详细讲解这三种非静态定位方式,并提供相应的源代码示例。 …...

OpenCv高阶(4.0)——案例:海报的透视变换
文章目录 前言一、工具函数模块1.1 图像显示函数1.2 保持宽高比的缩放函数1.3 坐标点排序函数 二、透视变换核心模块2.1 四点透视变换实现 三、主流程技术分解3.1 图像预处理3.2 轮廓检测流程3.3 最大轮廓处理 四、后处理技术4.1 透视变换4.2 形态学处理 五、完整代码总结 前言…...

光谱相机的图像预处理技术
光谱相机的图像预处理技术旨在消除噪声、增强有效信息,为后续分析提供高质量数据。 一、预处理流程与技术要点 辐射校正 辐射定标:将图像灰度值转换为绝对辐射亮度,常用反射率法、辐亮度法和辐照度法消除传感器响应差异࿰…...
CSS 溢出内容处理、可见性控制与盒类型设置深度解析
CSS溢出内容处理、可见性控制与盒类型设置深度解析 一、溢出内容处理(Overflow) 在网页设计中,内容超出容器边界是常见问题。CSS提供了overflow属性及其变体来控制这种情况。 1.1 溢出基本属性 核心属性: overflow: visible&…...

k8s监控方案实践补充(一):部署Metrics Server实现kubectl top和HPA支持
k8s监控方案实践补充(一):部署Metrics Server实现kubectl top和HPA支持 文章目录 k8s监控方案实践补充(一):部署Metrics Server实现kubectl top和HPA支持一、Metrics Server简介二、Metrics Server实战部署…...
从代码学习深度学习 - 实战 Kaggle 比赛:图像分类 (CIFAR-10 PyTorch版)
文章目录 前言1. 读取并整理数据集1.1 读取标签文件1.2 划分训练集和验证集1.3 整理测试集1.4 执行数据整理2. 图像增广2.1 训练集图像变换2.2 测试集(和验证集)图像变换3. 读取数据集3.1 创建 Dataset 对象3.2 创建 DataLoader 对象4. 定义模型4.1 获取 ResNet-18 模型4.2 损…...
【数据结构】二分查找5.12
Basic 需求:在有序数组A内,查找值target 如果找到返回索引 如果找不到返回-1 算法描述: 前提:给定一个内含n个元素的有序数组A(升序),一个待查找值 设置两个索引:i0;jn-1; 如果…...
深入探索向量数据库:构建智能应用的新基础
📌 友情提示: 本文内容由银河易创AI(https://ai.eaigx.com)创作平台的gpt-4-turbo模型辅助生成,旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证,建议读者通过官方文档或实践进一步确认…...
Swagger go中文版本手册
Swaggo(github.com/swaggo/swag)的注解语法是基于 OpenAPI 2.0 (以前称为 Swagger 2.0) 规范的,并添加了一些自己的约定。 主要官方文档: swaggo/swag GitHub 仓库: 这是最权威的来源。 链接: https://github.com/swaggo/swag重点关注: README.md: 包含了基本的安装、使用…...
Cloudera CDP 7.1.3 主机异常关机导致元数据丢失,node不能与CM通信
问题描述 plaintext ERROR Could not load post-deployment data from /var/run/cloudera-scm-agent/process/ccdeploy_hadoop-conf_etchadoopconf.cloudera.yarn_-8903374259073700469 IOError: [Errno 2] No such file or directory: /var/run/cloudera-scm-agent/proce…...
Redis特性与应用
1、分布式缓存与redis 2、redis数据结构和客户端集成 3、缓存读写模式与数据一致性 本地缓存:Hash Map、Ehcache、Caffeine、Google Guava 分布式缓存:Memcached、redis、Hazelcast、Apache ignite redis:基于键值对内存数据库,支…...

嵌入式调试新宠!J-Scope:免费+实时数据可视化,让MCU调试效率飙升!
📌 痛点直击:调试还在用“断点打印”? 嵌入式开发中,你是否也经历过这些崩溃瞬间? 想实时观察变量变化,代码里插满printf,结果拖垮系统性能? 断点调试打断程序运行,时序…...

微信小程序学习之搜索框
1、第一步,我们在index.json中引入vant中的搜索框控件: {"usingComponents": {"van-search": "vant/weapp/search/index"} } 2、第二步,直接在index.wxml中添加布局: <view class"index…...

Altium Designer AD如何输出PIN带网络名的PDF装配图
Altium Designer AD如何输出PIN带网络名的PDF装配图 文描述在Altium Designer版本中设置焊盘网络名时遇到的问题,网络名大小不一致,部分PAD的网络名称未显示,可能涉及字符大小设置和版本差异。 参考 1.AD导出PCB装配图 https://blog.csd…...

VMware虚拟机 安装 CentOS 7
原文链接: VMware虚拟机 安装 CentOS 7 安装准备 软件: VMware Workstation Pro 17.6.3 镜像: CentOS-7.0-1406-x86_64-DVD.iso 我打包好放这了,VMware 和 CentOS7 ,下载即可。 关于VMware Workstation Pro 17.6.3,傻瓜式安装即可。 CentO…...
关于高并发GIS数据处理的一点经验分享
1、背景介绍 笔者过去几年在参与某个大型央企的项目开发过程中,遇到了十分棘手的难题。其与我们平常接触的项目性质完全不同。在一般的项目中,客户一般只要求我们能够通过桌面软件对原始数据进行加工处理,将各类地理信息数据加工处理成地图/场景和工作空间,然后再将工作空…...
Python训练打卡Day22
复习日: 1.标准化数据(聚类前通常需要标准化) scaler StandardScaler() X_scaled scaler.fit_transform(X) StandardScaler() :这部分代码调用了 StandardScaler 类的构造函数。在Python中,当你在类名后面加上括号…...

Cold Diffusion: Inverting Arbitrary Image Transforms Without Noise论文阅读
冷扩散:无需噪声的任意图像变换反转 摘要 标准扩散模型通常涉及两个核心步骤:图像降质 (添加高斯噪声)和图像恢复 (去噪操作)。本文发现,扩散模型的生成能力并不强烈依赖于噪声的选择…...
2025认证杯数学建模第二阶段C题:化工厂生产流程的预测和控制,思路+模型+代码
2025认证杯数学建模第二阶段思路模型代码,详细内容见文末名片 一、探秘化工世界:问题背景大揭秘 在 2025 年 “认证杯”数学中国数学建模网络挑战赛第二阶段 C 题中,我们一头扎进了神秘又复杂的化工厂生产流程预测与控制领域。想象一下&…...