JASS 脚本基础入门
JASS 是什么?为什么要学习它?
本节将介JASS 脚本语言的基础概念,帮助你理解它是什么、为什么在地图制作中很重要,以及它和触发器有什么区别。学完本节后,你将明白什么时候需要用JASS,而不是只会用触发器
JASS 的历史与作用
JASS 魔兽争霸(War3)地图编辑器专用的脚本语言,这种语言只会在魔兽争霸里面使用[^2]。你可以JASS 理解为地图编辑器提供的一底层工具"——它比触发器更接近游戏的底层核心,能访问更多的游戏功能接口
在魔兽争霸中,游戏引擎提供的各种功能(叫原生函数")被声明在几个特殊文件里,比common.j、common.ai、Blizzard.j 等[^3]。JASS 脚本就是通过调用这些函数来控制游戏的
JASS 能做什么?不能做什么?
JASS 能做的:
- 访问触发器无法直接控制的高级游戏接口
- 实现更精细的变量控制,包括局部变量和全局变量的作用域管理[^1]
- 创建复杂的数据结构和算法逻辑
*JASS 不能做的
- 不能独立于地图编辑器存在,必须配合触发器使用
- 不能调用魔兽争霸引擎之外的功
- 本身不提供图形界面,代码是纯文本形式
💡 新手提示:JASS 不是万能的!大多数地图功能其实用触发器就能实现,只有在触发器"做不很难的时候,才需要借助 JASS
JASS 与触发器的区
很多新手会纠结:既然有触发器,为什么还要学 JASS
简单来说:
- **触发器(GUI*:用图形界面操作,适合快速实现基础功能,但对复杂逻辑支持有限[^4]
- JASS:用代码操作,灵活度更高,可以实现触发器做不到的事情
变量作用域是区分新手与中级作者的关键分水岭[^1]。触发器中的变量有时候不够灵活,JASS 能让你精确控制每个变量的作用范围
⚠️ 常见错误:很多新手一上来就死JASS,结果发现触发器就能完成自己的需求*建议**:先用触发器实现功能,确实遇到瓶颈时再学 JASS
小结
通过本节,你应该已经理解
- JASS 是魔兽争霸专用的脚本语言,不是通用编程语言
- 它是触发器的"升级,能实现更复杂的功能
- 学习 JASS 的最佳时机是当你发现触发器不够用的时
打开 JASS 编辑
本节将手把手教你如何打开 JASS 脚本编辑器。学会后,你就能看到地图背后运行的脚本代码,为后续编写自定义逻辑打下基础
原版 World Editor 的脚本编辑器
在魔兽争霸原版编辑器中,JASS 脚本编辑器与触发器编辑器紧密集成,属于高级功能区域
操作步骤
- 第一步:打开 World Editor 双击桌面图标或在魔兽争霸安装目录中找
World Editor.exe打开编辑器[^2] - 第二步:进入触发器编辑器 在编辑器左侧面板找到"触发(Trigger)选项卡,点击展开[^1]
- 第三步:定位脚本编辑入口 在触发器面板右键点击任意触发(或文件夹),选择弹出菜单中的 *"编辑脚本"(Edit Script 选项
- 第四步:查看 JASS 代码 此时编辑器中央会显示该触发器对应JASS 脚本代码[^3]
💡 新手提示:如果右键菜单没有看编辑脚本",可能是因为你当前选中的是"注释"或空文件夹,尝试选中一个具体的触发器再操作
⚠️ 常见错误:很多新手误以为 JASS 编辑器是独立的窗口,实际上它是嵌入在触发器编辑器中的一个面板。关闭面板时 JASS 代码不会丢失,它仍然保存在地图文件中
JASS Helper(NewGen)简
原版编辑器的脚本编辑功能比较基础,没有语法高亮和代码提示。为了提升开发体验,社区开发了 JASS Helper,也称为 NewGen 编辑器增强包[^2]
核心特点
- 提供语法高亮(代码用不同颜色显示关键字、字符串、注释)
- 支持代码补全(输入部分代码会弹出建议列表
- 内置**错误检*(写错语法时会有提示
安装说明
NewGen 不是独立程序,而是对原World Editor 的增强补丁。安装后,你的编辑器界面会有细微变化,但操作方式与原版一致——打开方式仍然是右键触发器选择"编辑脚本"
💡 新手提示:如果你是第一次制作地图,建议先用原版编辑器熟悉基本概念,再安NewGen。两种方式的脚本编辑入口完全相同,学会一个就能通用
小结
完成以上步骤后,你应该能够:
- World Editor 中找到触发器编辑
- 通过右键菜单打开 JASS 脚本编辑面板
- 理解原版编辑器与 NewGen 增强版的区别
下一步,你可以尝试打开任意触发器的脚本,观察其中包含的 function Trig_XXX_Conditions function Trig_XXX_Actions 等关键代码结构,为后续学JASS 语法做准备
JASS 语法基础
本节将带你认识JASS脚本的基本语法规则。学完本节后,你将能够看懂JASS代码的结构,并尝试编写简单的脚本片段
变量声明与类
JASS中的变量就像是一个个"盒子",用来存放数据。在JASS里,每个变量都必须声明它类型"——也就是这个盒子里能放什么东西[^1]
*JASS常用变量类型
integer(整数)——存放如 100 这样的整real(实数)——存放如 1.5.14 这样带小数的string(字符串)——存放文字内容,"你好"boolean(布尔值)——只true(真)或false(假)两种unit(单位)——存放一个游戏单
声明变量的语法:
// 全局变量(在函数外面声明,所有函数都能用
local integer myScore = 0 // 这是局部变量,在函数内部使2
💡 新手提示:变量名最好用英文或拼音表示,不要用纯数字或特殊符号开头。比
player1、damageValue都是好的命名方式
⚠️ 常见错误:新手经常忘记在变量类型前加
local,导致系统报错。记住:在函数内部使用的变量前面必须local
函数的基本结
函数是JASS代码积木",每个函数完成一个特定的功能[^3]。JASS的函数结构如下:
function 函数takes 参数类型1 参数, 参数类型2 参数 returns 返回类型
// 在这里写代码
return 返回
endfunction2
3
4
*示例
function AddDamage takes integer base, integer bonus returns integer
local integer total = base + bonus
return total
endfunction2
3
4
这个函数名叫 AddDamage,它接收两个整数参数(base bonus),计算它们的和后返回一个新的整数
💡 新手提示:
takes后面是输入参数,returns后面是返回值类型。如果没有返回值,returns nothing
注释的写
注释是写给人看的说明文字,电脑执行代码时会忽略它们。养成写注释的习惯,以后回头看自己的代码会轻松很多
*单行注释 使用 // 符号,后面的内容都会被忽
local integer gold = 100 // 给玩00金币*多行注释 使用 /* ... */ 包裹,适用于长段说
/*
* 这个函数用于计算单位受到的总伤
* base: 基础伤害
* armor: 护甲减伤
*/
function CalcDamage takes integer base, integer armor returns integer
return base - armor
endfunction2
3
4
5
6
7
8
💡 新手提示:建议每-10行代码就加一条注释,说明这段代码在做什么。即使是简单的注释也比没有好!
小结
完成本节学习后,你应该:
- 了解JASS种常用变量类
- 掌握
local声明局部变量的方法 - 能读
function...endfunction的基本结 - 学会使用
///* */写注
📝 动手试试:在World Editor中打开触发编辑器(Trigger Editor),切换自定义脚(Custom Script)标签,输入一行简单的注释和变量声明,感受一下JASS的写法吧
常用 Native 函数
本节将介JASS 中最常用Native(原生)函数,这些是 War3 引擎直接提供工具",相当于你已经组装好的积木组件。学会这些函数后,你就能在地图中实现输出信息、计算数值、操作单位和玩家等功能。[^3]
输出与调试函
调试函数是新手最常用的工具,它们能让你在地图运行时看到变量值或测试代码是否正常运行
BJDebugMsg(消息输出函数) 这是最基础的调试函
- 在触发编辑器中,选择"动作"游戏"文本消息(显示给玩家
- 或者在 JASS 代码中直接写:
call BJDebugMsg("这里写你要显示的文字")[^2] - 这个函数会在屏幕上方显示一行黄色文字,持续约几
DisplayTimedTextToPlayer(定时文字显示) 更专业的输出方式
- 可以指定显示给哪个玩家、显示位置、持续时
- 格式:
call DisplayTimedTextToPlayer(player, x, y, duration, "消息内容")
💡 新手提示:调试时建议先用 BJDebugMsg 测试,确认逻辑正确后再用更复杂的显示函数
⚠️ 常见错误:很多新手忘记给字符串加引号,写
call BJDebugMsg(变量而不call BJDebugMsg("说明文字" + I2S(变量),导致显示错误
数学运算函数
数学函数用于处理数值计算,这在制作技能伤害、Buff 效果、距离判断时必不可少
常用类型转换函数[^1]
I2S(整数)把整数变成文S2I("文字")把文字变成整R2S(小数)把小数变成文S2R("文字")把文字变成小
**三角函数与计*[^2]
Cos(角度)/Sin(角度)计算余弦和正弦SquareRoot(数字)计算平方Pow(底数, 指数)计算幂次
*随机数函
GetRandomInt(最小 最大获取范围内的随机整数GetRandomReal(最小 最大获取范围内的随机小数
单位与玩家相关函
这类函数是制RPG 地图的核心,涉及创建单位、获取玩家信息等操作。[^4]
创建单位函数
CreateUnitAtLoc(玩家, 单位类型, 位置, 面向角度, 皮肤)在指定位置创建一个单- 例如:
call CreateUnitAtLoc(Player(0), 'hfoo', location(0, 0), bj_UNIT_FACING, bj_UNIT_INDEFAULTCOLOR)
获取相关函数
GetTriggerUnit()获取触发事件中的单位(最常用!)GetOwningPlayer(单位)获取某个单位属于哪个玩家GetPlayerId(玩家)获取玩家的编号(0-11
*单位属性函
SetUnitX(单位, X坐标)/SetUnitY(单位, Y坐标)移动单位SetUnitLife(单位, 生命设置单位生命GetUnitX(单位)/GetUnitY(单位)获取单位坐标
💡 新手提示:记
Get开头是"获取",Set开头是"设置",这个命名规律适用于所JASS 函数
⚠️ 常见错误:新手经常混淆玩家编号和颜色编号。比如玩的颜色是红色,但玩家编号(因为从0开始计数)。建议用
Player(n)其中 n 0-11
小结
完成以上学习后,你已经掌握了 JASS 中最常用Native 函数工具箱。现在你可以
- BJDebugMsg 测试你的触发器逻辑
- 用类型转换函数处理不同数据类型之间的转换
- 用数学函数实现技能伤害公式、距离检测等功能
- 用单位函数在地图中创建和管理单位
建议下一步尝试:打开 World Editor,新建一个触发器,用本文学到的调试函数输出一Hello World",确认你理解函数的调用格式后再继续深入学习!
编写第一JASS 脚本
本节我们将学习如何在 Warcraft III 世界编辑器中编写你的第一JASS 脚本。完成本节后,你将能够创建一个会在游戏开始时自动执行的脚本,让英雄单位出现在地图上
操作步骤
打开触发器编辑器并切换到 JASS 视图
在世界编辑器中,点击顶部菜单的「触发器」按钮打开触发器编辑器窗口[^2]。默认情况下,你看到的是 GUI(图形界面)视图。点击编辑器左上角的「编辑」菜单,选择「转换为自定义脚本」,或者直接按Ctrl + D将触发器代码转换JASS 格式[^3]。这时每个触发器的条件区和动作区都会变成纯文本的 JASS 代码*找到或创建一init 初始化函
每个 JASS 脚本都必须有一init函数,它会在地图加载完成后自动执行一次[^2]。在 JASS 视图中,init 函数的结构如下:jassfunction init takes nothing returns nothing // 你的初始化代码写在这 endfunction1
2
3如果你的地图还没有任何触发器,可以新建一个空白触发器,系统会自动生成 init 函数框架
使用原生函数创建单位
init 函数内部输入以下代码[^3]jasscall CreateUnitAtLoc(Player(0), 'Hpal', Location(0, 0), bj_UNIT_FACING)1这行代码的含义是:在玩家0(红色玩家)的地图坐0,0)位置创建一个圣骑士(
Hpal是圣骑士的单位代码),面朝默认方向。callJASS 中调用函数的语法,CreateUnitAtLoc是一个原生函数(Native Function),负责在指定位置创建指定类型的单位[^3]*保存并测试地
Ctrl + S保存你的地图,然后按F10打开 Warcraft III 多人游戏,选择「本地电脑」测试你的地图。进入游戏后,你应该能看到圣骑士出现在地图中央
⚠️ 常见错误
- 拼写错误:JASS 对大小写敏感,
CreateUnitAtLoc不能写成createunitatlocCreateunitatloc,否则游戏会报错「Expected a function name」- 缺少引号:单位代
'Hpal'必须用单引号包裹,用双引号会导致类型错误- 中文括号:有些新手复制代码时会带入中文的全角括号
(),这会让脚本解析失败,必须全部替换为英文半角括号()
💡 新手提示 不知道某个功能对应的单位代码?可以在世界编辑器中选中单位,按
Ctrl + D查看单位属性,其中的「单ID」就是该单位的四字符代码
小结
恭喜你完成了第一JASS 脚本!现在你已经掌握JASS 脚本的基本结构、init 初始化函数的用法,以及如何调用原生函数在地图上创建单位。这些是你后续学习更复杂功能(如响应游戏事件、操作多个单位、制作技能系统)的基石
常见错误与调试方
本节将教你识别和修复 JASS 脚本中最常见的两类错误:语法错误和逻辑错误。学完本节后,你将能够独立排查脚本问题,不再对着报错信息手足无措
语法错误解读
语法错误就像写中文时写错字,计算机会"看不你的代码。WE 编辑器会在你尝试保存或运行脚本时报错,告诉你具体哪里出了问题
语法错误的常见原因:
- 缺少分号 JASS 每条语句必须以分
;结尾,这是新手最容易犯的错误[^2] - *括号不匹 左括
(和右括号)的数量必须相 - *函数名拼写错 比如
GetTriggerUnit()写成GetTrigerUnit() - *中英文标点混 必须使用英文半角符号,不能用中文的括号或引号
*如何查看语法错误
- *第一步:打开 JASS 编辑 在触发器编辑器中,右键点击你的触发器,选择"转换为自定义代码"[^3]
- *第二步:检查错误提 保存时如果有问题,编辑器会弹出错误信息,告诉你错误在第几
- *第三步:逐字检 找到报错行后,仔细核对每个字符是否正
⚠️ 常见错误:很多新手看到满屏英文报错就慌了。其实你只需要关"Error" 后面的内容,它会告诉你缺少了什么符号或者哪个词不认识
逻辑错误排查技
逻辑错误更狡猾——代码能正常运行,不会报错,但结果完全不是你想要的。比如你写了一个扣血的触发器,结果反而给玩家加血了,这就是逻辑错误
排查逻辑错误的常用方法:
- 使用
BJDebugMsg("测试信息")输出调试信息 在关键位置插入这行代码,看看程序执行到这里时变量值是多少[^2] - *逐段注释 把一部分代码
//注释掉,只运行剩下的部分,逐步缩小问题范围 - 检查变量作用域 局部变量只能在声明它的函数内使用,在函数外部无法读取[^1][^4]
*调试实操步骤
- *第一步:找到疑似出错的函 如果某个功能不正常,把相关的触发器代码复制到 JASS 编辑器中检
- 第二步:插入
BJDebugMsg输出 在变量赋值后添加BJDebugMsg("变量X的值是: " + I2S(变量X)),这样游戏运行时会在屏幕上显示变量 - 第三步:运行地图测试 F6 测试地图,观察调试信息是否符合预
- 第四步:根据输出判断 如果显示的值和预期不一样,说明问题出在赋值的逻辑
💡 新手提示:养成好习惯,写代码时每行只做一件事。比
set udg_count = udg_count + 1这行,不要在同一行里又加血又减血又赋值,容易把自己搞晕
⚠️ 常见错误:逻辑错误最常发生在变量作用域搞混的时候。记住,局部变量(在函数内部用
local声明的)只在那个函数内有效,而全局变量(不local的)可以在整个脚本中使用[^4]。如果你在一个函数里定义的局部变量,想在另一个函数里用,当然会出错
小结
完成以上步骤后,你应该能够:
- 通过编辑器的报错信息快速定位语法错
- 使用
BJDebugMsg配合游戏测试来追踪变量值的变化 - 用逐段注释法逐步缩小逻辑错误的范
- 理解局部变量和全局变量的区别,避免作用域相关的错误
遇到问题时不要慌,耐心查看错误提示,一步步排查,这是每JASS 开发者都要经历的过程
参考来
[^1]: War3编辑器进阶:全局变量'局部变,搞懂JASS脚本前的必备 ... accessed 2026-05-30 [^2]: JASS入门到提高教程,想学J的进来! - 偶久网 accessed 2026-05-30 [^3]: 研究War3编辑器(7):在触发器中使用JASS脚本_jasshelper-CSDN... accessed 2026-05-30 [^4]: 从零开始的RPG 游戏制作教程#10 信息反馈(下- Indienova accessed 2026-05-30