11

主题

10

回帖

649

积分

优秀创作者

积分
649
发表于  2023-6-25 15:36:43 | 显示全部楼层 |阅读模式 4762 12
本帖最后由 大乌龙球#3504 于 2023-6-25 15:41 编辑

Y3 是一款 ECA 逻辑层运行在 python 虚拟机上图形化的游戏编辑器。为了安全性考虑、吸收war3地图作者、易于学习和高性能等各方面考虑,Y3 采用了 lua 作为其脚本语言。


本文意在帮助零基础的读者,系统性的学习如何运用 lua
本文将从 lua 的基础语法开始,一步步的带领读者学习 lua 的各种语法,最后将 lua 的各种语法应用到 Y3 的开发中。

=============【为何要在Y3中,使用脚本语言开发=============

Y3 为了提供更好的 UGC 能力,主要将精力放在触发器的开发上。实际上现阶段在官方文档不全的情况下,使用 lua 开发,需要相当的经验,克服很多的 bug,才能达到预期的效果,那为何 lua 开发仍然是值得尝试的呢?

通常情况下,触发器可以非常简单的完成很多功能的开发,例如鼠标点击时,选中范围内所有属于玩家自己的单位,这个功能在触发器中只需要几个简单的步骤就可以完成。但是当遇到更复杂的逻辑,例如仇恨算法、随机生成,使用触发器虽然能做到,但是往往需要很多的步骤,而且很难保证代码的可读性。而使用 lua 开发,可以很方便的完成这些功能,而且代码的可读性也很高,并且lua逻辑的复用不依赖导出和导入,是可以沉淀积累的资产。
此外当涉及到大量的数据时,例如技能的数据,使用 lua 开发,可以很方便的完成数据的编辑,而且可以很方便的进行版本控制。
当遇到复杂的数学计算时,触发器就显得力不从心了,而 lua 可以很方便的完成这些功能。
并且,目前Y3当中的触发器,并不提供热更新的功能,而 lua 可以很方便的实现热更新,这样就可以在不重启游戏的情况下,完成游戏的更新,实时的进行开发-调试。

使用 Lua 编写游戏逻辑和交互的好处可总结为以下几点:

- 灵活性:使用编程语言可以更加灵活地控制游戏逻辑和交互,实现更加复杂的功能和效果。
- 可重用性:编写的 Lua 脚本可以在不同的游戏场景和项目中重复使用,提高了代码的可重用性。
- 可维护性:使用编程语言可以更加方便地维护和修改游戏逻辑和交互,避免了可视化工具的一些限制和不足。
- 可扩展性:使用编程语言可以更加方便地扩展游戏逻辑和交互,实现更加复杂的功能和效果。
- 可调试性:使用编程语言可以更加方便地调试游戏逻辑和交互,提高了调试效率。

=============【一切的开始——hello world=============

在正式开始学习 lua 语言之前,让我从一个实际的例子开始,让第一个 lua 程序跑起来,这样可以让读者对 lua 有一个直观的认识。

当前这个步骤,你只需要安装 Y3,Y3 提供了 lua 的运行环境,你暂时不需要配置开发环境,不需要安装任何的 IDE 或者编辑器,只需要安装 Y3 即可。

第一步:
1. 新建一个空地图,需要注意 UI模板部分需要选择“通用界面模板”或“英雄三国模板”,否则地图当中默认不会包含官方提供的 lua 框架(Y3框架),现阶段 Y3 框架是必须的,后续官方文档完善后,会有更多的选择。
1.png

2. 找到 lua 脚本的位置。Y3 地图是以文件夹的形式存储的,打开地图文件夹 —— 如果你记得自己创造在哪可以直接打开,如果不记得,可以点击编辑器菜单栏:文件 —— 在文件资源管理器中显示。地图目录下 script 目录,就 lua 脚本的存放位置。
2.png

