Skip to content

触发器数组完全指南:从入门到精通

什么是触发器数组

本节将介绍触发器数组的基础概念,帮助你理解为什么在制作地图时需要使用数组。完成学习后,你将掌握数组的定义、作用以及索引的工作原理。

操作步骤

  1. 打开变量管理器 — 在触发器编辑器顶部菜单栏点击"变量"按钮(显示为"变量(V)")[^2]
  2. 创建新变量 — 点击变量窗口左下角的"新建变量"按钮(绿色加号图标)
  3. 设置数组变量 — 在弹出的变量属性窗口中,勾选"数组"复选框(重要!这是区分普通变量和数组变量的关键步骤)[^1]
  4. 命名变量 — 给数组起一个有意义的名字,比如"单位生命值"或"玩家金币"

数组的定义与作用

数组是什么?想象一个巨大的储物柜,上面整齐排列着许多带编号的小格子。普通变量就像一个只能放一样东西的盒子,而数组就像这个储物柜,可以同时存放多份相关的数据,每个格子都有自己专属的编号[^1]。

为什么要用数组?举个例子:假设你要追踪战场上10个单位的生命值。如果用普通变量,你需要创建"血量1"、"血量2"、"血量3"...一直到"血量10",这太麻烦了!而使用数组,只需创建一个叫"单位生命值"的数组,就能通过"单位生命值[1]"、"单位生命值[2]"来访问每个单位的数据[^2]。

为什么使用数组而非变量

对比项普通变量数组变量
存储数量只能存1个可以存8192个
命名方式每个数据都要单独命名一个名字+不同编号
代码效率难以批量处理配合循环可以批量操作

数组的最大优势在于代码更简洁、修改更容易。当你需要调整逻辑时,只需要改一个地方,而不是找遍所有变量[^1]。

⚠️ 常见错误:新手经常忘记勾选"数组"选项,导致创建的其实是普通变量。检查方法是看变量列表中该变量后面是否显示"数组"字样。

数组的索引(Index)概念

索引(Index) 就是数组中每个格子对应的编号,用来定位你想访问的数据。关键点来了——索引从0开始计数,不是从1!这和日常生活中的编号习惯不同,很多新手会搞混[^2]。

  • 生命值[0] → 第1个格子的数据
  • 生命值[1] → 第2个格子的数据
  • 生命值[2] → 第3个格子的数据
  • 以此类推...

在WE中,数组默认支持8192个索引位(0到8191),这个数量对于任何地图都绑绑有余了[^1]。

💡 新手提示:索引从0开始是编程世界的标准约定,记住这个规则能避免很多后续的困惑!

小结

通过本节,你应该已经理解:

  • 数组是一个带编号的变量集合,能存储多个相关数据
  • 索引从0开始,用方括号[]指定位置

创建和声明数组变量

本节将学习如何在World Editor中创建数组变量,理解全局与局部数组的区别,并掌握设置数组大小的方法。学完本节后,你将能够为自己的地图创建和管理数组变量,为后续的循环和数据存储打下基础。

在变量编辑器中创建数组

  1. 打开变量编辑器 — 在World Editor工具栏中,点击"触发器编辑器"按钮[^1](看起来像一个闪电符号),然后在顶部菜单选择"编辑"→"新建变量"(快捷键Ctrl+B)[^2]。

  2. 输入变量名称 — 在弹出的"新建变量"对话框中,在"变量名称"输入框内键入你想要的变量名,比如"玩家金币"或"怪物计数"[^2]。变量名应该清晰表达用途,方便以后阅读触发器代码。

  3. 勾选"数组"选项 — 找到"数组"复选框并勾选它。这一步非常关键!不勾选的话,你创建的只是普通变量,不是数组[^1]。

  4. 设置数组大小 — 在同一对话框中,找到"数组大小"选项,默认值是1[^1]。将数组大小设置为更大的数字,比如10、20或100。数组大小决定了你能存储多少个不同的值——想象一个有编号抽屉的柜子,每个编号就是一个"数组索引"。

  5. 选择变量类型 — 从下拉菜单中选择变量的数据类型,常见选项包括"整数"(用于计数)、"实数"(用于小数)、"单位"(用于存储游戏中的单位)、"字符串"(用于文本)等[^2]。

  6. 确认创建 — 点击"确定"按钮完成变量创建。你可以在变量列表中看到新创建的数组变量,旁边会有"数组"标记和数组大小[^1]。

