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

如何在iOS SceneKit中获取点击SCNNode的对应索引

获取SceneView中点击立方体的索引

要实现点击立方体获取对应的数组索引其实很简单,基于你现有的代码只需要做一点小修改就行,核心思路是利用你存储所有立方体节点的ArrBoxNode数组来查找命中节点的位置。

具体步骤:

  1. 确保数组维护正确:你已经在创建每个立方体节点时把它添加到ArrBoxNode里了,这一步没问题,要保证这个数组是可变数组(比如NSMutableArray *ArrBoxNode = [NSMutableArray array];),这样才能正常添加元素。

  2. 在点击事件中获取索引:
    在你的touchesBegan方法里,拿到命中的hitNode后,直接用数组的indexOfObject:方法就能得到它的索引。不过要注意先判断hitTestResult是否存在,避免空指针崩溃。

修改后的touchesBegan代码如下:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint touchPoint = [touch locationInView:gameVW];
    // 先判断是否有命中结果
    NSArray<SCNHitTestResult *> *hitResults = [gameVW hitTest:touchPoint options:nil];
    if (hitResults.count > 0) {
        SCNHitTestResult *hitTestResult = hitResults.firstObject;
        SCNNode *hitNode = hitTestResult.node;
        
        // 从数组中获取节点的索引
        NSUInteger cubeIndex = [ArrBoxNode indexOfObject:hitNode];
        // 这里要注意:如果节点不在数组里,indexOfObject会返回NSNotFound,所以要做判断
        if (cubeIndex != NSNotFound) {
            NSLog(@"点击的立方体索引是:%lu", (unsigned long)cubeIndex);
            // 这里可以处理你的业务逻辑,比如根据索引做对应操作
        } else {
            NSLog(@"点击的不是数组中的立方体节点");
        }
    } else {
        NSLog(@"没有命中任何节点");
    }
}

额外说明:

  • 如果你的立方体节点有子节点,点击时可能命中的是子节点而不是你存在数组里的父节点,这时候可以通过hitNode.parentNode来向上查找,直到找到数组中的节点。比如:
    SCNNode *currentNode = hitTestResult.node;
    while (currentNode && ![ArrBoxNode containsObject:currentNode]) {
        currentNode = currentNode.parentNode;
    }
    if (currentNode) {
        NSUInteger cubeIndex = [ArrBoxNode indexOfObject:currentNode];
        // 处理逻辑
    }
    
  • 确保ArrBoxNode的生命周期和你的ViewController一致,不要提前释放,否则会导致查找失败。

这样就能准确获取到你点击的立方体对应的数组索引啦!

内容的提问来源于stack exchange,提问作者user8579808

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:07:31