前提・実現したいこと
ARKitを用いて簡単なシューティングアプリを開発しています。
球体の敵オブジェクトを出現させ、横移動のアニメーションをしています。
シューティングゲームなので敵の攻撃モーション(敵オブジェクトの座標からプレイヤー(スマホのカメラ)にむけて弾オブジェクトの発射)を追加しようと考えています。
実際に敵の攻撃モーションは追加できたのですが、問題は敵の攻撃時の弾オブジェクトの発射位置です。
理想は敵の攻撃時、その時点での敵オブジェクトの座標から弾オブジェクトを発射したいです。
しかし、実際に弾オブジェクトが発射される座標は、敵オブジェクトの最初の出現位置になっています。
つまり、敵オブジェクトはアニメーションにより常に変化しますが、攻撃開始地点は常に固定されているのです。
アニメーション中のオブジェクトの座標を取得するにはどのようにしたら良いのでしょうか?
該当のソースコード
Swift
1//敵オブジェクトの生成 2func attacker(_ PositionX: Float,_ PositionY: Float,_ PositionZ: Float) { 3 //球体を生成 --rediusは半径 4 let attackerObj = SCNSphere(radius: 0.5) 5 let attackerNode = SCNNode(geometry: attackerObj) 6 let attackerPositionX = PositionX 7 let attackerPositionY = PositionY 8 let attackerPositionZ = PositionZ 9 10 attackerNode.position = SCNVector3(attackerPositionX, attackerPositionY + 1.0, attackerPositionZ) 11 attackerNode.scale = SCNVector3(0.5, 0.5, 0.5) 12 attackerNode.name = "attacker" 13 14 (中略) 15 16 //?秒間かかるアニメーション 17 let attackermoving = SCNAction.move(by: SCNVector3(5, 1.0, -1.5), duration: TimeInterval(3)) 18 let attackermoving2 = SCNAction.move(by: SCNVector3(-5, 1.0, -1.5), duration: TimeInterval(3)) 19 let attackerstoping = SCNAction.wait(duration: 0.3) 20 attackerNode.runAction( 21 SCNAction.repeatForever( 22 SCNAction.sequence([ 23 attackermoving, 24 attackermoving.reversed(), 25 attackerstoping, 26 attackermoving2, 27 attackermoving2.reversed(), 28 ]) 29 ) 30 ) 31 sceneView.scene.rootNode.addChildNode(attackerNode) 32 } 33 34 35//弾オブジェクトの生成 36func attacking() { 37 let attackerDate = sceneView.scene.rootNode.childNode(withName: "attacker", recursively: false) 38 let attackingPosition = attackerDate?.position //左のように書くと敵オブジェクトの最初の出現位置が攻撃開始位置になる 39 40//弾オブジェクトの生成 41 let attackerbullet = SCNSphere(radius: 0.005) 42 let attackerbulletNode = SCNNode(geometry: attackerbullet) 43 44//発射時の弾の位置 45 attackerbulletNode.position = attackingPosition! 46(以下略)
あなたの回答
tips
プレビュー