如何在iOS SceneKit中获取点击SCNNode的对应索引
获取SceneView中点击立方体的索引
要实现点击立方体获取对应的数组索引其实很简单,基于你现有的代码只需要做一点小修改就行,核心思路是利用你存储所有立方体节点的ArrBoxNode数组来查找命中节点的位置。
具体步骤:
确保数组维护正确:你已经在创建每个立方体节点时把它添加到
ArrBoxNode里了,这一步没问题,要保证这个数组是可变数组(比如NSMutableArray *ArrBoxNode = [NSMutableArray array];),这样才能正常添加元素。在点击事件中获取索引:
在你的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
相关产品推荐
相关产品推荐

