【行为型之迭代器模式】游戏开发实战——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结构
creates
«interface»
IIterator
+HasNext() : bool
+Next() : object
InventoryIterator
-_items: Item[]
-_index: int
+HasNext()
+Next()
«interface»
IAggregate
+CreateIterator() : IIterator
Inventory
-_items: Item[]
+CreateIterator()

三、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> {// 实现前后遍历逻辑
}

五、游戏开发典型应用场景
  1. 场景对象管理

    public class SceneObjectManager : IAggregate<GameObject> {private List<GameObject> _objects = new();public IIterator<GameObject> CreateIterator() => new SceneObjectIterator(this);
    }
    
  2. 技能效果链

    public class SkillEffectChain : IAggregate<IEffect> {public IIterator<IEffect> CreateReverseIterator() {return new ReverseEffectIterator(this);}
    }
    
  3. AI决策评估

    public class AIEvaluator {public void EvaluateAll(IIterator<AICondition> conditions) {while(conditions.HasNext()) {var condition = conditions.Next();condition.Evaluate();}}
    }
    
  4. 动态生成系统

    public class WorldGenerator {public void GenerateChunks(IIterator<Vector3> positionIterator) {while(positionIterator.HasNext()) {GenerateChunkAt(positionIterator.Next());}}
    }
    

六、性能优化策略
策略实现方式适用场景
批处理迭代每次处理多个元素大规模数据集
缓存迭代器复用迭代器实例频繁遍历操作
惰性求值需要时再计算元素复杂对象集合
空间分区结合四叉树/八叉树3D场景遍历

七、模式对比与选择
维度迭代器模式访问者模式
关注点遍历机制数据操作
扩展性新增迭代方式新增操作类型
数据结构耦合低耦合需要接受访问者接口
典型场景集合遍历复杂数据结构操作

八、最佳实践原则
  1. 单一职责原则:迭代器只关注遍历逻辑
  2. 不可变快照:在迭代过程中防止集合修改
    public class SnapshotIterator<T> : IIterator<T> {private readonly T[] _snapshot;// 基于快照的迭代实现...
    }
    
  3. 异常处理:处理边界条件
    public T Next() {if(!HasNext()) throw new InvalidOperationException("No more elements");// ...
    }
    
  4. 资源释放:实现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复杂系统协调与通信架构的核心秘诀

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

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

相关文章

18前端项目----Vue项目收尾优化|重要知识

收尾/知识点汇总 项目收尾二级路由未登录全局路由守卫路由独享守卫图片懒加载路由懒加载打包上线 重要知识点汇总组件通信方式1. props2. 自定义事件3. 全局事件总线4. 订阅与发布pubsub5. Vuex6. 插槽 sync修饰符attrs和listeners属性children和parent属性mixin混入作用域插槽…

【Linux】基础指令(Ⅱ)

目录 1. mv指令 2. cat指令 3.echo指令 补&#xff1a;输出重定向 4. more指令 5. less指令 6. head指令和tail指令 7.date指令 时间戳&#xff1a; 8. cal指令 9. alias指令 10.grep指令 1. mv指令 语法&#xff1a;mv [选项]... 源文件/目录 目标文件/目录 …

docker及docker-compose安装及使用

docker compose &#x1f517;官网地址 一、为什么要使用docker compose 1. 简化管理 • 通过一个 YAML 文件定义和管理多容器应用。 • 简化服务间的编排与协调&#xff0c;方便环境的管理与复制。 2. 提升协作效率 • 配置文件易于共享&#xff0c;便于开发、运维等团队协…

JVM学习专题(二)内存模型深度剖析

目录 1.JVM结构体系 ​编辑 2.跨平台特性 3.JVM整体结构及内存模型 1.栈内存 1、栈帧&#xff1a; 1.局部变量表 2.操作数栈 3.动态链接 4.方法出口 2、创建对象 2.程序计数器&#xff1a; 3.方法区 ​4.堆 5.本地方法区 6.总结 1.JVM结构体系 JDK、JRE 和 JVM…

Flink之Table API

Apache Flink 的 Table API 是 Flink 提供的一种高级抽象&#xff0c;用于以声明式方式处理批处理和流处理数据。它是基于关系模型的 API&#xff0c;用户可以像编写 SQL 一样&#xff0c;以简洁、类型安全的方式编写数据处理逻辑。 一、基本概念 1. 什么是 Table API&#xf…

基于Vue3.0的高德地图api教程005:实现绘制线并编辑功能

文章目录 6、绘制多段线6.1 绘制多段线6.1.1 开启绘制功能6.1.2 双击完成绘制6.1.3 保存到数据库6.2 修改多段线6.2.1 点击线,进入编辑模式6.2.2 编辑线6.3 完整代码6、绘制多段线 6.1 绘制多段线 6.1.1 开启绘制功能 实现代码: const changeSwitchDrawPolyline = ()=>…

“redis 目标计算机积极拒绝,无法连接” 解决方法,每次开机启动redis

如果遇到以上问题 先打开“服务” 找到App Readiness 右击-启动 以管理员身份运行cmd&#xff0c;跳转到 安装redis的目录 运行&#xff1a;redis-server.exe redis.windows.conf 以管理员身份打开另一cmd窗口&#xff0c;跳转到安装redis的目录 运行&#xff1a;redis-…

