扫描二维码关注官方公众号
返回列表
+ 发新帖
查看: 110|回复: 0

[转载发布] 写给萌新的超简单事件脚本指南

[复制链接]
累计送礼:
0 个
累计收礼:
1 个
  • TA的每日心情
    开心
    2026-5-17 18:27
  • 签到天数: 196 天

    连续签到: 1 天

    [LV.7]常住居民III

    2620

    主题

    827

    回帖

    2万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    7
    卡币
    18187
    OK点
    16
    推广点
    0
    同能卷
    50
    积分
    21664

    灌水之王

    发表于 昨天 02:41 | 显示全部楼层 |阅读模式
    #RPG Maker MV

    事件脚本,

    是很多萌新一直想学会怎么用,但是又不知道从哪里入门的东西



    今天,就来给大家简单讲一讲

    希望对你有所帮助




    在脚本指令的第三页,有一个脚本功能,

    怎么用呢?



    我们先来一句最简单的JavaScript脚本:
    JAVASCRIPT 代码
    1. console.log('Hello World!')
    复制代码




    就随便放在一个NPC身上




    运行游戏,每次跟她触发一次对话

    你都会发现。。。。。





    她好像什么事都没有发生一样

    站在一片空荡荡地草原,一个人静静地望着远方.......


    不管你怎么跟她讲话

    她都不想理你.....





    等等!

    你再按下键盘按键F8(或者F12)

    可以显示开发者控制台,

    在Console标签页面,日志里可以看到多了一句话





    然后,

    我们也可以直接通过Developer Tools输入脚本,

    跟在事件指令中使用脚本指令调用脚本的作用是一样的。





    你把刚才那句脚本在这里输入试试~


    JAVASCRIPT 代码
    1. console.log("Hi, Welcome to Project1")
    2. console.log("https://rpg.blue/thread-383083-1-1.html")
    复制代码




    对了。

    这篇文章即将要讲解事件脚本的使用,也是直接在这里测试。
    因为在这里输入完,游戏里就会同步显示,非常方便!


    那么,在这里该如何写脚本呢?


    官方开发组的Archeia大佬已经整理了一个超级完整的事件脚本文档。

    在Google搜索"RMMV Script Calls"就能找到(RMVA版也有)





    不过Google文档在国内是打不开的,
    所以为了方便其他用户阅读,我把文档搬运到这里:

    https://shimo.im/sheets/RykXT9vdTXWtqwT3/



    先来看看表格前面几行



    对比一下,是不是发现,这份文档其实是按照事件指令的顺序整理好的!





    为了让大家更容易理解事件脚本,我在截图的时候会把英文页面也一起贴出来,大家可以和中文页面对比一下,就会知道为什么脚本为什么是这样写了~






    显示文字
    Show Text



    事件指令:
    在正常使用事件指令来显示文字,是这样用的:





    这里有几个可以让你自定义的选项:
    - 显示脸图(可选)
    - 设置对话框窗口背景
    - 设置对话框窗口位置
    - 输入文本内容


    这个你已经是非常熟悉了,反正往最大的框框打字就对了。



    事件脚本:
    如果要用脚本来显示文字,只需要这句:
    1. $gameMessage.add("俺はルフィ,海贼王になる男だ")复制代码
    复制代码




    然后在游戏中就会显示这句对话了~



    如果想要添加脸图,需要在显示文字的脚本前面,多写一句
    1. $gameMessage.setFaceImage('Actor1',0)$gameMessage.add("\\C[2]\\P[1]:\\C[0]\n嗨,冒险者,好久不见啊!")复制代码
    复制代码


    就相当于,选择素材库的"Actor1.png",第1张脸图




    有萌新可能不懂了,既然是显示第1张图

    为什么setFaceImage('Actor1', 0), 这后面居然是 0 ,而不是1呢?
    1. $gameMessage.setFaceImage('Actor1',0)复制代码
    复制代码




    在编程语言里,数组都是从0开始计数的。
    也就是说,最后第8位绿头紫瞳小姐姐,她的编号是7




    显示对话框脸图知道怎么用脚本了,
    窗口背景,窗口位置,其实也是一样的用法

    如果要设置样式,要在显示对话之前设置好
    1. $gameMessage.setFaceImage('Actor1',0)$gameMessage.setBackground(1)$gameMessage.setPositionType(1)$gameMessage.add("Show Text Script Call")复制代码
    复制代码


    刚才已经说了,0就是数组的第1项


    设置对话框背景:
    这里选中的就是列表中的第二个选项
    1. $gameMessage.setBackground(1)复制代码
    复制代码

    相当于




    设置对话框窗口位置:
    1. $gameMessage.setPositionType(1)复制代码
    复制代码

    相当于





    这样看明白了吗?



    还有个问题
    用事件脚本显示的文字,能不能加转义符?





    当然能啊,其实我前面已经有示范了~

    还记得这个吗?
    1. $gameMessage.setFaceImage('Actor1',0)$gameMessage.add("\\C[2]\\P[1]:\\C[0]\n嗨,冒险者,好久不见啊!")复制代码
    复制代码


    实际上就相当于:




    要注意的是,脚本里如果需要换行,需要用 \n 作为换行符,可不能随便加回车噢!


    然后其他的转义符要在前面多加一个 \

    比如第1号变量 \V[1],在这里就要写成  \\V[1]




    既然说到变量,顺便来讲讲变量吧:



    变量操作
    Control Variables


    其实用起变量来更简单,而且更好玩!




    事件指令是这样的:




    如果想要让变量 = 某个数字,比如



    用脚本来实现就是:
    1. $gameVariables.setValue(1, 20);复制代码
    复制代码



    顺便在显示文字中预览一下:
    1. $gameVariables.setValue(1, 20);$gameMessage.add("变量:" + $gameVariables.value(1))复制代码
    复制代码






    注意到了吗?

    我在显示对话里面加了一个新的东西
    1. $gameVariables.value(n)复制代码
    复制代码


    这个是用来获取变量的
    $gameVariables.value(n)


    而这是用来操作变量的
    $gameVariables.setValue(n)


    获取变量和在显示文章中的 \V[n] 的作用一样
    这个n就是第几号变量的意思

    其实就相当于这么写
    这两句对话的结果是相同的:
    1. $gameMessage.add("变量:" + $gameVariables.value(1))$gameMessage.add("变量:\\V[1]")复制代码
    复制代码



    所以,如果你希望某个变量的值等于另一个变量的值


    就是这样:
    1. $gameVariables.setValue(1, $gameVariables.value(2));复制代码
    复制代码





    随机数:

    在事件指令面板中,
    你想要随机得到一个1~5的数字:





    在脚本中看到的随机数函数函数是这样的:
    1. Math.randomInt(n) 复制代码
    复制代码


    但是,如果你像前面教你的一样,马上写出了这样一句。。
    1. $gameVariables.setValue(2, Math.randomInt(5))复制代码
    复制代码


    表面看起来好像没错,
    然而,实际上的结果,却是这样的:




    为什么?
    来跟大家讲解下这个随机数函数的用法:


    Math.randomInt(n)
    返回的是 0 ~ n 之间的正整数(但不包括n)


    所以,Math.randomInt(5)
    这样得到的数字只有:0、1、2、3、4


    正确的用法是:
    1. 1 + Math.randomInt(5)复制代码
    复制代码


    这样就能得到 1~5 之间的数字了~



    如果你想要使用更多数学函数,可以去翻一下JavaScript的Math库,还有很多好用的数学函数,比如:
    1. // 向下取整Math.floor(x)//四舍五入Math.round(x)// 绝对值Math.abs(x)//最大值最小值Math.max(x,y)Math.min(x,y)// 三角函数Math.sin(x)Math.cos(x)Math.tan(x)// 平方根Math.sqrt(x)// 求x的y次方: // Math.pow(3,4) = 3*3*3*3Math.pow(x,y)复制代码
    复制代码





    游戏数据:

    用变量代入游戏数据,是事件中非常非常非常重要的一个功能




    而且,这个用脚本更加方便!!
    1. $gameVariables.setValue(6, $gamePlayer.x)$gameVariables.setValue(7, $gamePlayer.y)$gameVariables.setValue(8, $gameMap.events()[n].x)$gameVariables.setValue(9, $gameMap.events()[n].y)复制代码
    复制代码



    这个能看懂吗?
    1. // 设置变量6,7号为玩家坐标的x、y$gameVariables.setValue(6, $gamePlayer.x)$gameVariables.setValue(7, $gamePlayer.y)// 设置变量8,9号为第n号事件的坐标x、y$gameVariables.setValue(8, $gameMap.events()[n].x)$gameVariables.setValue(9, $gameMap.events()[n].y)复制代码
    复制代码



    这两个是玩家的坐标
    1. $gamePlayer.x$gamePlayer.y复制代码
    复制代码



    第n号地图事件的坐标
    1. $gameMap.events()[n].x$gameMap.events()[n].x复制代码
    复制代码





    数据库的数据





    1. $gameActors.actor(1)._name$gameActors.actor(1)._exp[1] //经验值$gameActors.actor(1).level   //等级$gameActors.actor(1).hp$gameActors.actor(1).mp$gameActors.actor(1).mhp$gameActors.actor(1).mmp$gameActors.actor(1).atk //攻击力$gameActors.actor(1).def //防御力$gameActors.actor(1).mat //魔法攻击$gameActors.actor(1).mdf //魔法防御$gameActors.actor(1).agi //敏捷$gameActors.actor(1).luk //幸运复制代码
    复制代码




    如果不知道具体还有哪些属性,有个超级好用的办法:

    直接获取一个对象,就可以看到它的所有属性方法了
    1. $gameActors.actor(1)复制代码
    复制代码





    你看,这些游戏数据,全都在这里啦!

    至于它们为什么显示(...)呢?你鼠标点击一下,有惊喜。


    既然能获取了,那能不能修改呢?
    直接赋值,像$gameActors.actor(1)._exp[1] = 100 这样行不行?
    当然不行!这是错误的



    但是已经有现成的方法可以用了:
    1. $gameActors.actor(1).gainExp(50);   // 增加50点经验值$gameActors.actor(1).gainExp(-50);  // 减少50点经验值复制代码
    复制代码


    第3名队友增加50点经验值
    1. $gameParty.members()[2].gainExp(50);复制代码
    复制代码



    全体队友减少1点经验
    1. $gameParty.members().forEach(function(m){  m.gainExp(-1)});复制代码
    复制代码





    最后再讲一个最最最最最实用的事件脚本!


    操作开关
    Control Switch



    操作开关也是非常重要的一个功能



    用起来更是简单:
    1. $gameSwitches.setValue(id, true/false);复制代码
    复制代码


    举例:
    打开 1 号开关
    1. $gameSwitches.setValue(1, true);复制代码
    复制代码

    关闭 5 号开关
    1. $gameSwitches.setValue(5, false);复制代码
    复制代码


    花式玩法:
    1. $gameSwitches.setValue(1, ($gameVariables.value(1) >= 10))复制代码
    复制代码

    这个什么意思?

    拆解一下:原本的结构是这样滴。
    1. $gameSwitches.setValue(id, true/false);  复制代码
    复制代码

    首先,1 是 id 很好理解了。
    然后,($gameVariables.value(3) >= 10) 是什么?
    噢, $gameVariables.value(3)  前面讲到了,是获取 3 号变量。
    那就变成了  (3号变量 > 10),判断 3号变量是否大于并等于10。如果>=10,返回 true。 如果小于10,返回 false。

    所以啊,这句的意思就是判断 3号变量是否大于10,如果是,打开1号开关。
    这是不是可以用在某些游戏关卡上面呢?根据某些变量,解锁特定内容?


    再来看一个复杂点的!
    真的,很复杂!
    1. $gameSwitches.setValue(1,  ($gameSwitches.value(1) == false) &&   ($gameSwitches.value(2) == true) &&   ($gameSwitches.value(3) == true))复制代码
    复制代码



    这个什么意思?

    如果1号开关为OFF,
    并且2号开关和3号开关都为ON的状态,
    那么就把1号开关ON;否则,保持OFF状态。


    我们来测试一下:

    在测试模式中按下键盘F9,可以开启DEBUG面板
    默认的DEBUG面板可以直接看到变量和开关的值



    然后,把1号开关关闭;并且打开2、3号开关
    1. $gameSwitches.setValue(1,false)$gameSwitches.setValue(2,true)$gameSwitches.setValue(3,true)复制代码
    复制代码


    再按2下键盘的F9,重新进入DEBUG面板,
    可以看到已经发生了变化





    然后我们运行上面的脚本:
    1. $gameSwitches.setValue(4,  ($gameSwitches.value(1) == false) &&   ($gameSwitches.value(2) == true) &&   ($gameSwitches.value(3) == true))复制代码
    复制代码


    很明显,全都满足了我们想要的条件,相当于:
    1. $gameSwitches.setValue(4,  (true) && (true) && (true))复制代码
    复制代码


    就相当于这样:
    1. $gameSwitches.setValue(4,true)复制代码
    复制代码



    所以1号开关,也就打开了




    那如果我们再运行一次脚本
    这时候明显是不满足判断条件的,

    所以,就会变成这样:
    1. $gameSwitches.setValue(4,  (false) && (true) && (true))复制代码
    复制代码


    就相当于这样:
    1. $gameSwitches.setValue(4,false)复制代码
    复制代码


    1号开关会还原回去,变成OFF了



    以某个开关的状态来判断目前开关状态应该打开还是关闭,这个应该是比较频繁的操作了。

    直接这样看好像有点懵逼,换做具体的应用场景,应该就会比较好理解了~

    例如,
    1号开关:是否第一次进入场景? (否)
    2号开关:是否解锁了剧情A?(是)
    3号开关:是否解锁了剧情B?(是)

    如果满足了这些条件,就打开 4号开关。




    操作独立开关
    Control Self Switch



    跟你说,用脚本来控制开关,真的超级超级超级实用!





    因为,在正常使用事件指令的时候,
    你是没有办法在A事件里面控制B事件的独立开关的!!


    但是!!!
    脚本可以啊!!

    1. $gameSelfSwitches.setValue([mapID, eventID, 'A'], true);复制代码
    复制代码


    比如:
    控制 1号地图,第3号事件 的独立开关A,设置为OFF
    $gameSelfSwitches.setValue([1, 3, 'A'], false);[/code]


    注意,这里的第1个参数是个数组。如果不好理解,也可以试试这样:

    控制1号地图,第5号事件的独立开关A,设置为ON
    1. const key = [1, 5, 'A'];$gameSelfSwitches.setValue(key, true);复制代码
    复制代码



    花式玩法:

    关闭当前事件所在的地图第1、2、3、4、5号事件的独立开关A、B、C、D
    1. var eventIds = [1, 2, 3, 4, 5];var letters = ['A','B','C','D']for (var i = 0; i < eventIds.length; i++) {  for (var j = 0; j < letters.length; j++) {    var key = [this._mapId, eventIds[i], letters[j]];    $gameSelfSwitches.setValue(key, false);  }}复制代码
    复制代码




    关闭当前事件身上的所有独立开关
    1. $gameSelfSwitches.clear();复制代码
    复制代码




    -END-




    更多的方法,自己看表格文档吧。。



    RMMV Script Calls
    https://docs.google.com/spreadsh ... KO75dtfKDOetnvh7OHs



    打不开Google文档的,可以看下面这个:
    https://shimo.im/sheets/RykXT9vdTXWtqwT3/



    对了,还有@绝汪 整理的这个RMMV事件脚本整合
    https://rpg.blue/thread-403194-1-1.html





    好了,今天先介绍这么多了

    有空再更新~
    (我也不知道哪天有空)







                本帖来自P1论坛作者990255918,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=478377  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    天天去同能,天天有童年!
    回复 送礼论坛版权

    使用道具 举报

    文明发言,和谐互动
    文明发言,和谐互动
    高级模式
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    幸运抽奖

    社区每日抽奖来袭,快来试试你是欧皇还是非酋~

    立即查看

    聊天机器人
    Loading...

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2026-5-27 01:35 , Processed in 0.093214 second(s), 54 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表