Spark AR Native UI Picker如何禁用选中项外的其他选项
Spark AR 基于Native UI Picker实现选项彻底禁用方案
你当前遇到的隐形碰撞bug,本质是Spark AR场景对象的hidden属性仅控制渲染可见性,不会自动停用碰撞体、挂载脚本、动画等运行逻辑,仅切换可见性必然会出现后台逻辑残留。
实现思路
不要单独控制每个元素的显隐,给每个选项配置独立的根父节点——单个选项对应的所有敌人、碰撞体、特效、逻辑脚本全部挂载到对应根节点下,方便统一管控。选中Picker选项时,除了显隐切换,同步管控所有运行态属性,从根源停掉非选中项的逻辑。
具体操作步骤
- 提前在场景中整理节点结构:4个选项分别对应
option0_root、option1_root、option2_root、option3_root四个空父节点,对应Native UI Picker的0-3索引,把每个选项的所有游戏资源放到对应父节点下 - 在脚本中绑定4个根节点的引用,监听Native UI Picker的选中索引变化事件
- 选中事件触发后遍历所有根节点,对选中/非选中项分别做状态处理:
- 选中项:恢复正常位置、设为可见、开启所有碰撞体、启用所有挂载脚本、播放动画/特效
- 非选中项:设为不可见、直接关闭所有碰撞体的检测开关、禁用所有挂载脚本、停止所有动画/特效、将节点坐标移出玩家碰撞范围(比如Y轴设为-1000,做兜底防护)
可直接复用的代码参考
const Scene = require('Scene'); const NativeUI = require('NativeUI'); const picker = NativeUI.picker; // 脚本属性面板绑定4个选项根节点 const optionNodes = [ await Scene.root.findFirst('option0_root'), await Scene.root.findFirst('option1_root'), await Scene.root.findFirst('option2_root'), await Scene.root.findFirst('option3_root') ]; // Picker选中监听 picker.selectedIndex.monitor().subscribe((evt) => { const activeIndex = evt.newValue; optionNodes.forEach((node, idx) => { // 获取当前节点下的所有功能组件 const colliders = node.getComponents('Component.Collider'); const logicScripts = node.getComponents('Component.Script'); const anims = node.getComponents('Component.AnimationPlayable'); if (idx === activeIndex) { // 激活当前选项 node.hidden = false; node.transform.y = 0; colliders.forEach(col => col.enabled = true); logicScripts.forEach(s => s.enabled = true); anims.forEach(a => a.play()); } else { // 彻底停用非选中选项 node.hidden = true; node.transform.y = -1000; colliders.forEach(col => col.enabled = false); logicScripts.forEach(s => s.enabled = false); anims.forEach(a => a.stop()); } }) })
避坑提示
- 如果选项逻辑包含动态生成的敌人/道具,停用非选中项时要同步清空对应对象池的所有生成实例,避免残留对象触发碰撞
- 不要零散控制单个元素的状态,所有同选项资源挂在统一根节点下,能避免漏关组件导致的隐形bug
内容的提问来源于stack exchange,提问作者Leonardo Rafael
相关产品推荐
相关产品推荐

