在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…