【在Unity游戲開發中Dictionary、List介紹】

在Unity游戲開發中,DictionaryList是最核心的兩種數據結構,它們各自有優勢和應用場景。以下是介紹:


🧠 數據結構本質對比

特性Dictionary<TKey, TValue>List
底層結構哈希表(Hash Table)動態數組(Dynamic Array)
查找效率O(1) 按鍵查找O(n) 遍歷查找
插入/刪除效率O(1) ~ O(n) (哈希沖突時)O(n) (需移位)
內存占用較高(存儲哈希桶和指針)較低(連續內存)
數據順序無序嚴格順序
核心優勢鍵值配對 + 高速查找順序訪問 + 隨機索引

各自擅長領域

**Dictionary **
// 典型案例:用ID快速定位游戲對象
Dictionary<int, Enemy> _enemyDict = new Dictionary<int, Enemy>();void SpawnEnemy(int id) {Enemy prefab = Resources.Load<Enemy>($"Enemies/{id}");Enemy enemy = Instantiate(prefab);_enemyDict.Add(id, enemy); // O(1)插入
}Enemy GetEnemy(int id) {return _enemyDict.TryGetValue(id, out Enemy e) ? e : null; // O(1)查找
}

適用場景:
? 通過唯一ID查找對象(玩家/敵人/NPC)
? 建立資源路徑與實例映射(如:“Weapons/Sword” → 預制體)
? 實時數據索引(成就ID → 完成狀態)
? 避免重復添加(用ContainsKey檢查存在性)

📜 **List **
// 典型案例:游戲對象批量處理
List<Bullet> _activeBullets = new List<Bullet>();void UpdateBullets() {for(int i = 0; i < _activeBullets.Count; ) {if(_activeBullets[i].IsExpired) {_activeBullets.RemoveAt(i); // 移除時需小心索引變化} else {_activeBullets[i++].Update();}}
}// 添加新子彈
void FireBullet() {Bullet b = _bulletPool.Get();_activeBullets.Add(b); // O(1)尾部添加
}

適用場景:
? 需要嚴格順序的數據(對話文本序列)
? 需高頻遍歷的集合(每幀更新所有子彈)
? 動態增減的集合(背包物品、技能冷卻隊列)
? 需要排序操作的場景(玩家積分排行榜)


經典組合應用

1. 背包系統(高性能實現)
Dictionary<int, ItemData> _itemDB; // 靜態數據表:ID->屬性
Dictionary<int, ItemInstance> _inventoryDict; // 庫存實例:ID->實例
List<ItemInstance> _inventoryList; // 顯示用有序列表void AddItem(int itemId, int count) {// 1. 從字典快速檢查存在性if(_inventoryDict.TryGetValue(itemId, out ItemInstance instance)) {instance.count += count; // 堆疊} else {// 2. 創建新實例ItemData data = _itemDB[itemId]; // 從靜態字典取數據instance = new ItemInstance(data, count);// 3. 同步雙結構_inventoryDict.Add(itemId, instance);_inventoryList.Add(instance); }// 4. 列表排序(List專長)_inventoryList.Sort(SortByRarity); 
}// 排序邏輯(List專屬操作)
int SortByRarity(ItemInstance a, ItemInstance b) {return b.data.rarity.CompareTo(a.data.rarity);
}
?? 2. 對象池系統(高效復用)
Dictionary<GameObject, List<GameObject>> _pool = new Dictionary<GameObject, List<GameObject>>();GameObject Spawn(GameObject prefab) {// 1. 字典查找對應對象池if(!_pool.TryGetValue(prefab, out List<GameObject> list)) {list = new List<GameObject>();_pool.Add(prefab, list);}// 2. 列表查找可用對象foreach(GameObject obj in list) {if(!obj.activeInHierarchy) return obj;}// 3. 列表無可用則創建新對象GameObject newObj = Instantiate(prefab);list.Add(newObj); // 加入Listreturn newObj;
}
🛡? 3. 技能管理系統
Dictionary<string, SkillData> _skillDB; // ID->技能配置
List<ActiveSkill> _activeSkills; // 激活中技能列表void CastSkill(string skillId) {// 1. 從字典讀取基礎數據(O(1))SkillData data = _skillDB[skillId];// 2. 創建技能實例ActiveSkill skill = new ActiveSkill(data);// 3. 加入List進行更新_activeSkills.Add(skill);
}void Update() {// 4. 遍歷List更新技能(順序重要!)for(int i=0; i<_activeSkills.Count; i++) {_activeSkills[i].Update();}
}

