如何解决SceneView中ModelNode子节点点击监听无响应问题?
onGestureListener = rememberOnGestureListener( onSingleTapUp = { _, node -> Log.d("NodeDebug", " onSingleTapUp Node: $node") true // 默认消费事件,导致子节点事件无法触发 } ), ...
)
## 解决方案 ### 1. 调整节点优先级,让子节点优先命中 SceneView的命中检测会优先选择**优先级数值更高**的节点。给目标子节点设置比父节点更高的优先级,确保射线检测先命中子节点: ```kotlin // 在设置子节点点击事件前添加 rewardNode.value.setPriority(10) // 父节点优先级为0,子节点设为更高值
2. 修改全局手势监听器,不消费事件
全局的onGestureListener如果返回true会消费事件,阻止事件传递给子节点。将返回值改为false,让事件继续向下传递:
ARScene( ... onGestureListener = rememberOnGestureListener( onSingleTapUp = { _, node -> Log.d("NodeDebug", " onSingleTapUp Node: $node") false // 不消费事件,允许子节点处理 } ), ... )
3. 确认子节点的可命中状态
确保子节点的isHitTestable属性为true(默认值为true,若手动修改过需恢复):
rewardNode.value.isHitTestable = true
4. 手动遍历命中节点(兜底方案)
如果上述方法无效,可以在全局手势监听器中手动获取所有命中的节点,找到目标子节点后执行逻辑:
ARScene( ... onGestureListener = rememberOnGestureListener( onSingleTapUp = { hitResult, _ -> // 获取所有命中的节点,按优先级排序 val hitNodes = hitResult.hits.map { it.node } // 查找目标子节点 val targetRewardNode = hitNodes.find { node -> experienceState.rewards.any { it.standardNode == node.name } } targetRewardNode?.let { Log.d("NodeDebug", "tapped RewardNode: $targetRewardNode") // 执行原点击逻辑 val reward = experienceState.rewards.find { it.standardNode == targetRewardNode.name } reward?.let { r -> r.display = RewardDisplay.VISIBLE onStateChange(experienceState.copy()) } } false } ), ... )
内容的提问来源于stack exchange,提问作者ofreezy
相关产品推荐
相关产品推荐