全局数组与局部数组的区别

  • 全局数组:在变量编辑器的"全局变量"区域创建的数组,可以在地图的所有触发器中使用[^2]。适合存储需要跨触发器共享的数据,比如所有玩家的金币数量。

  • 局部数组:在触发器编辑器内部定义的数组,只在当前触发器执行时有效[^2]。局部数组在"触发器"→"新建触发器"→在触发器动作区域右键选择"新建局部变量"来创建。适合存储临时计算结果。

💡 新手提示:作为初学者,建议先使用全局数组,因为它们更容易理解和管理。只有当你确定某个数据只需要在一个触发器内部使用时,才考虑使用局部数组。

⚠️ 常见错误:很多新手把数组大小设为1后,尝试使用"玩家金币[1]"、"玩家金币[2]"来存储数据,结果发现值总是覆盖同一个位置。正确的做法是:如果你需要存储5个玩家的数据,数组大小应该设为5,这样可以使用索引0到4(或者设为6,使用索引1到5)。

小结

完成以上步骤后,你已经成功创建了一个数组变量。在后续的触发器中,你可以通过"设置变量"动作来向数组中写入数据,通过数组名加方括号内的数字(索引)来指定存储位置。例如:设置 玩家金币[1] = 100 表示将第一个玩家的金币设置为100。

数组的基本操作

数组的基本操作主要分三种:赋值(Set)、读取(Get)和增减操作。学会这些后,你就能在触发器中灵活使用数组存储和管理多个数据了。

操作步骤

  1. 第一步:创建数组变量 — 在变量编辑器中新建变量时,记得把"数组"选项勾选上,并设置数组大小(例如32或64)[^1]。这样这个变量就变成了可以存放多个值的"抽屉柜"。

  2. 第二步:赋值——向数组中存入数据 — 在触发器中使用"Set"命令,选择你创建的数组变量,指定索引位置(用整数表示第几个抽屉),然后设置要存储的值[^2]。比如把"玩家1的金币"存入数组[1],把"玩家2的金币"存入数组[2]。

  3. 第三步:读取——取出数组中的数据 — 要使用数组中的值时,直接在需要的地方输入"变量名[索引]"即可调用对应位置的数据。触发器会自动去指定的抽屉里取东西。

  4. 第四步:增加和减少数组值 — 对于数值类型的数组,可以使用"Set"命令配合数学运算。设置值为"变量名[索引] + 10"就相当于增加,"变量名[索引] - 5"就相当于减少[^2]。

💡 新手提示:索引从0开始!第一个位置是[0],第二个是[1],很多新手搞混了。如果你想存5个玩家的数据,索引应该是0到4,不是1到5。

⚠️ 常见错误:新手经常忘记给数组变量勾选"数组"选项就尝试使用索引,结果触发器报错。一定要在创建变量时检查是否正确设置了数组!

小结

完成以上步骤后,你应该能创建数组变量、往里存入数据、读取数据,以及对数值进行增减操作。数组是后面学习循环的基础,一定要多练习!

循环遍历数组

本节教你如何用循环(Loop)来自动访问数组中的每一个元素,而不是一个个手动写代码。学完后,你能实现"对100个单位同时做某事"这样的功能。

For循环基础用法

  1. 第一步:打开触发器编辑器 — 在World Editor中按F4打开触发器编辑器[^1]
  2. 第二步:创建新触发器 — 右键触发器列表 → 新建触发器 → 命名为"遍历数组"[^2]
  3. 第三步:添加事件 — 点击"事件"区域,选择地图初始化事件(Map Initialization)[^1]
  4. 第四步:添加循环 — 在"动作"中点击"新建动作" → 搜索"For each each integer"并添加[^1][^2]
  5. 第五步:设置循环范围 — 将循环变量的起始值设为0,终止值设为你的数组最大索引数[^2]
  6. 第六步:在循环内操作 — 把"设置变量值"或"显示消息"等动作拖入循环体内,使用数组变量[循环变量索引]来访问对应元素[^1]

💡 新手提示:循环变量名建议改成"i"或"index",这样代码更易读。设置方法:双击循环变量区域 → 新建局部整数变量

⚠️ 常见错误:忘记把动作拖入循环体内,导致只执行一次而非对所有元素执行。检查方法:动作前面应该有"为每个整数于0到X执行"这个缩进的父动作[^1]

结合For each integer循环

"Foreach integer"是遍历数组的最佳拍档。它的工作原理是:让一个整数从0开始,每次加1,一直加到你设定的最大值为止,每次循环都会自动执行一遍循环体内的代码[^1][^2]。

