Scene Kitで本当に奇妙な動作が見つかりました。私はこれが起こるかどうかを確認するためにクリーンなプロジェクトを作成しました。次GameViewController
クラスを考えてみましょう:SceneKit:2つのノード間の接触後のUIViewの読み込みが遅い
import UIKit
import QuartzCore
import SceneKit
class GameViewController: UIViewController, SCNPhysicsContactDelegate {
func physicsWorld(world: SCNPhysicsWorld, didBeginContact contact: SCNPhysicsContact) {
let label = UILabel(frame: CGRectMake(0, 0, 100, 100))
label.textColor = .whiteColor()
label.text = "Test"
self.view.addSubview(label)
}
override func viewDidLoad() {
// Controller
super.viewDidLoad()
// Scene
let scene = SCNScene()
scene.physicsWorld.contactDelegate = self
// Scene View
let scnView = self.view as! SCNView
scnView.scene = scene
// Camera
let camera = SCNCamera()
camera.usesOrthographicProjection = true
camera.orthographicScale = 8
// Camera Node
let cameraNode = SCNNode()
cameraNode.camera = camera
cameraNode.position = SCNVector3(x: -3, y: 7.5, z: 10)
cameraNode.eulerAngles = SCNVector3(x: -0.5, y: -0.5, z: 0)
scene.rootNode.addChildNode(cameraNode)
// Light
let light = SCNLight()
light.type = SCNLightTypeDirectional
// Light Node
let lightNode = SCNNode()
lightNode.light = light
lightNode.eulerAngles = SCNVector3Make(-1, -0.5, 0)
scene.rootNode.addChildNode(lightNode)
// Box Shape
let geometry = SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0)
geometry.materials.first?.diffuse.contents = UIColor(red: 255, green: 255, blue: 0, alpha: 1)
// Upper Box
let box = SCNNode(geometry: geometry)
box.physicsBody = SCNPhysicsBody(type: .Dynamic, shape: nil)
box.physicsBody?.categoryBitMask = 1
box.physicsBody?.contactTestBitMask = 2
scene.rootNode.addChildNode(box)
// Bottom Box
let box2 = SCNNode(geometry: geometry)
box2.position.y -= 5
box2.physicsBody = SCNPhysicsBody(type: .Static, shape: nil)
box2.physicsBody?.categoryBitMask = 2
box2.physicsBody?.contactTestBitMask = 1
box2.physicsBody?.affectedByGravity = false
scene.rootNode.addChildNode(box2)
}
}
ここにされて何が起こる、我々はSCNScene
を作成し、その後、私たちは、カメラ/稲妻を追加し、衝突する2つのボックスを作成します。また、物理接点連絡先の代理人としてコントローラを設定しました。
しかし、2つのオブジェクト間の接触が発生すると、重要なコードが一番上に表示されます。 UILabel
を作成し、画面の左上に配置します。しかしここに問題があります。ラベルが表示されるまでに約7秒かかります。そして、これはいつもそうだね。これはむしろ奇妙に思えますが、自分で試すことができます:(Swiftを使用して)SceneKitプロジェクトを作成し、コントローラコードを私が提供したものに置き換えてください。
追加注:physicsWorld()
機能でprint("a")
を追加する場合、コードが適切なタイミングで実行されているので、それは、すぐに実行されますが、何らかの理由でUILabel
がすぐに表示されていません。
ありがとうございました。コードがSpriteKitプロジェクトで完全に機能しているので、私はその問題を期待していませんでした。これは問題を解決するように思われた。 – Heriotza