这篇不是教程,我也不会做 Mod。只是记录从零开始接触这套工具时的真实体验。


为什么是 DOTA2?

最近在网上冲浪看见一个LOL屎山代码的段子,说LOL的回血技能是在身旁隐形的召唤一个奶妈英雄,虽然也没有LOL源码可以验证这个段子,而我也觉得这大概率是假的,否则游戏负载要高出天际了。不过,可以肯定的是DOTA2 的代码一定不是这样。

DOTA2 的 Mod 生态有一套完整的官方支持——Steam Workshop Tools,包含了从关卡编辑器到 Lua 脚本引擎的所有东西。而且和那些纯粹依赖社区破解逆向的 Mod 不同,Valve 主动把工具交到了玩家手里。

更重要的是,DOTA2 的 Mod 编辑器是一个很自由的工具。自定义地图、自定义英雄、自定义技能机制、自定义 UI。你完全可以做一个基于 DOTA2 引擎的独立作品。

著名的例子:自走棋(Auto Chess)。一个 DOTA2 Mod 在 2019 年横空出世,直接催生了一个游戏品类。这证明了这套工具有足够的能力承载全新的设计。

Dota 2 官方宣传图


安装与首次启动

获取工具

不需要单独下载——Steam 库中找到 Dota 2,右键 → 属性 → DLC,勾选 Dota 2 Workshop Tools。等待下载(大约 2-3 GB)。

首次启动

启动后会看到一个简洁的启动器界面。左侧是功能列表:

  • Hammer Editor:关卡编辑器,也叫 World Editor
  • Asset Browser:资源浏览器,管理模型、贴图、音效等
  • Model Editor:模型查看和编辑
  • Particle Editor:粒子特效编辑器
  • Material Editor:材质编辑器
  • Launch Custom Game:直接启动自定义游戏测试

对于初次接触的人来说,这个面板已经足够说明问题:Valve 给的不是一个简单的”做地图”工具,而是一整套开发环境。


核心工具速览

Hammer Editor(关卡编辑器)

这是整个工具链的核心。

打开后的第一印象:界面让人梦回 2004 年。灰扑扑的窗格、分不清主次的工具条、字体大小让你怀疑是不是在用 CRT 显示器。新手打开后大概率会愣住十秒钟,然后开始找”新建项目”按钮在哪里。

但实际上手之后会发现,它虽然丑,但功能是齐全的。地形编辑、实体放置、光照烘焙、触发区域——该有的都有。只是学习路径陡峭到不讲道理。

Asset Browser(资源浏览器)

管理所有游戏资产的地方。DOTA2 本体的大量模型、粒子、音效都在这里,可以直接拖进你的 Mod 使用。对于独立开发者来说,这意味着你不用自己建模就能快速搭出原型。

当然,如果你用 DOTA2 原版屠夫做了一个 Hello Kitty 主题的恋爱模拟游戏,美术风格会有点微妙。

Lua 脚本引擎

DOTA2 Mod 的逻辑层是 Lua。Valve 提供了一个基于 Lua 的 API 系统,用于定义游戏规则、技能效果、UI 行为等。

对会写代码的人来说,这是一个巨大的缓和。至少你不用在 Hammer 的图形界面里用节点编辑器拼逻辑——那才是真正的噩梦。

Lua 脚本分为两类:

  • 服务端脚本:运行在服务器上,控制核心游戏逻辑
  • 客户端脚本:运行在玩家本地,处理 UI 和表现

第一个 Mod:Hello World

按照社区惯例,任何新工具的第一个项目都是”做一个能跑的东西”。

创建项目

在 Workshop Tools 启动器中,选择 Create Empty Addon。你需要填写:

  • 一个唯一的名称(会作为 Mod 的内部标识)
  • 一个显示名称(玩家在游戏里看到的标题)

创建后,工具会生成一个基础的目录结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
dota 2 beta/
├── content/
│ └── dota_addons/
│ └── your_mod_name/
│ ├── maps/
│ ├── materials/
│ ├── models/
│ ├── particles/
│ └── sounds/
└── game/
└── dota_addons/
└── your_mod_name/
├── scripts/
│ └── vscripts/
│ └── addon_game_mode.lua
└── maps/

关键文件是 addon_game_mode.lua——这是你 Mod 的入口脚本。打开它,你会看到一段模板代码。

让它跑起来

最基础的 addon_game_mode.lua 只需要几行:

1
2
3
4
5
6
7
8
9
10
11
12
function Precache(context)
-- 在这里预加载资源
end

function Activate()
GameRules:GetGameModeEntity():SetThink("OnThink", self, "GlobalThink", 2)
end

function OnThink()
-- 每2秒执行一次的主循环
return 2
end

然后在 Workshop Tools 中选择 Launch Custom Game,选你的 Mod,启动。

会进入一个空荡荡的 DOTA2 场景。

第一个 Mod 就跑起来了。


初学者的真实痛点

上面那段写得很流畅,是因为我把所有踩过的坑都省略了。实际上,从零到”跑起来一个空场景”,我经历了:

1. 文档的海洋和孤岛

Valve 提供了一份官方 Wiki,涵盖了大量 API 文档。但是这只是一份参考手册,不是教程

社区教程(比如 ModDota)质量参差不齐。有些写于古早年代,引用的 API 已经被移除或重命名。有时会发现照着一篇教程敲了半小时代码,运行时报错 attempt to call a nil value,然后发现这个函数在 2018 年就被 Deprecated 了。

这里提供一个可以交流的论坛 Dota2 mod discord 里面有可以找到一些有价值的帖子,来解决问题,而且通常比较新。

2. Hammer 的复古体验

前面说了 Hammer 很丑。而且操作逻辑也不像现代游戏引擎(Unity,UE),适应需要一段时间

3. Lua API

DOTA2 的 Lua API 有大量命名和使用习惯上的不一致。函数返回很多时候不知道是什么,有时返回 nil。 但是文档也没写清楚。你会在运行时频繁遇到神秘的空指针错误,然后花半小时意识到”这个 API 在你调用 Activate 之前是无效的”。

Lua 里的错误处理非常弱。一个未捕获的异常不会像其它引擎那样给出红色报错,它可能只是让你的游戏逻辑静默停止。要自己学会用 printDeepPrintTable 来调试。

4. 测试工作流

每次改了脚本都要:

  1. 退出当前游戏
  2. 在 Workshop Tools 中重新启动
  3. 等待 DOTA2 加载
  4. 进入地图

这个循环大约 30-60 秒。这个速度说实话非常难受。

社区有一些加速方案(比如用控制台命令直接重载),但稳定性不一。


总结

它的学习曲线非常陡峭,并且没有太多学习资料。


一些资源

以下是资源Dota mod开发可能会用到的资源:

  • **ModDota**:目前最活跃的 DOTA2 Mod 开发社区,有整理过的教程和 API 参考
  • 官方 Workshop Tools Wiki:API 列表和工具说明
  • GitHub 上的开源 Mod:搜索 “dota 2 addon” 能找到大量示例项目,比文档更有参考价值
  • DOTA2 Modding Discord:社区聊天,遇到报错可以直接问

DOTA2 Mod 编辑器不是一套好上手的工具。它的价值不在于方便,在于把整套经过十年打磨的引擎交到开发者手里。