
Tutorial_MoreComplex — 下拉框与 Lua 表格操作与 HelloWorld 最大的不同Dropdown 的 options 数据源MoreComplex 引入了一个新组件Dropdown下拉框它需要两种数据数据作用消费方式data.options下拉列表的选项内容DropdownOptionsAdapterDataConsumerLuaTabledata.select当前选中的索引从 0 开始DropdownAdapterDataConsumerint DataProducerintdata.options 有什么用data{options{vegetables,meat},-- 下拉列表显示的内容select0,-- 当前选中第 0 项vegetables}data.options是一个 Lua table会被DropdownOptionsAdapter消费publicclassDropdownOptionsAdapter:AdapterBaseDropdown,DataConsumerLuaTable{publicLuaTableValue{set{Target.options.Clear();value.ForEachint,string((k,v){Target.options.Add(newDropdown.OptionData(v));});}}}引擎绑定时的数据流初始化: observe:getter(options)(data) → {vegetables, meat} → DropdownOptionsAdapter.Value LuaTable → Dropdown 显示 vegetables、meat 两个选项 用户选中第二项 meat: → DropdownAdapter.OnValueChange(1) ← 索引从 0 开始 → data.select 1 写回响应式数据 → computed.message 里读取 options[data.select 1] → meat没有 BindTo那怎么绑定的data.options并不需要写 BindTo 字符串。它的绑定是通过DropdpownOptionsAdapter 本身继承自 AdapterBase来完成的。查看 AdapterBase.cspublicclassAdapterBase:MonoBehaviour{[TextArea]publicstringBindTo;}所以 DropdownOptionsAdapter 也能设置 BindTo。实际上在场景中你需要给它设置BindTo options。而data.select则由另一个 DropdownAdapter同样挂载在 Dropdown 上设置BindTo select。注Dropdown 组件上挂了两个适配器 — 一个 DropdownOptionsAdapterBindTo “options”负责选项列表一个 DropdownAdapterBindTo “select”负责选中值和交互。add_option 命令为什么需要 observeable.raw这是第二个关键不同。命令里操作 Lua 表格时有个坑add_optionfunction(data)localtmpobserveable.raw(data.options)-- 先解包成普通表table.insert(tmp,Option #..(#tmp1))-- 操作普通表data.optionstmp-- 赋值回去触发响应end,为什么要 rawdata.options被observeable.new()包装过是个带 metatable 的响应式对象。Lua 的table.insert对这种表不生效它操作的是 metatable 背后隐藏的_obj不会触发 __newindex。所以步骤必须是这样data.options (响应式表) → observeable.raw() → tmp (普通 Lua 表可正常操作) → table.insert(tmp, Option #3) → tmp {vegetables, meat, Option #3} → data.options tmp (赋值回去触发 __newindex → UI 刷新)如果跳过observeable.raw直接table.insert(data.options, ...)数据改了但 UI 不会更新。场景设置要点在 MoreComplex 场景的 Canvas 下你需要GameObject适配器BindToDropdownDropdownAdapterselectDropdownDropdownOptionsAdapteroptionsTextTextAdaptermessageButton添加选项ButtonAdapteradd_option下拉框绑定了两个适配器一个管选项内容、一个管选中索引。总结概念说明data.options下拉框的选项数据源被 DropdownOptionsAdapter 消费data.select选中索引DropdownAdapter 双向绑定observeable.raw()操作响应式 Lua 表前必须先解包改完再赋回去