当前位置: 首页 > news >正文

基于MVVM框架的XUUI 纯C#命令模式教程

Tutorial_NoLua — 纯 C# 命令模式

与 HelloWorld 最大的不同:不用写 Lua

NoLua完全不写 Lua 脚本,命令和数据操作全在 C# 中完成。

context=newContext();// 无参数,空的 Lua tablecontext.AddCSharpModule("NoLua",this);// 把 C# 方法注册为命令context.Attach(gameObject);

AddCSharpModule 做了什么

ViewModel.cs:140-151 中,它通过反射找到所有带[Command]特性的方法:

publicvoidAddCSharpModule(stringmoduleName,objectmodule){varmethods=module.GetType().GetMethods(...);foreach(varcmdinmethods.Where(m=>m.IsDefined(typeof(CommandAttribute),false))){commandSetter(options,moduleName,cmd.Name,module);}}

commandSetter在 Lua 侧执行(ViewModel.cs:47-56):

-- Lua 内部等价逻辑options.data["NoLua"]={}-- 创建模块数据表options.commands["NoLua.Foo"]=function(...)-- 注册命令obj.Foo(...)endoptions.commands["NoLua.Bar"]=function(...)obj.Bar(...)end

所以 BindTo 规则变为:"模块名.方法名"


Interface 参数的绑定

这是最核心的机制。看两个命令的签名:

[Command]publicvoidFoo(Interface1data){Debug.Log(string.Format("NoLua.Foo, got name: {0}",data.name));data.name="Foo";}

Interface1定义在 SomeClass.cs:

publicinterfaceInterface1{stringname{get;set;}}

当按钮触发NoLua.Foo命令时,XLua 自动做了一层接口代理

Button 点击 → commands["NoLua.Foo"](options.data["NoLua"]) ↓ XLua 把 LuaTable 包装成 Interface1 代理 ↓ Foo(Interface1 data) 被调用 ↓ data.name → 读写的都是 Lua 表的 name 字段

所以data指向的就是 Lua 模块数据表options.data["NoLua"]。你在 C# 里读写data.name,等价于在 Lua 中读写data.NoLua.name,并且会经过响应式系统触发 UI 刷新。


场景设置

对应的 UI 绑定关系(推测):

GameObject适配器BindTo作用
TextTextAdapter"NoLua.name"显示 name 值
InputFieldInputFieldAdapter"NoLua.name"输入 name
Button(Foo)ButtonAdapter"NoLua.Foo"触发 Foo 命令
Button(Bar)ButtonAdapter"NoLua.Bar"触发 Bar 命令
DropdownDropdownAdapter"NoLua.select"选择项索引

BindTo 的规则变成了"模块名.字段/属性""模块名.方法名"


完整数据流

用户点击 "Foo" 按钮 → ButtonAdapter.OnAction() → commands["NoLua.Foo"](options.data["NoLua"]) → XLua 接口代理 → Foo(Interface1 data) 被调用 → Debug.Log(data.name) ← 读取 data.NoLua.name → data.name = "Foo" ← 写入 data.NoLua.name → 响应式系统触发 → 关联的 Text 自动更新显示 → InputField 自动更新内容

HelloWorld vs NoLua 对比

HelloWorldNoLua
ViewModel 定义Lua table 内联C# 类 +[Command]特性
数据源data.info.nameoptions.data["NoLua"](自动创建)
BindTo 示例"message""click""NoLua.Foo""NoLua.name"
命令参数Lua function 接收 dataC# 方法接收 Interface 参数
适用场景快速原型、动态逻辑已有 C# 代码复用、类型安全

要点总结

  1. new Context()创建空的 Lua ViewModel,不执行任何脚本
  2. AddCSharpModule("NoLua", this)通过反射 + XLua 桥接,把[Command]方法注册到 Lua 命令表
  3. 命令参数中的Interface1/Interface2由 XLua 自动代理,读写接口属性就是读写 Lua 响应式数据
  4. BindTo 统一使用"模块名.路径"格式
http://www.jsqmd.com/news/1177142/

相关文章:

  • 2026昆明艺考美术冲刺课程全盘点:正规合规优秀机构实力筛选、课程价值深度解析与选报避坑指南FAQ - 云南美术头条
  • 打卡信奥刷题(3439)用C++实现信奥题 P10334 [UESTCPC 2024] 饮料
  • 浙江万里学院靠谱吗?—— 从办学资质到综合实力的全面解析 - 好物分享知识传播
  • 2026国内汽车网络安全合规服务商综合实力排行|ISO/SAE21434全栈落地实效横向盘点 - 互联网科技品牌测评
  • 亲身到店探访杭州亨得利官方名表服务中心|网点地址与官方客服热线(2026年7月更新) - 亨得利官方
  • 团队协作中的技术栈选择:平衡效率与可维护性
  • 2026国内汽车功能安全服务企业综合排行|全栈落地能力横向深度对比 - 互联网科技品牌测评
  • 2026年7月最新嘉兴宝珀官方售后客户服务电话及线下网点地址 - 宝珀官方售后服务中心
  • 伯爵官方服务项目及价格查询|全新电话和完整维修地址权威信息通知(2026年7月最新) - 亨得利钟表维修中心
  • Flipper Zero Authenticator终极指南:如何在便携设备上实现专业级两步验证?
  • Kimi LeetCode 3533. 判断连接可整除性 Java实现
  • 上海长宁区劳力士腕表回收哪家报价高?正规渠道怎么选不吃亏 - 沪上贵金属口碑推荐官
  • GPT-Image-2 制作 3D二次元动漫人物提示词
  • 2026年7月最新亨得利官方钟表服务中心|官方电话和网点地址权威信息通告 - 亨得利官方博客
  • Jenkins持续集成完整落地原文(补全)
  • 浙江万里学院中德联合学院硕士项目 —— 自主招生、双学位?教育部认证政策详解 - 好物分享知识传播
  • linux笔记归纳8:库制作与原理
  • 使用Nginx中配置CRL
  • draw.io桌面版Linux构建解决方案:跨平台打包技术与安全隔离架构
  • 语音转文字工具AsrTools:让音频整理变得简单高效
  • 蓝速科技鸿蒙信创终端全场景落地实效展示
  • 61-LangChain-vs-LlamaIndex-选型对比-功能矩阵-混用实践
  • 2026年洛阳水磨石地砖生产厂商综合实力榜单及选购指南 - 热点品牌推荐
  • 质量管理四大核心活动详解:从策划到改进的完整闭环
  • 北京5天4晚定制游旅行社推荐榜单TOP5发布2026年7月:市场格局服务演进与选型框架 迈富时研究院 - 优企名品
  • 浙江研究生自主招生学校推荐|浙江万里学院中德硕士项目完整报考指南 - 好物分享知识传播
  • 亲身到店探访合肥亨得利官方名表服务中心|全部网点地址及电话(2026年7月更新) - 亨得利官方
  • Perfsee基准测试实战:提升前端应用响应速度的10个技巧
  • 5分钟掌握说话人日志技术:pyannote.audio终极实战指南
  • 江诗丹顿中国官方售后服务中心|服务热线及详细地址权威信息公告(2026年7月更新) - 江诗丹顿官方服务中心