首页 > 解决方案 > 我正在尝试将命令从 SKScene(SpriteKit) 传递到 SCNScene(SceneKit)

问题描述

我想单击一个按钮来生成一个 3D 对象。我将一个 SpritKit 场景覆盖到一个 SceneKit 场景上,以便在我的界面中使用 SKNodes。但由于某种原因,该函数没有被调用,其余代码似乎正在工作。我想知道这是什么原因,以及是否有另一种调用此函数的方法

这是我试图传递的功能。

func setupDice() {
    var diceNode: SCNNode!
    let size: CGFloat = 1.5
    let diceGeometry = SCNBox(width: size, height: size, length: size, chamferRadius: 0)
    diceGeometry.materials.removeFirst()

    for i in 1...6 {

        let diceMaterial = SCNMaterial()
        diceMaterial.locksAmbientWithDiffuse = true
        diceMaterial.diffuse.contents = UIImage(named: "x\(i)")?.xFlipped
        diceMaterial.blendMode = .multiply

        diceGeometry.materials.append(diceMaterial)
    }

    diceNode = SCNNode(geometry: diceGeometry)
    diceNode.physicsBody = SCNPhysicsBody(type: .dynamic, shape: nil)
    diceNode.physicsBody?.restitution = 1
    diceNode.physicsBody?.mass = 1
    diceNode.physicsBody?.categoryBitMask = 1
    diceNode.physicsBody?.collisionBitMask = 2
    diceNode.physicsBody?.applyTorque(SCNVector4(x: randomTorqueForce(),
                                                 y: randomTorqueForce(),
                                                 z: randomTorqueForce(),
                                                 w: randomTorqueForce()), asImpulse: true)

    self.rootNode.addChildNode(diceNode)


}

这是我在 SpriteKit 场景中调用函数的地方

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches {
        if touch == touches.first {
            if playButtom.contains(touch.location(in: self)){
                mainScene.setupDice()
            }
        }
    }


}

这是我的 GameViewController 的正确状态

class GameViewController: UIViewController {

var sceneView: SCNView!
var spriteScene: OverlayScene!

override func viewDidLoad() {
    super.viewDidLoad()

    //setupTest()

    self.sceneView = SCNView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height))
    self.sceneView.scene = MainScene()
    spriteScene = OverlayScene(size: view.bounds.size)
    sceneView.backgroundColor = UIColor.white
    sceneView.overlaySKScene = spriteScene
    sceneView.allowsCameraControl = true
    sceneView.isPlaying = true
    self.view.addSubview(self.sceneView)


}




override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

}

标签: iosswiftsprite-kitscenekit

解决方案


可能是因为您没有mainSceneOverlayScene. 像这样的东西应该有效:

class GameViewController: UIViewController {

var sceneView: SCNView!
var spriteScene: OverlayScene!

override func viewDidLoad() {
    super.viewDidLoad()

    //setupTest()

    self.sceneView = SCNView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height))

    let mainScene = MainScene()
    self.sceneView.scene = mainScene

    let overlayScene = OverlayScene(size: view.bounds.size)
    overlayScene.mainScene = mainScene
    spriteScene = overlayScene

    sceneView.backgroundColor = UIColor.white
    sceneView.overlaySKScene = spriteScene
    sceneView.allowsCameraControl = true
    sceneView.isPlaying = true
    self.view.addSubview(self.sceneView)
}

推荐阅读