lumiogames/lgui
v0.3.0PolyForm-Shield-1.0.0
Agent-authored, browser-first FairyGUI UI workflows with shared TypeScript and Unity/PuerTS migration.
更新记录
0.3.0(未发布)
和 0.2.0 不兼容:目录结构、命令行、框架都是新的。0.2.0 的全部内容在 tag v0.2.0-final 里。
许可
- 许可从 MIT 改成 PolyForm Shield 1.0.0,另加 LumioGames 的附加许可和商标说明(见
LICENSE)。可以用 LGUI 做游戏、应用、网站,包括商业产品;不能拿它或改过的版本做 UI 框架、UI 工具、UI 编辑器、游戏开发工具这类竞品,也不能改名换皮重新发布。LGUI、Lumio、LumioGames 的名字和图标不在授权里。换许可之前按 MIT 发布的提交和版本仍按 MIT。
安装和工程
- 发布面只有
plugin/;Claude Code、Codex 用仓库里的 marketplace 安装,其他客户端直接用plugin/目录。 - 用户机器上只需要 Node 24 或更高和 Chrome / Edge;TypeScript、esbuild、OpenFairyGUI 0.7.0、sharp、playwright-core 随插件提供(macOS arm64 / x64、Linux x64、Windows x64)。
- 用户工程:
ui/(FairyGUI 格式,界面的唯一来源)、src/、tests/、i18n/、.lgui/(工程配置、框架副本、生成物)。
命令行(node <插件目录>/tools/lgui.mjs)
init、doctor、dev(改动后自动刷新)、check(TypeScript + UI / MVC / 多语言规则)、test(headless 后端、假时钟;测试文件没跑起来也算失败)、verify(6 组尺寸 × 横竖,--lang、伪翻译)、ui list、new module、new view(四种排布模式)、i18n extract、art split、upgrade、editor、editor props、unity export --to <Unity 工程>。- 所有命令支持
--json;错误都带错误码(LGUI-CLI-xxx、LGUI-RT-xxx、LGUI-UI-xxx、LGUI-MVC-xxx),见references/error-codes.md。报错里的文件一律写相对工程根目录、用/的路径。 check的规则:MVC-001 不再误报工程里自己声明的location、window这类同名变量和参数;只有 View 的keys表里的hint算文本键;没写fontSize的文字按默认 12 号查 UI-011;UI-017 也查装载器的url和按钮的icon;UI-020 同包引用不再警告。新规则:gearText 里写了用户能看到的文字(UI-060)、按钮直接绑控制器(UI-061)、翻译和原文一字不差(UI-062,警告)、横竖两版的固定文字不一样(UI-063,警告)、全屏界面没有safe(UI-064)、音效不存在、没登记或不是 mp3(UI-065)、View 里直接改控件属性(MVC-020,警告)。verify:同一个画面只截一次(默认 8 张);按尺寸的safeArea模拟刘海。new module:Model 和子项的代码里不写死文字,用文本键并补进文本表;全屏排布模式的骨架带safe,贴边的控件关联到它。
框架
- MVC:
lgui.Model+pick、View / ItemView / PartView 和绑定表、Controller、Service、lgui.request。 - UIManager:hud、page、popup、modal(队列)、toast 五层,激活和遮挡,
onClose交回结果,资源引用计数和关闭界面缓存。 - 横竖屏:按方向自动换
@portrait版本,View 实例保留。 - UIManager 的边界情况:modal 按打开的先后排队,前一个打开失败或被取消时照常放出下一个,loading 不参与排队;
lgui.confirm一次显示一个,总会有结果(被取消当false);popTo、closeAll最后只重算一次激活;返回键不关hud层;对打开着的界面再登记onClose报LGUI-RT-084。 - 旋转、换语言重建时 PartView 实例保留,通用弹窗的文字换成新语言;安全区:全屏界面的
safe子控件摆进安全区,弹窗放在安全区正中,测试用t.setSafeArea。 - 输入:手势(点击、双击、长按、拖拽、滑动、双指缩放、滚轮、悬停)、按键动作、返回键、操作提示栏、输入类型。
- 动效:动效名当绑定表的键(
playing、play、done),ui/里的自动播放照旧;被全屏界面盖住时暂停,界面关闭时停掉;headless 按ui/里写的时长走假时钟。 - 拖放(游戏式):
dragData、dragIcon、drop;拖起时有跟手的临时图标,松在drop上才调用 Controller;测试用t.dragTo(从哪, 到哪)。 - 多语言:
lgui.t、复数、格式化、运行时切换语言、带字图片、伪翻译。 - 定时器(跟着界面暂停和取消;回调出错时照常报错,不影响别的定时器和以后的帧)、广播站、红点、按钮音效、图片占位、通用弹窗(提示、确认、加载中)、ArtText 美术字、
lgui.time.wait。 - 后端:h5(FairyGUI-dom,带补丁)、headless(测试用)、Unity(FairyGUI-unity + PuerTS);共享一致性用例和快照捕获器。
- 控件:标签、滑动条(
value+change)、下拉框(items/selected/select)、序列帧动画(playing)、树(和列表同样的词);输入框加input(输入法选字时不触发);测试加t.type、t.setValue、t.choose、t.value、t.playing。 - headless 模拟显示齿轮(
gearDisplay、gearDisplay2)和组,t.visible在两个后端上都是「真的显示」;wheel只认落在这个控件上的滚动;网页端不可用的控件在 FairyGUI 重新挂元素以后仍然点不到。 - 报错分三类:代码或界面写错了 → 抛错并记
error(开发和测试里抛,正式构建里只记日志、界面照常显示);外部失败 → 不抛,交回给代码,记warn;正常的先后顺序 → 记info。缺文本键、加载器的图片包没加载、ArtText 缺字符、没有Common/ActionHintBar、没配i18nBase就换语言都不再默默跳过;lgui test里记了error日志的测试判失败。开发模式由打包时的LGUI_DEV决定。 lgui.log(debug/info/warn/error/child,形状和 Lumio 引擎的Logger一样);lgui.app({ platform: { log, audio } })只换给出的平台服务。- 界面声音:View 的
static music(栈里最上面写了的界面决定,同一首接着放,换曲淡入淡出,切到后台暂停,解锁后才放)、ui/里按钮的音效(volume="0"不出声,没写用sounds.click)、lgui.sound.play、音乐和音效两个声道的音量和静音(lgui.sound.settings能用pick读,自动存进本地存储);mp3 登记在ui/的包里,网页界面包带上它们;测试里t.sounds()、t.music()。 lgui.time.wait和请求超时用同一个按帧等待。- 界面被盖住时,里面的部件(PartView)和列表子项(ItemView)的定时器也暂停,露出来接着走。
- 下拉框弹出的列表可以放在别的包里:生成包依赖时算上
dropdown指向的包。 lgui i18n extract也提取标签的固定标题和下拉框的固定选项(<控件名>@item<j>);headless 换语言时选项跟着翻译。- 一致性测试:网页一侧接上
t.dragTo、t.setSafeArea,加了拖放用例;Unity 开发运行器接上t.dragTo、t.setValue、t.choose。 - Unity 开发一致性运行器接上
t.type:聚焦后全选、逐字输入和退格清空;中文输入法选字过程未覆盖。 - H5 手势保留 DOM 输入实际发生的时间,避免主线程延迟把慢拖误成快滑;浏览器一致性测试按指定坐标和真实间隔派发触摸,不逐步等待驱动应答,不让应答迟到拉长动作。
Unity
- Unity 开发一致性运行器接上
t.setSafeArea:注入屏幕像素边距,下一帧通知界面重排,未注入时使用宿主安全区。 - Unity 6000.6.x + PuerTS Core/V8 3.0.3 本地包。
unity export核对固定文件摘要,应用四处 Unity 6.6 兼容补丁,安装 Unity 包并生成启动场景;已有场景保留。 - 同一份
ui/、src/、i18n/生成 Unity 界面包、图集、翻译和game.js.txt,放入Assets/LGUI/Resources/;同时导出Assets/LGUI/link.xml保留动态调用。upgrade同步已配置的 Unity 包。 - Unity 适配层连接控件、列表、控制器、动效、原始输入和平台服务;图片请求共享和释放跟随宿主、控件生命周期。WebSocket 暂未实现,明确报告
LGUI-RT-001。 - 生成 UI 图集由包内 Editor 导入器关闭 mipmap,范围限定为有对应界面包的 LGUI 图集。
- 修复 ArtText 改字后旧字符图片未释放、Unity 父界面递归销毁后子容器仍被记录;列表写入不同滚动目标时同步提交,避免旧惯性覆盖重建前的位置;普通 modal 并发申请按 FIFO 排队,前项失败或取消不会阻塞后项。
- Unity HTTP 启动的同步失败明确结束 Fetch、图片和音频请求;宿主关闭后的旧回调隔离。背包示例的领奖图标通过真实 PartView 组件声明图片包依赖,确认弹窗保留文本键与参数以随语言重建。
- Unity 适配层跟上本版的新接口:标签、滑动条、下拉框、序列帧动画、树,动效的
playing/play/done,拖放落点、滚轮只认落在控件上的事件、t.visible的「真的显示」;日志出口和引擎的Logger同形;声音由LGUI.Platform自己的 AudioSource 放(背景音乐淡入淡出、暂停),关掉 FairyGUI 自己的按钮音和动效音,和网页一致。功能、快照和可视像素按实际用例分别验收。 - IL2CPP 使用 PuerTS Reflection Mode 生成必需原生桥,不依赖类型静态 wrapper。Unity 接入文档和技能包含本地安装、导出、Release 打包、横竖屏检查及错误处理。
编辑器
plugin/editor/:FairyGUI Editor Online 编译版,换成 LGUI 品牌;lgui editor打开它并提供实时会话中转,每次打开都从ui/重新读取(不含art-src/);lgui editor props在编辑器开着时改控件属性。lgui editor用固定端口(工程配置editorPort,默认 4174,被占用时报LGUI-CLI-110),浏览器记得住授权过的ui/文件夹;中转只转发query和transact;中转和lgui dev的服务都只认 Host 是127.0.0.1:<端口>的请求。
规范和技能
references/:UI 开发规范、MVC 开发规范、用户工程目录、错误码、接入 Unity。- 技能:
lgui-setup、lgui-ui、lgui-code、lgui-verify、lgui-unity。
示例
examples/inventory/:用新框架重写的背包示例(营地、背包、商店、领奖),用到框架的每一项功能。- 背包示例的普通按钮默认播放程序合成的短点击音(
Common/click.mp3),网页和 Unity 使用同一份资源。 - 背包示例的网页版发布在 GitHub Pages:https://lumiogames.github.io/LGUI/ 。仓库的
scripts/build-demo.mjs做静态正式构建,.github/workflows/pages.yml在 main 更新时部署。为此lgui dev生成的页面改用相对路径(./app.js、./ui、./i18n),自动刷新只在lgui dev里加;正式构建不挂调试面板用的window.__lgui。 - 网页后端在 Safari 里打不开的问题:FairyGUI-dom 用的扩展内置元素(
extends: "div")WebKit 不支持,iPhone 上所有浏览器(包括微信)和 Mac 上的 Safari 都报ele.init is not a function。改成独立自定义元素(补丁 5,见framework/backends/h5/vendor/PATCHES.md)。