比如你有10个单位存放在UnitArray数组里,想给每个单位发送消息:

为每个整数 i 从 0 到 9 执行
    - 显示 "单位 [i]: (UnitArray[i]) 已就绪" 给玩家

这样你只需写一次显示动作,系统就会自动执行10次,每次i的值分别是0、1、2...9[^1]。

遍历所有数组元素的技巧

  1. 用变量记录实际数量 — 不要写死数字,先用一个整数变量记录"当前有多少个有效数据",循环就遍历到这个数为止[^2]
  2. 用0值作为"空"的判断 — 如果数组存的是整数,可以用0表示"没有数据",循环内加个条件判断跳过它
  3. 临时变量缓存 — 循环内先把Array[i]的值赋给一个临时变量再使用,避免重复读取数组造成混乱[^1]

💡 新手提示:数组索引从0开始,不是从1!UnitArray[0]是第一个元素,UnitArray[1]是第二个,这点非常重要

小结

完成以上步骤后,你应该能够:

  • ✅ 创建For each integer循环结构
  • ✅ 用循环变量作为索引访问数组元素
  • ✅ 对数组中的所有数据进行批量操作

你现在可以尝试创建一个简单的测试触发器:准备一个整数数组,循环给每个元素赋值,观察运行结果来验证是否理解正确。

数组的实用案例

本节我们将学习数组在真实游戏中的三种经典用法。学会这些之后,你就能用数组来管理大量单位、追踪玩家数据、实现技能冷却效果——这些都是RPG地图中最常见的功能!

存储多个单位信息

假设你要做一个"召唤怪物"系统,玩家每次召唤一只怪物,你需要追踪最近召唤的10只怪物,以便之后可以消灭它们。

  1. 创建数组变量 — 在触发器编辑器的变量列表中,点击"新建变量",变量名填写 召唤单位,变量类型选择"单位",务必勾选"数组"选项并将数组大小设为10[^1]

  2. 设置数组元素 — 创建一个"单位死亡"事件触发器,条件设为"死亡单位持有者是触发玩家"。在动作中,使用"设置变量",目标召唤单位[触发玩家持有者编号]为"死亡单位"

  3. 读取数组数据 — 创建一个计时器周期触发器,遍历所有数组元素,检查每只召唤单位是否存在,如果存在则执行某些操作(如移动、攻击等)

💡 新手提示:数组索引从0开始,不是从1开始。所以召唤单位[0]是第一个元素,召唤单位[9]是第十个元素。这点非常重要,很多新手都搞错过!

⚠️ 常见错误:忘记勾选"数组"选项就创建变量。这样创建出来的不是数组,而是一个普通变量,只能存一个值。检查方法很简单——看变量列表中该变量后面有没有带"数组"标签[^2]

玩家数据管理

在RPG地图中,每个玩家都需要独立的数据——金币、等级、杀敌数等。数组让你能轻松管理所有玩家的独立数据。

  1. 规划数据结构 — 确定你需要追踪哪些玩家数据,比如:玩家金币玩家等级玩家杀敌数。每个数据都需要创建一个带数组的变量

  2. 初始化玩家数据 — 创建一个"游戏开始"触发器,添加"为每个整数A从0到11"循环动作(支持最多12名玩家),在循环内设置玩家金币[整数A] = 0玩家等级[整数A] = 1

  3. 读取和修改数据 — 当玩家执行操作时(如捡钱),使用玩家金币[触发玩家持有者编号]来获取该玩家的金币值,然后进行加减运算

💡 新手提示:玩家编号从0到11(共12个位置),对应玩家1到玩家12。在触发器中获取当前玩家时,使用"触发玩家持有者"这个内置值,它返回的就是0-11的数字,可以直接作为数组索引使用[^1]

技能冷却系统

技能冷却是让技能不能连续无限使用的机制。你可以用数组记录每个技能何时可以使用。

  1. 创建冷却数组 — 创建两个数组变量:技能冷却时间(实数型)和技能上次使用时间(实数型),数组大小设为10(假设有10个技能)

  2. 检查冷却状态 — 在技能触发器中,添加条件检查:技能冷却时间[技能索引] ≤ 游戏时间。其中"游戏时间"是一个内置变量,记录游戏开始以来的秒数

  3. 设置冷却 — 当玩家成功释放技能后,使用"设置变量"将技能上次使用时间[技能索引] = 游戏时间,然后计算技能冷却时间[技能索引] = 游戏时间 + 冷却秒数

  4. 计算剩余冷却 — 如果需要显示冷却倒计时,可以用"技能上次使用时间 + 冷却秒数 - 游戏时间"来计算剩余秒数

