一 什么是 ”数据结构”?

你可以把它理解成: 存放数据的 “容器”
就像:
  • 书包 = 放分舵东西
  • 抽屉 = 按格子放
  • 书架 = 按编号取
在 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
  • 按需求选结构, 代码会更清晰\更快\更稳定