Java 大视界——Java 大数据在智慧交通智能停车诱导系统中的数据融合与实时更新

面对城市停车资源错配导致的30%以上交通拥堵问题&#xff0c;本文以某新一线城市智慧交通项目为蓝本&#xff0c;深度解析Java大数据技术如何实现多源停车数据融合、动态路径规划与诱导策略优化。通过构建“感知-计算-决策”全链路系统&#xff0c;实现车位状态更新延迟<200…

牛客周赛 Round 92(再现京津冀蓝桥杯???)

1. 小红的签到题 现在小红希望你写出一个长度为 nnn 的、使用了下划线命名法命名的变量。为了显出特征&#xff0c;请保证该变量至少由两个单词组成。 输入描述: 输入一个正整数 n(3≦n≦100)&#xff0c;代表需要构造的变量长度。 输出描述: 输出一个长度为 n 的字符串&#x…

2025-05-11 Unity 网络基础11——UnityWebRequest

文章目录 1 UnityWebRequest 介绍2 搭建 HTTP 服务器3 常用操作3.1下载资源3.1.1 下载文本3.1.2 下载图片3.1.3 下载 AB 包 3.2 上传资源3.2.1 上传数据类3.2.2 POST 上传3.3.3 PUT 上传 4 自定义操作4.1 下载资源4.1.1 Unity 内置 Handler4.1.2 自定义 Handler 4.2 上传资源4.…

GitHub 趋势日报 (2025年05月09日)

本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1voideditor/void⭐ 1879⭐ 15214TypeScript2ruanyf/weekly科技爱好者周刊&…

.NET MAUI 基础知识

文章目录 什么是 .NET MAUI&#xff1f;MAUI的核心特点与Xamarin.Forms的区别 开发环境搭建安装Visual Studio 2022安装必要组件配置Android开发环境配置iOS开发环境验证安装 创建第一个MAUI应用创建新项目MAUI项目结构解析理解关键文件运行应用程序简单修改示例使用热重载 MAU…

卷积神经网络全连接层详解:特征汇总、FCN替代与性能影响分析

【内容摘要】 本文聚焦卷积神经网络&#xff08;CNN&#xff09;的全连接层&#xff0c;详细介绍其将二维特征图转化为一维向量的过程&#xff0c;阐述全卷积网络&#xff08;FCN&#xff09;如何通过转置卷积替代全连接层以实现像素级分类&#xff0c;并分析全连接层对图像分类…

在C++中进行套接字编程时,主要使用以下头文件

目录 一.基本套接字头文件<sys/socket.h><netinet/in.h><arpa/inet.h><unistd.h><netdb.h> 二. 完整示例头文件包含三. 注意事项 在C中进行套接字编程时&#xff0c;主要使用以下头文件&#xff1a; 一.基本套接字头文件 <sys/socket.h>…

【Linux网络】HTTP

应用层协议 HTTP 前置知识 我们上网的所有行为都是在做IO&#xff0c;&#xff08;我的数据给别人&#xff0c;别人的数据给我&#xff09;图片。视频&#xff0c;音频&#xff0c;文本等等&#xff0c;都是资源答复前需要先确认我要的资源在哪台服务器上&#xff08;网络IP&…

JAVA异常体系

在 Java 里&#xff0c;异常体系是其错误处理机制的核心内容&#xff0c;它能够帮助开发者有效应对程序运行时出现的各种意外状况。 异常体系的基本架构 它主要包含两个重要分支&#xff1a; Error&#xff08;错误&#xff09;&#xff1a;这类异常是程序自身无法处理的严重…

vue 去掉右边table的下拉条与下面的白色边框并补充满

::v-deep table {width: 100% !important; } ::v-deep .el-table::after, .el-table::before {display: none !important; }/* 隐藏滚动条但保留滚动功能 */ ::v-deep .el-table__body-wrapper::-webkit-scrollbar {width: 0 !important;height: 0 !important; }::v-deep .el-t…

uniapp+vue3+uview来开发我们的项目

前言&#xff1a; 就像我们vue的web的框架element、iview等一样&#xff0c;我们的uni-app开发也有适合的他的框架&#xff0c;除了他本身的扩展组件以外&#xff0c;第三方好用的就是就是uview了。 实现效果&#xff1a; 官网信息&#xff1a; vue2版本&#xff1a;uview-ui …

数据仓库:企业数据管理的核心引擎

一、数据仓库的由来 数据仓库&#xff08;Data Warehouse, DW&#xff09;概念的诞生源于企业对数据价值的深度挖掘需求。在1980年代&#xff0c;随着OLTP&#xff08;联机事务处理&#xff09;系统在企业中的普及&#xff0c;传统关系型数据库在处理海量数据分析时显露出明显瓶…

YOLOv12模型部署(保姆级)

一、下载YOLOv12源码 1.通过网盘分享的文件&#xff1a;YOLOv12 链接: https://pan.baidu.com/s/12-DEbWx1Gu7dC-ehIIaKtQ 提取码: sgqy &#xff08;网盘下载&#xff09; 2.进入github克隆YOLOv12源码包 二、安装Anaconda/pycharm 点击获取官网链接(anaconda) 点击获取…