You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 02:15:05