一 什么是 ”数据结构”?
你可以把它理解成: 存放数据的 “容器”
就像:
- 书包 = 放分舵东西
- 抽屉 = 按格子放
- 书架 = 按编号取
在 Unity/C#里, 数据结构 = 管理一堆数据的方式
二 Unity 最常用7大数据结构
1) 数组 Array(最基础)
特点:
- 固定长度, 创建后不能更改大小
- 按索引读取, 速度极快
- 最简单, 最省性能
用途:
存放数量固定的数据, 比如:
- 3个技能图标
- 5个敌人出生点
示例:
2) List<T>(最常用)
特点:
- 长度可变, 随时增删
- 按索引访问, 速度快
- Unity开发使用率第一
用途:
敌人列表\物品栏\任务列表\动态生成的单位…
示例:
3) Dictionary<K, V>(键值对, 超快查询)
特点:
- 用 key(键) 找 value(值)
- 查找速度极快(O(1))
- 无序
用途:
- 玩家背包(物品 ID → 物品数据)
- 配置表读取(ID → 信息)
- 技能系统(技能ID → 技能对象)
示例:
4) HashSet<T>(去重专用)
特点:
- 不允许重复
- 不能按索引访问
- 查找\去重极快
用途:
- 记录已解锁的成就
- 记录触碰过的触发器
- 防止重复添加
示例:
5) Queue\Stack(队列\栈)
Queue 队列: 先进先出(排队)
- 任务队列\消息队列\技能冷却队列
Stack 栈: 先进后出(叠盘子)
- 撤销操作\菜单返回\状态回溯
示例:
6) 链表 LinkedList(插入/删除更方便)
你可以把它理解成: 一串用“指针/引用”串起来的节点
就像:
- 火车车厢 = 每节车厢知道下一节在哪
- 寻宝任务 = 每个线索指向下一个线索
在 Unity/C# 里, 链表 = 更适合频繁插入/删除的结构(但随机访问很慢)
特点:
- 不是连续内存, 节点一节一节串起来
- 插入/删除某个节点很快(O(1) ~ O(n), 取决于你是否已经拿到节点位置)
- 按索引访问很慢(需要从头一个个走过去, O(n))
用途:
- UI 列表里频繁插入/删除(比如聊天消息流, 但一般仍会用 List + pooling)
- 需要“在中间插入”且不想整体搬移的数据
- 做一些队列/双端队列结构的底层实现
示例:
补充:
- C# 自带的
LinkedList<T>是双向链表(每个节点既有 next 也有 prev)
7) 树 Tree(层级结构必备)
你可以把它理解成: 一套“父子关系”的结构
就像:
- 公司组织架构 = 老板 → 主管 → 员工
- 文件夹目录 = 文件夹 → 子文件夹 → 文件
在 Unity/C# 里, 树 = 处理层级/分类/递归问题的最常用结构
特点:
- 每个节点可以有多个子节点
- 非常适合表达“层级”和“包含关系”
- 常用遍历: 深度优先 DFS / 广度优先 BFS
用途(Unity 场景特别多):
- Transform 层级(本质就是一棵树)
- UI 节点树(UGUI/UIToolkit 都是层级结构)
- 行为树(Behavior Tree) 用于 AI
- 技能树/科技树/天赋树
示例(用最朴素的节点类演示):
三 Unity 特殊结构
这些不是C#原生, 是Unity自己的, 非常重要:
1) Vector2\Vector3(坐标\方向)
游戏里最常用!
- 位置\移动\方向\距离
2) Rect\Rectlnt(矩形区域)
UI\图片\碰撞区域
3) Color\Color32
颜色数据
4) LayerMask
层过滤, 谁先按检测必备
四 最简单的选择指南(直接照抄)
需求 | 选什么 |
长度固定 | 数组 |
动态增删列表 | List |
按 ID 快速查找 | Dictionary |
去重 | HashSet |
排队 | Queue |
撤销 / 返回 | Stack |
五 一句话总结
- List = 万能列表
- Dictionary = 高速查找
- Array = 故能数据
- HashSet = 去重
- Queue\Stack = 顺序存取
Unity 开发90%的情况只用: List + Dictionary
总结
- 数据结构 = 存放数据的容器
- Unity 必学: 数组\List\Dictionary\HashSet\Queue\Stack\LinkedList\树
- 日常开发主力: List + Dictionary
- 按需求选结构, 代码会更清晰\更快\更稳定