Перемещение SCNNode вперед при длительном нажатии

#swift #touch #nodes #scenekit #move

#swift #коснитесь #узлы #scenekit #переместить

Вопрос:

Я пытался переместить куб вперед, когда пользователь долго нажимает на экран. Я не могу заставить его двигаться плавно. Есть ли какой-либо способ переместить его только вперед (в отрицательном направлении) и обновлять положение в каждом кадре сцены?

Вот что у меня есть на данный момент:

 var carLocation = SCNVector3(x:0, y: 0, z:-0.01) 

func setupScene() {
        sceneView = self.view as? SCNView
        scene = SCNScene(named: "art.scnassets/Map.scn")
        sceneView.scene = scene
        let holdRecognizer = UILongPressGestureRecognizer()
        holdRecognizer.addTarget(self, action: #selector(GameViewController.hold(recognizer:)))
        sceneView.addGestureRecognizer(holdRecognizer)
    }

 @objc func hold(recognizer: UILongPressGestureRecognizer) {
        print("Held down!")
        let position = recognizer.location(in: sceneView)
        carLocation = SCNVector3(x:0, y: 0, z:-0.01)
        carNode.physicsBody?.velocity  = carLocation
    }
  

Комментарии:

1. Возможно ли, что он «нервный», потому что вы каждый раз ждете длительного нажатия? Или предполагается, что оно следует за перетаскиванием после начала длительного нажатия?

2. @Voltan Куб выглядит дергающимся при перемещении. Поскольку скорость добавляется в определенном направлении, ей не нужно следовать за перетаскиванием.

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

Ответ №1:

Я ввел количество в вашу печать, просто чтобы вы могли видеть, что длительное нажатие будет повторяться … «много», что, вероятно, не то, что вы хотите в долгосрочной перспективе. Итак, предполагая, что вы создали что-то вроде:

 let p = SCNPhysicsBody(type: .dynamic, shape: nil)
p.isAffectedByGravity = false
shipNode.physicsBody = p
  

Тогда это будет плавно перемещать ваш объект вперед и назад.

 @objc func hold(recognizer: UILongPressGestureRecognizer) {
    print("Held down! (count)")
    count  = 1
    shipNode.physicsBody?.velocity = SCNVector3Make(0.0, 0, 0.51) 
}
@objc func handleTap(_ gestureRecognize: UIGestureRecognizer) {
    shipNode.physicsBody?.velocity = SCNVector3Make(0.0, 0, -0.51)
}
  

Если у вас там нет тонны объектов, я не вижу никаких причин для того, чтобы это было медленно. Установите SCNView.showsStatistics = true, чтобы увидеть ваш FPS. Надеюсь, вы не пытаетесь запустить scenekit в симуляторе?