⚠️ 常见错误:忘记更新技能上次使用时间。如果只在释放技能时设置冷却时间,但玩家失败使用技能时(比如魔法值不足)也设置了冷却,就会导致玩家不满。正确的做法是只在技能真正成功释放后才设置冷却时间[^2]

小结

完成以上三种案例的学习后,你应该已经掌握了数组的核心应用场景:

  • 用数组索引来区分不同单位或玩家
  • 用数组配合循环来处理批量数据
  • 用"游戏时间"来计算冷却等时间相关数据

建议先从"玩家数据管理"开始练习,因为逻辑最简单。等熟悉之后,再挑战"技能冷却系统"这样的综合案例。动手试试吧!

常见错误与调试方法

在本节中,我们将学习使用触发器数组时最常见的错误,以及如何使用"显示文本"功能来调试这些问题。学完本节后,你将能够自己找出并修复数组相关的Bug。

数组越界问题

数组越界是指你访问的索引超出了数组的有效范围。 Warcraft III 的数组索引从 0 开始,最大为 8191[^1]。如果你的循环变量 i 变成负数或超过 8191,就会出现问题。

  1. 创建测试触发器 — 在触发器编辑器中,右键点击"新建触发器"[^2]
  2. 添加"显示文本"动作 — 在触发器动作中搜索"显示文本到聊天框",拖入动作区域
  3. 连接字符串和变量 — 在显示文本中点击"点击添加代码",选择你的数组变量(如 UnitArray[i]
  4. 故意设置错误索引 — 比如设置一个会超过 8191 的循环条件来测试

⚠️ 常见错误:很多新手以为数组可以从 1 开始计数。实际上 WC3 数组从 0 开始,所以 UnitArray[0] 是有效的第一个位置,UnitArray[1] 是第二个。如果你的循环从 1 开始但从未访问 UnitArray[0],你就浪费了数组的第一个位置!

💡 新手提示:使用 Modulo(取模)运算可以确保索引永远不会越界。例如 UnitArray[ModuloInteger(i, 8192)] 会把任何数字限制在 0-8191 之间。

数组未初始化的后果

使用一个没有被赋值过的数组元素,会读取到默认值(通常为 0 或空)。这可能导致单位创建在坐标 (0,0),或者物品凭空消失[^1]。

  1. 创建布尔数组测试 — 新建一个布尔类型的变量 HasUpgraded,记得勾选"数组"选项
  2. 新建触发器测试未初始化 — 添加显示文本,显示 HasUpgraded[1] 的值
  3. 运行地图观察 — 你会看到显示为 false,因为从未设置为 true

⚠️ 常见错误:新手经常忘记在第一次使用数组元素前设置初始值。解决方法是:在使用数组前,先用"设置变量"动作明确赋值,即使你想设置的是 false,也要写出来表明你是故意的。

使用Display text调试数组

当你不知道数组里装了什么值时,"显示文本"是最简单有效的调试工具[^3]。

  1. 在关键位置插入显示文本 — 在循环内部、条件判断前后都加上,显示当前索引 i 和数组值
  2. 使用整数字符串转换 — 显示文本的动作中,选择"整数转为字符串",然后连接你的数组索引和值
  3. 按顺序观察输出 — 运行地图时,聊天框会按执行顺序显示每一轮循环的值
  4. 对比预期与实际 — 如果显示的值和你想象的不一样,说明某处逻辑有问题

💡 新手提示:调试完成后,记得把调试用的"显示文本"动作删除,或者把它们放到一个可以关闭的触发器组里,避免在正式游戏中干扰玩家。

小结

完成以上步骤后,你应该能够使用"显示文本"功能来追踪数组的实际值,识别越界访问和未初始化使用的问题。记住:调试时多显示几个值,比盲目猜测要高效得多!每次修改触发器后都重新测试一遍,确保你的数组索引始终在有效范围内(0 到 8191)。

参考来源

[^1]: [Trigger] - Loops and Arrays tutorial - Hive Workshop — accessed 2026-05-21 [^2]: Triggers - Variables and Arrays - World Editor Tutorials — accessed 2026-05-21 [^3]: Warcraft 3 World Editor - Beginner guide! - YouTube — accessed 2026-05-21

内容由多智能体 AI 系统自动生成,仅供学习参考