?? 避坑指南

  1. 字典遍歷陷阱

    // 錯誤!修改集合時不能遍歷
    foreach(var key in _dict.Keys) {if(condition) _dict.Remove(key); // 拋出InvalidOperationException
    }// 正確做法
    List<TKey> keysToRemove = new List<TKey>();
    foreach(var key in _dict.Keys) {if(condition) keysToRemove.Add(key);
    }
    foreach(var key in keysToRemove) {_dict.Remove(key);
    }
    
  2. 列表刪除優化

    // 正序刪除導致索引錯亂
    for(int i=0; i<list.Count; i++) {if(condition) list.RemoveAt(i--); // 需手動調整索引
    }// 倒序刪除更安全
    for(int i=list.Count-1; i>=0; i--) {if(condition) list.RemoveAt(i);
    }
    
  3. 空值防御

    // 字典安全訪問
    if(_dict.TryGetValue(key, out var value)) {// 安全操作value
    }// 列表邊界檢查
    if(index >= 0 && index < list.Count) {var item = list[index];
    }
    

如何選擇 請添加圖片描述

!:

  1. 頻繁查找 + 無序數據 → Dictionary
  2. 順序訪問/修改 → List
  3. 需要兩者特性 → Dictionary與List聯動

在Unity 2023+版本中,可考慮HashSet(無值字典)或LinkedList(高效增刪),但Dictionary+List組合仍是90%游戲系統的首選,尤其在需要高性能查詢和靈活排序的場景中。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/91098.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/91098.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/91098.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

windows平臺計劃任務批處理實現定時任務

