Узлы SKScene не обнаруживают прикосновения - PullRequest
1 голос
/ 03 мая 2019

Я пытаюсь создать приложение ARKit для ios, а узлы сцены не реагируют на прикосновения. Сцена отображается правильно, но я не смог обнаружить никаких прикосновений.

fileNamed: «TestScene» относится к файлу TestScene.sks в моем проекте, который пуст, и я добавляю узел в код, как показано ниже.

let detailPlane = SCNPlane(width: xOffset, height: xOffset * 1.4)

let testScene = SKScene(fileNamed: "TestScene")
testScene?.isUserInteractionEnabled = true

let winner = TouchableNode(fontNamed: "Chalkduster")
winner.text = "You Win!"
winner.fontSize = 65
winner.fontColor = SKColor.green
winner.position = CGPoint(x: 0, y: 0)

testScene?.addChild(winner)

let material = SCNMaterial()
material.diffuse.contents = testScene
material.diffuse.contentsTransform = SCNMatrix4Translate(SCNMatrix4MakeScale(1, -1, 1), 0, 1, 0)
detailPlane.materials = [material]

let node = SCNNode(geometry: detailPlane)
rootNode.addChildNode(node)

Для TouchableNode у меня есть следующий класс

class TouchableNode : SKLabelNode {

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        print("Touch detected")
    }

}

Ответы [ 2 ]

1 голос
/ 07 мая 2019

Я достиг этого эффекта, используя распознавание жестов

private func registerGestureRecognizers() -> Void {
    let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap))
    sceneView.addGestureRecognizer(tapGestureRecognizer)
}

, и затем получил функцию для обработки жеста касания

@objc private func handleTap(sender: UITapGestureRecognizer) -> Void {
    let sceneViewTappedOn = sender.view as! SCNView
    let touchCoordinates = sender.location(in: sceneViewTappedOn)
    let hitTest = sceneViewTappedOn.hitTest(touchCoordinates)
    if !hitTest.isEmpty {
        let hitResults = hitTest.first!
        var hitNode = hitResults.node
        // do something with the node that has been tapped
        }
    }
}
0 голосов
/ 03 мая 2019

Вам нужно сделать isUserInteractionEnabled = true first.

Итак, что-то вроде:

class TouchableNode : SKLabelNode {
    override init() {
        super.init()
        isUserInteractionEnabled = true
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder:  aDecoder)
        isUserInteractionEnabled = true
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        print("Touch detected")
    }
}
...