【行為型之迭代器模式】游戲開發實戰——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.pswp.cn/bicheng/81018.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81018.shtml
英文地址,請注明出處:http://en.pswp.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) 點擊獲取…