#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 в симуляторе?