【BESIEGE】Lua脚本mod入门 |
您所在的位置:网站首页 › besiege地形mod › 【BESIEGE】Lua脚本mod入门 |
在视频里讲编程不太现实,因此写一份简单的代码讲解,配合视频、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 |