MuMu 脚本编辑器命令说明
本文档用于说明 MuMu 脚本编辑器支持的全部命令、参数和常见写法。
一、阅读说明
- 命令和参数使用英文半角字符。
- 坐标原点位于屏幕左上角,X 向右增大,Y 向下增大。
- 时间参数统一使用毫秒,
1000毫秒等于 1 秒。 - 语法中的方括号表示该参数可不填。例如
touchup([id])表示id可不填,实际输入时不需要输入方括号。 - 文本和应用包名需要使用英文双引号,例如
inputtext("hello")。 if、for、while、function和onkeyup都是结构命令,必须使用end结束。- 以
--开头的行是注释,不会执行。
二、命令快速索引
| 分类 | 命令 | 用途 |
|---|---|---|
| 触摸 | tap(x,y) |
点击坐标 |
| 触摸 | swipe(x1,y1,x2,y2[,time]) |
从起点滑动到终点 |
| 触摸 | touch(x,y,time) |
长按坐标 |
| 触摸 | touchdown(x,y[,id]) |
按下触点但不松开 |
| 触摸 | touchmove(x,y[,id[,time]]) |
移动已经按下的触点 |
| 触摸 | touchup([id]) |
松开触点 |
| 触摸 | movezoomin(x1,y1,x2,y2[,time]) |
双指放大 |
| 触摸 | movezoomout(x1,y1,x2,y2[,time]) |
双指缩小 |
| 控制 | delay(ms) |
等待指定时间 |
| 控制 | for i=1,n do ... end |
循环执行 N 次 |
| 控制 | while condition do ... end |
条件成立时持续循环 |
| 控制 | if condition then ... end |
条件判断 |
| 控制 | break |
跳出当前循环 |
| 控制 | local name = value |
定义变量 |
| 控制 | function name() ... end |
定义函数 |
| 控制 | name() |
调用已经定义的函数 |
| 控制 | return [value] |
结束函数并可选择返回值 |
| 控制 | endscript() |
立即停止脚本 |
| 设备 | inputtext("text") |
向当前输入框输入文本 |
| 设备 | enterstaring() |
锁定并隐藏鼠标 |
| 设备 | exitstaring() |
解锁并显示鼠标 |
| 设备 | getmouseposition() |
获取当前鼠标坐标 |
| 设备 | isrunning("package") |
检测应用是否正在运行 |
| 设备 | setscreenscale(width,height[,scale]) |
按基准分辨率换算坐标 |
| 事件 | onkeyup ... end |
宏按键松开时执行命令 |
三、触摸命令
1. tap(x,y):点击
在指定坐标短按一次。
| 参数 | 是否必填 | 说明 |
|---|---|---|
x |
必填 | 点击位置的 X 坐标 |
y |
必填 | 点击位置的 Y 坐标 |
tap(500,300)
2. swipe(x1,y1,x2,y2[,time]):滑动
从起点坐标滑动到终点坐标。
| 参数 | 是否必填 | 说明 |
|---|---|---|
x1 |
必填 | 起点 X 坐标 |
y1 |
必填 | 起点 Y 坐标 |
x2 |
必填 | 终点 X 坐标 |
y2 |
必填 | 终点 Y 坐标 |
time |
可不填 | 滑动耗时,默认 100 毫秒 |
swipe(200,700,200,300,500)
3. touch(x,y,time):长按
在指定坐标按住一段时间后松开。
| 参数 | 是否必填 | 说明 |
|---|---|---|
x |
必填 | 长按位置的 X 坐标 |
y |
必填 | 长按位置的 Y 坐标 |
time |
必填 | 按住时长,单位为毫秒 |
touch(500,300,2000)
4. touchdown(x,y[,id]):按下触点
在指定坐标按下触点并保持,不会自动松开。后续必须配合 touchmove 或 touchup 使用。
| 参数 | 是否必填 | 说明 |
|---|---|---|
x |
必填 | 按下位置的 X 坐标 |
y |
必填 | 按下位置的 Y 坐标 |
id |
可不填 | 触点 ID,默认 0 |
touchdown(500,300)
delay(1000)
touchup()
5. touchmove(x,y[,id[,time]]):移动触点
把已经按下的触点移动到新坐标。未先调用 touchdown 时,无法形成完整的触摸操作。
| 参数 | 是否必填 | 说明 |
|---|---|---|
x |
必填 | 目标位置的 X 坐标 |
y |
必填 | 目标位置的 Y 坐标 |
id |
可不填 | 触点 ID,默认 0 |
time |
可不填 | 移动耗时,默认 100 毫秒 |
需要填写 time 时,应同时保留 id 的参数位置。
touchdown(300,500,0)
touchmove(700,500,0,500)
touchup(0)
6. touchup([id]):松开触点
松开指定触点。
| 参数 | 是否必填 | 说明 |
|---|---|---|
id |
可不填 | 触点 ID,默认 0,需要与前面的 touchdown 保持一致 |
下面的示例使用两个触点完成向外拉伸动作:
touchdown(400,400,1)
touchdown(600,400,2)
touchmove(300,400,1,300)
touchmove(700,400,2,300)
touchup(1)
touchup(2)
7. movezoomin(x1,y1,x2,y2[,time]):双指放大
以两个坐标为起点,同时向两端滑动,模拟双指放大。
| 参数 | 是否必填 | 说明 |
|---|---|---|
x1 |
必填 | 第一个触点的 X 坐标 |
y1 |
必填 | 第一个触点的 Y 坐标 |
x2 |
必填 | 第二个触点的 X 坐标 |
y2 |
必填 | 第二个触点的 Y 坐标 |
time |
可不填 | 动作耗时,默认 50 毫秒 |
movezoomin(500,500,700,500,300)
8. movezoomout(x1,y1,x2,y2[,time]):双指缩小
以两个坐标为起点,同时向中间滑动,模拟双指缩小。
| 参数 | 是否必填 | 说明 |
|---|---|---|
x1 |
必填 | 第一个触点的 X 坐标 |
y1 |
必填 | 第一个触点的 Y 坐标 |
x2 |
必填 | 第二个触点的 X 坐标 |
y2 |
必填 | 第二个触点的 Y 坐标 |
time |
可不填 | 动作耗时,默认 50 毫秒 |
movezoomout(400,500,800,500,300)
四、控制命令
1. delay(ms):等待
暂停指定时间后继续执行下一条命令。编辑器参数留空时使用默认值 1000 毫秒。
| 参数 | 是否必填 | 说明 |
|---|---|---|
ms |
必填 | 等待时长,单位为毫秒 |
delay(1000)
2. for i=1,n do ... end:循环 N 次
按照固定次数重复执行结构内的命令。编辑器会自动生成 i=1、do 和 end。
| 参数 | 是否必填 | 说明 |
|---|---|---|
n |
必填 | 循环次数 |
for i=1,5 do
tap(500,300)
delay(1000)
end
3. while condition do ... end:条件循环
条件成立时持续执行结构内的命令。必须确保条件最终会失效,或者在循环内使用 break,否则可能形成无限循环。
| 参数 | 是否必填 | 说明 |
|---|---|---|
condition |
必填 | 返回真或假的条件表达式 |
while isrunning("com.example.game") do
tap(500,300)
delay(1000)
end
4. if condition then ... else ... end:条件判断
条件成立时执行 then 后面的命令,否则执行 else 后面的命令。没有备用分支时可以删除 else。
| 参数 | 是否必填 | 说明 |
|---|---|---|
condition |
必填 | 返回真或假的条件表达式 |
if isrunning("com.example.game") then
tap(500,300)
else
endscript()
end
需要连续判断多个条件时,可以使用 elseif:
if score > 100 then
tap(500,300)
elseif score > 50 then
tap(400,300)
else
tap(300,300)
end
5. break:跳出循环
立即结束当前所在的 for 或 while 循环,并从循环后的下一条命令继续执行。break 不能单独放在循环外。
while true do
if isrunning("com.example.game") then
break
end
delay(1000)
end
6. local name = value:定义变量
给一个值起名字,便于后续重复使用。
| 参数 | 是否必填 | 说明 |
|---|---|---|
name |
必填 | 变量名,建议使用英文字母、数字和下划线,且不要以数字开头 |
value |
必填 | 变量的初始值 |
local waitTime = 1000
delay(waitTime)
7. function name() ... end:定义函数
把一组操作封装成可以重复调用的函数。当前编辑器主要支持无参数函数,函数需要先定义再调用。
| 参数 | 是否必填 | 说明 |
|---|---|---|
name |
必填 | 函数名,不能与已有命令重名 |
function collectReward()
tap(500,300)
delay(1000)
end
collectReward()
8. name():调用函数(编辑器命令 call)
执行已经定义的函数。左侧命令面板中的命令名为 call,插入代码后会自动转换成实际函数名加括号的形式。中文模式的“调用函数”参数面板会列出当前脚本中的函数名。
function closePopup()
tap(900,100)
end
closePopup()
调用的函数不存在时,编辑器会提示“调用的函数不存在”。
9. return [value]:从函数返回
立即结束当前函数。可以返回一个值,也可以不返回值。return 只能写在函数内部。
| 参数 | 是否必填 | 说明 |
|---|---|---|
value |
可不填 | 需要返回的值;留空时只结束函数 |
function checkApp()
if isrunning("com.example.game") then
return true
end
return false
end
10. endscript():停止运行
立即结束整个脚本,不再执行后续命令。通常用于条件不满足或发生异常时提前退出。
if isrunning("com.example.game") then
tap(500,300)
else
endscript()
end
五、设备命令
1. inputtext("text"):输入文本
向当前已经获得焦点的输入框输入文字。使用前通常需要先点击输入框,并等待输入框获得焦点。
| 参数 | 是否必填 | 说明 |
|---|---|---|
text |
必填 | 需要输入的文本,使用英文双引号包裹 |
tap(500,300)
delay(300)
inputtext("hello")
2. enterstaring():锁定并隐藏鼠标
进入鼠标锁定状态并隐藏鼠标。需要在适当时机调用 exitstaring() 恢复。
enterstaring()
3. exitstaring():解锁并显示鼠标
退出鼠标锁定状态并恢复显示鼠标。
exitstaring()
4. getmouseposition():获取鼠标位置
读取当前鼠标坐标。执行后,X 坐标保存在 mousex,Y 坐标保存在 mousey。
getmouseposition()
tap(mousex,mousey)
5. isrunning("package"):检测应用是否运行
检测指定包名的应用是否正在运行,并返回真或假。该命令通常放在 if 或 while 的条件中。
| 参数 | 是否必填 | 说明 |
|---|---|---|
package |
必填 | 应用包名,使用英文双引号包裹 |
if isrunning("com.example.game") then
tap(500,300)
end
6. setscreenscale(width,height[,scale]):适配分辨率
把后续坐标按照制作脚本时的基准分辨率等比换算,适合让同一脚本在不同分辨率的设备上使用。
| 参数 | 是否必填 | 说明 |
|---|---|---|
width |
必填 | 制作脚本时的基准宽度 |
height |
必填 | 制作脚本时的基准高度 |
scale |
可不填 | 是否对命令返回的坐标进行反向换算,默认 1 |
setscreenscale(1920,1080,1)
tap(960,540)
六、事件命令
onkeyup ... end:宏按键弹起时
当宏按键松开时执行结构内的命令,仅在宏模式中可用。该命令不接收键名参数,具体按键由编辑器外部的宏绑定决定。
onkeyup
exitstaring()
end
一个宏脚本可以同时包含按下时执行的普通命令和松开时执行的 onkeyup 结构:
enterstaring()
touchdown(500,300)
onkeyup
touchup()
exitstaring()
end
七、结构关键字
else:否则
用于 if 结构。当前面的条件不成立时,执行 else 后面的命令。
elseif condition then:否则如果
用于在同一个 if 结构中继续判断其他条件。
end:结束结构
结束最近一个尚未结束的 if、for、while、function 或 onkeyup 结构。缺少 end 时,编辑器会在对应的结构开头显示错误提示。
八、常见组合示例
点击后等待
tap(500,300)
delay(1000)
tap(620,460)
重复点击 5 次
for i=1,5 do
tap(500,300)
delay(1000)
end
应用运行时才执行
if isrunning("com.example.game") then
tap(500,300)
else
endscript()
end
输入文本
tap(500,300)
delay(300)
inputtext("hello")
九、常见错误提示
| 提示 | 原因 | 处理方式 |
|---|---|---|
| 参数不完整 | 必填参数为空 | 补全该命令的必填参数 |
缺少结束语句 end |
结构命令没有对应的结尾 | 在结构末尾添加 end |
| 缺少对应的开头语句 | 单独保留了 end、else 或 elseif |
恢复对应的结构开头,或删除多余语句 |
| 该命令需要放在循环内 | break 写在了循环外 |
把 break 移入 for 或 while |
| 该命令需要放在函数内 | return 写在了函数外 |
把 return 移入 function |
| 调用的函数不存在 | 调用了没有定义的函数 | 检查函数名,并确保函数已经定义 |
| 无意义代码 | 当前内容无法识别为支持的命令 | 检查拼写、括号和参数格式 |
十、使用建议
- 每次界面发生变化后增加适当的
delay,避免下一条命令执行过早。 touchdown必须与对应触点 ID 的touchup配对。while循环必须设计明确的退出条件,避免无限循环。- 函数应先定义再调用,并避免使用与内置命令相同的名称。
- 保存前检查编辑器中是否仍有红色错误提示。
文章已到底