無限循環加定時延時計劃任務用戶登錄執行一次下文中300代表300秒執行一次第2,3,4行為vbs隱藏窗口C:\me\corn\test.batecho off if "%1""hide" goto CmdBegin start mshta vbscript:createobject("wscript.shell").run("""%~0&quo…

深入理解 TCP 協議:從原理到實踐的技術解析

目錄 一、TCP 協議的核心定位與特性 1.1 協議棧中的位置 1.2 五大核心特性 二、TCP 連接建立與終止的底層邏輯 2.1 三次握手&#xff08;連接建立&#xff09; 2.2 四次揮手&#xff08;連接終止&#xff09; 三、TCP 可靠傳輸的核心機制 3.1 序列號與確認機制 3.2 滑…

JAVA后端開發——“全量同步”和“增量同步”

“全量同步”和“增量同步”是數據處理、系統集成和數據庫領域中兩個基本概念。描述了兩種截然不同的數據同步策略&#xff0c;理解它們的區別對于設計任何數據系統都至關重要。全量同步 核心思想&#xff1a;全部替換&#xff0c;一步到位。在技術上&#xff0c;全量同步通常意…

修改CentOS的SSH登錄端口(22端口)

要修改CentOS系統的SSH服務默認端口(22端口)&#xff0c;請按照以下步驟操作&#xff1a; 備份SSH配置文件 sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak編輯SSH配置文件 sudo vi /etc/ssh/sshd_config查找并修改端口設置 找到以下行(大約在第13行左右)&#xff1a;…

python導包機制-更優方式

在學習某個大模型應用的后端時&#xff0c;發現&#xff1a; xxx |-----src |------\---modules |------\------\------b.py |-----app.py在app.py中可以使用src.modules.b來進行導入。之前我導入時是形如.modules.b這種形式&#xff08;前面有.&#xff09;&#xff0c;但是當…

檢索召回率優化探究一:基于 LangChain 0.3集成 Milvus 2.5向量數據庫構建的智能問答系統

背景 基于 LangChain 0.3集成 Milvus 2.5向量數據庫構建的 NFRA&#xff08;National Financial Regulatory Administration&#xff0c;國家金融監督管理總局&#xff09;政策法規智能問答系統&#xff0c;第一個版本的檢索召回率是 79.52%&#xff0c;尚未達到良好、甚至是優…

《整合Spring Cache:本地緩存、Redis與Caffeine對比實踐》

&#x1f680; 整合Spring Cache&#xff1a;本地緩存、Redis與Caffeine對比實踐 &#x1f4cc; 前言 在高并發、高性能的系統設計中&#xff0c;緩存始終扮演著不可替代的角色。Spring Cache 作為 Spring 框架原生提供的緩存抽象層&#xff0c;極大簡化了緩存接入的復雜度。…

easyexcel填充方式導出-合并單元格并設置邊框

填充的模板最后導出效果實體 /*** 賬戶實體類* author test* date 2025-07-28*/ Getter Setter class Test {/*** 賬戶類型*/private String accType;/*** 賬戶余額*/private String money; }導出邏輯 /*** 導出文件邏輯*/ public void exportReport(List<Test> data) { …

Jenkins + SonarQube 從原理到實戰一:基于 K8s 部署與使用(含中文插件與 Python 掃描)

前言 公司開發部門希望在 Jenkins 構建過程中自動集成 C/C 的代碼掃描&#xff0c;正好我也沒接觸過 SonarQube&#xff0c;于是記錄下從零開始部署 SonarQube 服務并集成到 CI/CD 的過程&#xff0c;供后來者參考。 一、SonarQube 原理與工作機制詳解 1.1 什么是 SonarQube&…

Linux(Centos 7.6)命令詳解:sz

1.命令作用使用ZMODEM/YMODEM/XMODEM協議發送文件(Send file(s) with ZMODEM/YMODEM/XMODEM protocol)注意: 需要yum install lrzsz (yum provides sz可以查看rz命令是什么rpm包提供的)2.命令語法Usage: sz [options] file ...or: sz [options] -{c|i} COMMAND3.參數詳解OPTION…

智能運維中的數據轉換

《智能運維實踐 蘇娜 孫琳 王鴿著 人工智能技術叢書 自然語言處理的常用算法 日志異常檢測 根因定位 網絡流量異常檢測 清華大學出版社》【摘要 書評 試讀】- 京東圖書 數據轉換是數據預處理中的關鍵步驟&#xff0c;用于將數據從原始格式轉換為適合分析和建模的形式。這一過程…

IAR編輯器如何讓左側的工具欄顯示出來?

在IAR編輯器中恢復左側工具欄顯示&#xff0c;可通過以下方法操作&#xff1a; 一、通過菜單欄啟用工具欄 ?進入視圖菜單? 點擊頂部菜單欄的 ?"View"? → 在彈出列表中勾選 ?"Workspace"? 若工具欄仍不顯示&#xff0c;查看菜單欄右側是否有 ?"…

ADB+Python控制(有線/無線) Scrcpy+按鍵映射(推薦)

要實現電腦通過鍵盤控制安卓平板屏幕點擊的功能&#xff0c;可以采用以下方案&#xff1a; 方案一&#xff1a;ADBPython控制&#xff08;有線/無線&#xff09; 準備工具&#xff1a; 安卓平板開啟開發者模式&#xff08;設置→關于平板→連續點擊版本號&#xff09;啟用USB調…

同態濾波算法詳解:基于頻域變換的光照不均勻校正

&#x1f3ad; 同態濾波&#xff1a;圖像頻域的調音師技術“如同調音師在音頻處理中分離并調節不同頻率成分&#xff0c;同態濾波能夠在圖像頻域中精確分離光照與細節信息。”&#x1f3af; 圖像頻域調音的技術挑戰 在數字圖像處理中&#xff0c;光照不均勻問題如同音頻中的混響…

Ubuntu簡述及部署系統

1.什么是Ubuntu1.1概述Ubuntu屬于Debian系列&#xff0c;Debian是社區類Linux的典范&#xff0c;是迄今為止最遵循GNU規范的Linux系統。Debain最早由lan Murdock于1993年創建&#xff0c;分為三個版本分支&#xff08;branch&#xff09;&#xff1a;stable&#xff0c;testing…

Claude Code安裝部署

1??安裝 Node.js&#xff08;已安裝可跳過&#xff09; 確保 Node.js 版本 ≥ 18.0 # Ubuntu / Debian 用戶 curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo bash - sudo apt-get install -y nodejs node --version# macOS 用戶 sudo xcode-select --install /b…

MATLAB近紅外光譜分析技術及實踐技術應用

專題一、MATLAB編程基礎與進階&#xff08;一&#xff09;1、MATLAB 安裝、版本歷史與編程環境2、MATLAB 基礎操作&#xff08;矩陣操作、邏輯與流程控制、函數與腳本文件&#xff09;3、MATLAB文件讀寫&#xff08;mat、txt、xls、csv、jpg、wav、avi等格式&#xff09;專題二…

SQLFluff

一、SQLFluff 是什么&#xff1f; SQLFluff 是一個??開源的 SQL 代碼質量工具??&#xff0c;專注于通過自動化方式提升 SQL 代碼的可讀性、一致性和規范性。其核心功能包括&#xff1a; ??代碼格式化??&#xff1a;自動調整縮進、空格、換行等格式問題&#xff0c;支…

盲盒抽卡機小程序系統開發:連接線上線下娛樂新橋梁

在互聯網技術的推動下&#xff0c;線上線下融合已經成為娛樂行業發展的必然趨勢。盲盒抽卡機&#xff0c;這一原本在線下備受歡迎的娛樂項目&#xff0c;通過小程序系統的開發&#xff0c;成功實現了線上線下的無縫對接&#xff0c;成為連接線上線下娛樂的新橋梁。盲盒抽卡機小…

【SSL證書校驗問題】通過 monkey-patch 關掉 SSL 證書校驗

標簽&#xff1a;Python、SSL、monkey-patch、httpx、aiohttp、requests、OpenAI 1 為什么會有這篇文章&#xff1f; 在本地調試 OpenAI 代理、數據抓取、私有服務、訪問外網 時&#xff0c;經常會碰到如下報錯&#xff1a; SSLCertVerificationError: [SSL: CERTIFICATE_VER…