【BESIEGE】Lua脚本mod入门

您所在的位置:网站首页 besiege地形mod 【BESIEGE】Lua脚本mod入门

【BESIEGE】Lua脚本mod入门

#【BESIEGE】Lua脚本mod入门| 来源: 网络整理| 查看: 265

在视频里讲编程不太现实,因此写一份简单的代码讲解,配合视频、Wiki和u3d手册食用更佳:

https://www.bilibili.com/video/BV1a5411E7Bg

https://www.bilibili.com/video/BV1bZ4y1A7fH

https://github.com/ilyshk4/luamod-wiki/wiki

https://docs.unity3d.com/cn/current/Manual/UnityManual.html

脚本同直接在u3d中编程并无二样,熟悉u3d的同学可以直接上手,甚至可以约等于“有限制的”u3d脚本。

PS:B站专栏代码块尚不支持Lua语法,只好用了C#的,显示可能会有点怪。

首先讲一下脚本的基本结构:

第一部分是全局定义,包括零件控制/状态信息、按键、全局变量等,必须同游戏内的零件相对应。注意一个ref key可以控制多个零件,如四个轮子可以共用同一个key,一行代码即可同时操作它们。

全局变量在下述的每个函数中都能调用,因此可以用于函数间传递值(注意非实时性,下面细讲)。

第二部分是几个函数:

在模拟开始时只调用一次的play(),用于各类初始化工作。

每帧都会调用的update(),调用频率随帧率波动,且本mod并没有u3d的Time相关方法,因此时间间隔不确定,涉及物理计算的代码不宜放在这里。

每帧后调用的late_update(),同上,没有太大的用处。

固定每0.01秒调用一次的fixed_update(),是我们主要使用的函数。固定的时间间隔使我们可以在此作物理计算,而无需Time相关方法的加持。虽然u3d手册里指出input的更新是和update一致的,但Time方法的缺乏使我们不得不在fixed_update()中处理输入。

处理GUI的on_gui(),每帧调用,所有相关代码都应放在这里。

核心代码基本都放在fixed_update()和on_gui()中,传递变量值也通常是在这两个函数之间,然后来说说为什么使用全局变量传递值是非实时的:由于帧生成时间和fixed_update()的时间间隔不同步,且会在很大范围内波动,因此在fixed_update()中修改的变量值并非立刻体现在on_gui()中,反之同理。如果电脑性能较好、帧率足够高,这里的延迟不很明显;但低帧率或卡顿时,就很有必要注意这里的延迟。尤其注意一种情况:假设帧率只有25FPS,则平均而言on_gui()执行一次,fixed_update()已执行四次,那么fixed_update()对全局变量的前三次修改都是无效的,因为on_gui()只会读取最近一次的变量值。

接下来以视频中的轰炸机脚本为例,讲讲具体功能的实现:

全局部分的代码很好理解,参考注释即可:

然后是fixed_update()中的几个代码块:

1 输入

读取各输入轴或按键的值,轴或按键的定义可以查表。

2 投弹控制

由于使用手机/手柄/摇杆操作,我们肯定希望只用一个投弹键,因此用这一块代码来判断按键时投哪一颗弹。

3 弹道计算

数学原理就是视频中的方程,向量操作的相关代码可以查手册。

GUI部分的几块代码:

1 文本显示

使用Label很简单地显示一下速度和高度信息。

2 弹道绘制

投机取巧地用Label来绘制弹道,效果还不错(笑)。将全局数组中的采样点世界坐标映射到屏幕坐标后,在对应位置放一个Label就搞定了。

3 舵面/油门状态

slider()其实是有返回值的,可以用鼠标改变滑条值。但由于我们这里不需要用鼠标控制,所以直接不要返回值。

4 toggles

是否显示弹道的开关、切换挂架。挂架选择的逻辑稍微有一点复杂,因为需要三个toggle联动。

虽然这架轰炸机功能简单、代码量也不大,但作为一个入门例子还是绰绰有余的。如果你有兴趣在作品中使用Lua脚本mod,我相信这个例子可以帮助你快速上手。

当然,由于本人并非专业游戏开发者,以上内容都是个人经验之谈,有纰漏或不足之处欢迎指出,感谢你的阅读!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3