问题描述
当用户点击平面时,我可以添加新的 scnplane.但是现在,点击同一个 scnplane 它会再次添加新的 scnplane 而不是删除.
I can able to add new scnplane when user tap on plane. But now, tap on same scnplane it adds again new scnplane instead of removing.
最初检测到参考图像时,它会在菜单卡的侧面列出蛋糕,其中包含图像、名称和评级.用户点击评级,它会列出用户评级.
Initially when reference image is detected , It will list cake in side of menu card with image, name and ratings. And user tap on rating, it will list user ratings.
这是我试过的代码:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
//1. Get The Current Touch Location & Perform An ARSCNHitTest To Check For Any Hit SCNNode's
guard let currentTouchLocation = touches.first?.location(in: self.sceneView),
let hitTestNode = self.sceneView.hitTest(currentTouchLocation, options: nil).first?.node else { return }
if let lableName = hitTestNode.name {
print("touch working")
if lableName == "lableNode"{
makeCakeOnNode(hitTestNode)
} else if lableName == "AllLabelNode" {
makeCakeOnNode1(hitTestNode)
} else if lableName == "fruitNode" {
makeCakeOnNode2(hitTestNode)
}
}
}
func makeCakeOnNode(_ node: SCNNode){
let planeGeometry = SCNPlane(width: 0.18 , height: 0.15)
planeGeometry.firstMaterial?.diffuse.contents = UIColor.black.withAlphaComponent(0)
planeNode0 = SCNNode(geometry: planeGeometry)
planeNode0?.runAction(SCNAction.moveBy(x: -0.2, y: -0.15, z: 0, duration: 0))
let overlayNode = self.getNode(withImageName: "menu")
print("overlay::\(overlayNode)")
let newPlane = SCNPlane(width: 0.15, height: 0.10)
newPlane.firstMaterial?.diffuse.contents = UIImage(named: "cake_detail")
let newPlaneNode = SCNNode(geometry: newPlane)
newPlaneNode.eulerAngles.x = -.pi / 2
newPlaneNode.runAction(SCNAction.moveBy(x: -0.2, y: -0.15, z: 0, duration: 0))
node.addChildNode(planeNode0!)
planeNode0?.addChildNode(overlayNode)
planeNode0?.addChildNode(newPlaneNode)
if planeBool == true {
planeNode1?.isHidden = true
planeNode2?.isHidden = true
planeNode0?.isHidden = false
planeBool = false
} else {
print("plane removed")
planeNode0?.isHidden = true
planeNode1?.isHidden = true
planeNode2?.isHidden = true
planeBool = true
}
}
推荐答案
您可以使用的一种方法是为您添加的每个节点创建一个全局变量,例如:
One approach you can use, is to create a global variable for each of the nodes you are adding e.g:
var labelNode: SCNNode?
var allLabelNode: SCNNode?
var fruitNode: SCNNode?
然后你可以进行一个测试,看看它们是否是nil
.如果节点是 nil
,则创建它,否则将其删除,例如:
Then you can perform a test to see if they are nil
. If the node is nil
, then create it, else remove it e.g:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
//1. Get The Current Touch Location & Perform An ARSCNHitTest To Check For Any Hit SCNNode's
guard let currentTouchLocation = touches.first?.location(in: self. self.sceneView),
let hitTestNode = self.sceneView.hitTest(currentTouchLocation, options: nil).first?.node
else { return }
//2. Enumerate The Nodes We Have By Name
switch hitTestNode.name {
case "lableNode":
//1. If The LabelNode Doesnt Exist Create It
if labelNode == nil{
//Create The Node Here
}else{
labelNode?.removeFromParentNode()
labelNode = nil
}
case "AllLabelNode":
//2. If The LabelNode Doesnt Exist Create It
if allLabelNode == nil{
//Create The Node Here
}else{
allLabelNode?.removeFromParentNode()
allLabelNode = nil
}
case "fruitNode":
//3. If The LabelNode Doesnt Exist Create It
if fruitNode == nil{
//Create The Node Here
}else{
fruitNode?.removeFromParentNode()
fruitNode = nil
}
default:
return
}
}
请注意,Touches 方法可能应该重构,但它应该足以为您指明正确的方向......
Please note that the Touches method should probably be refactored, but it should be more than enough to point you in the right direction...
这篇关于再次触摸时如何删除scnplane?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!