常见问题

查询模拟器各类问题的解决方案

请输入关键词查找相关问题

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 循环必须设计明确的退出条件,避免无限循环。
  • 函数应先定义再调用,并避免使用与内置命令相同的名称。
  • 保存前检查编辑器中是否仍有红色错误提示。

文章已到底

关键词:
暂无搜索结果

暂时未能为您匹配到问题,请换个关键词试试吧~

你还可以:
1、联系在线客服反馈问题:点击咨询
2、登记问卷反馈问题:http://163.fm/8Xs3d3Mx
加载中...
Mu酱企业微信

长按识别二维码添加Mu酱