私は、iOS 11(ベータ版)でARKitとSceneKitを使用してiOSアプリケーションを作成しています。SCNNodeに追加情報を保存する方法は?
このアプリケーションは、拡張現実シーンに多くのアイテムを追加します。これらの項目のそれぞれを識別するために、私はMySCNNodeとしてSCNNodeをサブクラス化し、それにid
フィールドを置く:
MySCNNode: SCNNode {
var id: Int
...some initializer to assign value to the id
}
私もtouchesBegan
デリゲートメソッドを実装しました。ユーザーがアイテムに触れると、対応するid
を取得したいと思います。だから私は戻ってMySCNNode
からSCNNode
を対応するその項目のをキャストしようとした:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
// hitTest to retrieve item's id
if let touchLocation = touches.first?.location(in: sceneLocationView) {
DDLogDebug("received touch location")
if let hit = sceneLocationView.hitTest(touchLocation, options: nil).first {
DDLogDebug("received a hit")
if let scnNode = hit.node as? SCNNode {
DDLogDebug("received a scnNode)")
if let mySCNNode = scnNode as? MySCNNode {
DDLogDebug("received a MySCNNode") // ====> Never reaches here
}
}
return
}
}
}
しかし、SCNNode
からMySCNNode
にキャストするステップが戻っMySCNNodeにSCNNodeをキャストしようとしたとき、私は間違っているいくつかの場所を書いたの
起こることはありません上記のヒットテストで? SCNNodeに追加情報を格納し、後でそれを取得する代替手段はありますか?
は、私はあなたが正しい軌道に乗っていると思いますが、あなたは非常に多くのキャストを必要としない、あなたはif let
s「を積み重ねる」場合、それは簡単です、あなたに
:その後、
と使用:あなたはSCNNode拡張子を追加することができます。 –