VCMP极简开服教学:脚本开发初体验
- 作者:VEGETAZ
0.前置依赖
- 引擎准备完毕
- 基本的插件、脚本环境配置完毕
- 求知的好奇心和冷静的思考脑
1.基础认知
- 脚本文件记录代码,会被引擎解释执行;除了游戏底层的机制之外,几乎所有功能都是用脚本来实现的。
- 数据是程序处理的东西,比如游戏里玩家的血量。
- 功能是程序处理事情的一个抽象步骤;VCMP提供了一些实现好的功能,在脚本中可以直接使用,比如创建一个拾取物CreatePickup功能。
- 事件用来描述“何时发生了何事”,比如“当玩家上车的时候”;VCMP提供了一些预设好的事件,在脚本中可以直接填充,实现内容,比如可以在玩家上车的事件实现内让玩家血量变为50。
2.编写脚本
- 在服务端的脚本开发中,有个事件是在入口脚本被执行的时候触发,onScriptLoad事件,故而服务器内容的初始化一般都在这个事件的实现里完成。
- 在入口脚本中编写以下代码(目前先忽略次要元素,重点解释核心元素):
function onScriptLoad() {
CreatePickup(?);
}
- CreatePickup一行括号内表示该功能需要的参数,暂时写了个问号,表示填入的关键数据未知。
- 查询CreatePickup功能的用法(通过WiKi)可知这里最少需要两个数据,分别是:
- 拾取物模型id:model
- 创建的位置坐标:pos
- 模型id同样可以去WiKi查看;而坐标不借助其他工具的话,可以游戏里用指令实现获取。这里为了方便可以直接使用坐标(-645, 757, 11),在脚本环境中用向量数据类型Vector来表示:Vector(-645, 757, 11)。
- 将两个关键数据替换掉上述的问号,当前的脚本全部内容如图。
- 保存后重新启动引擎,进入游戏便可看到拾取物成功创建。
- 稍微理解一下当前服务器脚本原理
- 引擎启动,执行脚本内容。
- 执行脚本内容时,发现预设的onScriptLoad事件的实现定义,于是引擎当场在加载脚本时执行该内容。
- 执行onScriptLoad事件实现时,发现一行CreatePickup功能,此功能在当前环境中有实现的方式故而可用,于是执行了CreatePickup对应的“创建拾取物”功能。
- 这个时候去拾取这个药丸拾取物,是没有任何效果的,因为还没有写明拾取它之后会发生什么,于是需要用到另一个事件onPickupPickedUp,这个事件在任何拾取物被拾取的时候都会触发。
- 根据onPickupPickedUp事件的实现定义,可以利用的数据一个是玩家player,一个是拾取物pickup;于是可以用模型id来进行过滤,当玩家拾取的时候触发判断,是药丸模型367号就给玩家扣一半的血;这里用到两个数据,一个是模型id--pickup.Model,一个是玩家player的血量Health。
- 编写代码,如图,代码所有内容也附上
function onScriptLoad() {
CreatePickup(367, Vector(-645, 757, 11));
}
function onPickupPickedUp(player, pickup) {
if (pickup.Model == 367) {
player.Health = player.Health / 2;
}
}
- 重新启动引擎,游戏里重新连接服务器,此时触碰拾取药丸会发现血量成功变化为一半,且每次拾取都会变为现有的一半血量;这个就是事件触发的作用。
3.总结
- 以事件贯穿程序的整个活动周期,就是事件驱动的系统模式;VCMP脚本开发正是以事件驱动为核心模式。
- 程序的终极目标总是操作数据,这是最基本最微粒度的事情;VCMP脚本开发最后也总是在操作数据。
- 将相近的操作合并起来,成为一个新的功能,数据和功能一起构成了程序;VCMP脚本开发不仅本身环境提供了各种功能,也支持定制新的功能。
4.额外讲解:该部分目前可先放弃关注,但看得懂可以接着看
- 当事件触发后,对应的处理操作,在脚本中是用函数的形式去对应。
- 定义一个函数用到关键词function,函数相当于一个盒子,给它输入,它会产生输出,所以函数标志性地带着括号(),表示需要的输入;如上述的CreatePickup(model, pos)表示该功能需要两个输入,分别有什么含义。













