##はじめに
タップされるたびにnodeを新しく配置するのではなく、二回目以降のタップでnodeを置き換える方法を共有します。replaceChildNodeなどの方法があるようですが、理解できなかったため他のやり方で代替しています。
アドバイス等があれば是非コメントください。
Instead of placing a new node on every tap, I'll share how to replace the node on the second and subsequent taps. replaceChildNode and other methods seem to be available, but I didn't understand them, so I'm using other methods to replace them.
If you have any advice, please comment.
##大まかな前提・流れ
- nodeには名前をつけることが可能で、その名前を持つnodeがsceneにあるかどうか判定することができる
- nodeを削除するメソッド -> nodeを作成するメソッドを一つの関数に入れることで、置き換えを表現することができる。
###nodeに名前をつける方法
let box = SCNBox(width: 0.05, height: 0.05, length: 0.05, chamferRadius: 0)
let boxNode = SCNNode(geometry: box)
boxNode.name = "box" //"box"という名前をつけた
print(boxNode.name ?? "") //box
self.sceneView.scene.rootNode.addChildNode(boxNode)
boxというgeometryを作成し、boxNodeに入れています。
boxNode.name = "box"
で名前をつけています。
一応テストとして名前を標準出力させています。
###sceneにboxという名前のnodeがある場合のみ行われる処理
if (self.sceneView.scene.rootNode.childNode(withName: "box", recursively: true) != nil) {
self.sceneView.scene.rootNode.enumerateChildNodes{ ( node,stop )in
node.removeFromParentNode()
}
//2回目以降呼ばれる
}
childNode(withName: )につけた名前を設定することで、sceneにnodeがあるかどうか判定してくれます。
そしてそのifの中に、nodeを消去する処理を書いています。
####上記を一つの関数として記述する
func createBox(hitTestResult: ARHitTestResult){
if (self.sceneView.scene.rootNode.childNode(withName: "box", recursively: true) != nil) {
self.sceneView.scene.rootNode.enumerateChildNodes{ ( node,stop )in
node.removeFromParentNode()
}
//2回目なら呼ばれる
}
let box = SCNBox(width: 0.05, height: 0.05, length: 0.05, chamferRadius: 0)
let boxNode = SCNNode(geometry: box)
boxNode.name = "box"
print(boxNode.name ?? "")
self.sceneView.scene.rootNode.addChildNode(boxNode)
}