Как выбрать отдельный SCNNode SceneKit с помощью пульта на tvOS
Есть ли способ получить движок фокуса на SceneKit? Я пытаюсь создать трехмерную игру, в которой игроки должны выбирать из множества узлов SceneKit, но я не могу найти способ сфокусировать узлы SCNNode.
3 ответа
SCNNode
это модельный объект, а не UIView
потомок (или, точнее, не соответствует UIFocusEnvironment
), поэтому я не ожидал, что он сможет сфокусироваться.
Итак, как выбрать конкретный SCNNode
в SCNView
? Шаблон Apple tvOS SceneKit реализует тестирование попаданий, но я не понимаю, как пользователь может выбрать, какую точку на экране он выбирает; нет визуальной обратной связи. Шаблон / демо кажется плохо продуманным. Итак, вот подход, который некоторые коллеги и я обсуждали на днях, но не пытались реализовать.
SCNView
может иметь сцену наложения SpriteKit, overlaySKScene
, Используйте какой-нибудь жест (возможно, долгое нажатие или кнопку Play), чтобы переключиться в режим "Я собираюсь выбрать узел". Это означает, что курсор появляется на overlaySKScene
и может перемещаться при помощи пальцев на пульте дистанционного управления. Пользователь перемещает курсор по правильному узлу и затем... нажимает? Программа захватывает координаты SpriteKit курсора, переводит их обратно во входные данные теста попадания SceneKit и выполняет проверку попадания на графе сцены.
@vigneshv отмечает, что Apple не поощряет использование курсоров. И это также то, что я услышал от людей, которые посетили Tech Talks на этой неделе. Таким образом, измененным подходом может быть использование невидимого курсора на SKScene
, С каждым движением на пульте выполняйте проверку удара. Выделите узел, находящийся под невидимым курсором, но не предпринимайте никаких действий, пока не нажмете трекпад. Когда вы впервые переключаетесь в режим выбора узла, вы даже можете поместить невидимый курсор на самый большой или самый центральный узел, чтобы обеспечить некоторую предварительную визуальную обратную связь.
В зависимости от вашего графа узлов, это может быть сложно. Я мог бы представить генерирование диаграммы Вороного на основе SCNNode
центров, и с помощью удаленных жестов для перемещения от многоугольника к многоугольнику.
Еще одна идея: вместо скрытой, подразумеваемой диаграммы Вороного, используйте простую прямоугольную (или шестнадцатеричную?) Сетку для отслеживания курсора. Тестирование попаданий становится более сложным: в каждой ячейке сетки может быть несколько узлов. Но сетка становится легче строить и легче ориентироваться.
Я знаю, что оригинальный вопрос был задан в 2015 году, но Apple представила движок фокуса для SceneKit и SpriteKit в tvOS 11. См. WWDC 2017.
Теперь, кажется, встроенный, наконец?
«Чтобы сделать узел SceneKit или SpriteKit доступным для фокусировки, установите для свойства focusBehavior узла значение Focusable, как показано ниже.
node.focusBehavior = .фокусируемый
https://developer.apple.com/documentation/spritekit/sknode/controlling_user_interaction_on_nodes