2016-07-19 5 views
1

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がすぐに表示されていません。

答えて

1

最初はあなたのシーンが連絡先の後でレンダリングされていないと思っていました。ラベルを表示しないので、scnView.playing = true行を入力します。ただし、ラベルは表示されませんでした。

次に考えるべきではないスレッドで何かをしようとしていました。 UIKitビューを変更するのは、実際にはメインスレッドでのみ行う必要があります。スレッドがSCNPhysicsContactDelegate関数を呼び出すのは不明です。

func physicsWorld(world: SCNPhysicsWorld, didBeginContact contact: SCNPhysicsContact) { 
    dispatch_async(dispatch_get_main_queue()) { 
     let label = UILabel(frame: CGRectMake(0, 0, 100, 100)) 
     label.textColor = .whiteColor() 
     label.text = "Test" 
     self.view.addSubview(label) 
    } 
} 

は、これは私のための遅延を修正し、またscnView.playing = trueで動作する...それはそれはメインスレッドで実行するん確実にするために、比較的簡単です考えます。

+0

ありがとうございました。コードがSpriteKitプロジェクトで完全に機能しているので、私はその問題を期待していませんでした。これは問題を解決するように思われた。 – Heriotza

関連する問題