3. 打开 main.lua,如果你没有安装合适的编辑器,系统会让你选择一个应用程序,在我们的第一步当中,选择记事本即可。  
可以看到 main.lua 中已经包含了一些代码,这些代码是 Y3 框架的一部分,我们不需要关心这些代码的含义,只需要知道这些代码是 Y3 框架的一部分即可。
在 require 'y3',下方添加 print('Hello, world!')
添加后,main.lua 如下
  1. require 'y3'

  2. print('Hello, world!')
  3. ---resource block start---
复制代码

4. 点击运行按钮,就可以在“日志”窗口看到输出的结果了。
3.png


恭喜你,完成了第一个 lua 程序的编写和运行。

下一期开始,我们将讲述如何安装一个合适的编辑器,以及如何配置开发环境。以便于我们更好的进行 lua 的学习和开发。

53

主题

102

回帖

2369

积分

精英创作者

积分
2369

夏日·活跃之王勋章

发表于  2023-6-25 16:03:42 | 显示全部楼层
下一期快发

0

主题

5

回帖

69

积分

普通创作者

积分
69
QQ
发表于  2023-6-25 18:28:43 | 显示全部楼层
支持下大佬,大佬加油

10

主题

10

回帖

580

积分

优秀创作者

积分
580

夏日·闪闪发光勋章

发表于  2023-6-27 13:00:25 | 显示全部楼层
我觉得lua最大好处是不怕编辑器崩溃(
  • 其实lua也能搞崩编辑器的,在初始化之前,实例化很多有实体的对象,都会导致闪退、白框
    2023-7-4 17:09

11

主题

10

回帖

649

积分

优秀创作者

积分
649
发表于  2023-7-4 17:09:29 | 显示全部楼层
霸鸽雪球#1001 发表于 2023-6-27 13:00
我觉得lua最大好处是不怕编辑器崩溃(

其实lua也能搞崩编辑器的,在初始化之前,实例化很多有实体的对象,都会导致闪退、白框

10

主题

10

回帖

580

积分

优秀创作者

积分
580

夏日·闪闪发光勋章

发表于  2023-7-4 19:05:36 | 显示全部楼层
大乌龙球#3504 发表于 2023-7-4 17:09
其实lua也能搞崩编辑器的,在初始化之前,实例化很多有实体的对象,都会导致闪退、白框 ...

不用担心编辑器崩了做的东西没了

0

主题

2

回帖

14

积分

普通创作者

积分
14
发表于  2023-7-7 12:35:24 | 显示全部楼层
异常: module 'y3' not found:
        no field package.preload['y3']
        no file 'E:\kkduizhan\Games\y3\game\LocalData\MapName001\script/y3.lua'
        no file 'E:\kkduizhan\Games\y3\game\LocalData\MapName001\script/y3.lua'
        no file 'E:\kkduizhan\Games\y3\game\LocalData\MapName001\script/y3.dll'
        no file 'E:\kkduizhan\Games\y3\game\LocalData\MapName001\script/y3.dll'
stack traceback:

0

主题

2

回帖

14

积分

普通创作者

积分
14
发表于  2023-7-7 12:50:08 | 显示全部楼层
require 'y3'
print('Hello, world!')
local angle=y3.get_random_angle()
print(tostring(angle))
---resource block start---

打印出来的
[Running] lua "e:\kkduizhan\Games\y3\game\LocalData\MapName001\script\main.lua"
'lua' �����ڲ����ⲿ���Ҳ���ǿ����еij���
���������ļ���

[Done] exited with code=1 in 0.063 seconds
怎么会看不到呢

13

主题

25

回帖

993

积分

优秀创作者

积分
993

夏日·闪闪发光勋章

发表于  2023-7-10 14:40:08 | 显示全部楼层
lua现在无法热更新吧,每次发布地图都是重新下载整个包体。

0

主题

2

回帖

20

积分

普通创作者

积分
20
发表于  2023-8-12 00:45:31 | 显示全部楼层
下一期,在哪里?
12下一页