Мы специализируемся на разработке 3D-игр для iOS с использованием нативного фреймворка SceneKit. Часто клиенты приходят с готовой идеей, но не знают, какой технологический стек выбрать между Unity, Unreal и SceneKit. SceneKit — не Unity и не Unreal: нет визуального редактора pipeline, нет Asset Store, меньше готовых решений. Но это и не сырой Metal: физический движок, анимации, shader модификаторы, AR-интеграция через ARKit — всё входит в SDK без сторонних зависимостей. Для iOS-эксклюзивных 3D-игр средней сложности это вполне рабочий вариант, особенно если команда глубоко в Swift/Objective-C.
Сцена, ноды, рендеринг
Базовая единица — SCNNode. Сцена — дерево нодов: корень SCNScene.rootNode, к нодам прикреплены геометрия (SCNGeometry), свет (SCNLight), камера (SCNCamera), физическое тело (SCNPhysicsBody). Отличие от SpriteKit в том, что SceneKit работает в 3D-пространстве с координатами SCNVector3, а трансформации задаются через simd_float4x4 (или удобные свойства position, eulerAngles, simdTransform).
Загрузка сцены из .scn-файла (редактируется прямо в Xcode Scene Editor):
let scene = SCNScene(named: "GameLevel.scn")! let scnView = SCNView(frame: view.bounds) scnView.scene = scene scnView.allowsCameraControl = false scnView.rendersContinuously = true // важно для анимаций view.addSubview(scnView) rendersContinuously = true — если не выставить, SCNView рендерит только при изменении сцены. Для игр с постоянным движением нужен постоянный рендер. Обратная сторона — потребление батареи. Для меню с редкими изменениями оставляем false.
Физика и коллизии в 3D
SCNPhysicsBody трёх типов: .static (неподвижные объекты, коллайдер не движется), .dynamic (под управлением физики), .kinematic (движется кодом, игнорирует силы, но участвует в коллизиях). Персонаж игрока обычно kinematic — мы двигаем его через код, но стены и пол его останавливают.
Форма коллайдера влияет на производительность сильнее, чем в 2D. Используйте капсулу для персонажа, а не сложную геометрию:
let capsule = SCNCapsule(capRadius: 0.3, height: 1.8) let physicsShape = SCNPhysicsShape(geometry: capsule, options: nil) player.physicsBody = SCNPhysicsBody(type: .kinematic, shape: physicsShape) Коллизии обрабатываются через SCNPhysicsContactDelegate. Настраивайте categoryBitMask, collisionBitMask, contactTestBitMask — только для нужных пар, чтобы не перегружать didBegin.
Анимации: CAAnimation и SCNAnimationPlayer
Скелетная анимация импортируется из .dae (Collada). Переключение между idle, run, jump делаем с blendInDuration для плавности:
func transition(to key: String, blendDuration: CGFloat = 0.3) { let player = characterNode.animationPlayer(forKey: key)! player.blendInDuration = blendDuration player.play() currentAnimationKey.flatMap { characterNode.animationPlayer(forKey: $0)?.stop(blendOutDuration: blendDuration) } currentAnimationKey = key } Без blendInDuration персонаж «прыгает» между позами — это первое, что замечает игрок.
Шейдеры и постэффекты
SceneKit позволяет подключать GLSL/Metal шейдеры через SCNMaterial.shaderModifiers. Типичное применение — растворение объекта при смерти:
let dissolveShader = """ #pragma transparent #pragma body float threshold = u_dissolveAmount; float noise = ... // шум по координатам if (noise < threshold) discard_fragment(); _output.color.a = smoothstep(threshold - 0.05, threshold, noise); """ material.shaderModifiers = [.fragment: dissolveShader] SCNTechnique — для постобработки всего экрана (bloom, outline, depth of field). Конфигурируется через plist-словарь.
ARKit интеграция
SceneKit — первый и основной renderer для ARKit:
let arView = ARSCNView(frame: view.bounds) let config = ARWorldTrackingConfiguration() config.planeDetection = [.horizontal, .vertical] arView.session.run(config) ARSCNView автоматически синхронизирует SCNScene с AR-координатным пространством. Это основа для AR-игр — маркет ARKit + SceneKit хорошо закрыт примерами Apple.
Как оптимизировать производительность SceneKit?
SCNView по умолчанию использует Metal на iOS 9+. Несколько правил, которые реально влияют на fps.
Batching: SceneKit автоматически объединяет draw calls для нодов с одинаковым материалом. Поэтому 1000 деревьев с одним материалом гораздо дешевле, чем 100 деревьев с 100 разными материалами. Используй SCNMaterial инстансы, не создавай новый объект материала для каждого нода.
Level of Detail через SCNLevelOfDetail: для объектов на расстоянии более 20 метров можно показывать упрощённую геометрию. Это снижает нагрузку на GPU.
Occlusion culling: SceneKit делает frustum culling автоматически, но occlusion culling (скрытие объектов за другими объектами) — нет. Для сложных сцен это нужно делать вручную через isHidden = true по результатам ray cast или логики уровня.
Инструмент для профилирования: Xcode → Metal System Trace + Render Graph. Цель — не более 30–50 draw calls для игры с стабильными 60 fps на iPhone X.
Когда стоит отказаться от SceneKit?
Мультиплатформа (iOS + Android + PC) — Unity или Godot. Сложная физика тел с деформацией — Unity с Havok. Массивные открытые миры — тоже Unity/Unreal. SceneKit хорош для iOS-эксклюзива с умеренной 3D-сложностью, AR-приложений и игр, где важна нативная интеграция (Game Center, CloudKit).
Процесс работы
- Аудит ТЗ: тип игры, нужен ли AR, целевые устройства, минимальная версия iOS, ассеты.
- Прототип игровой механики: движение, физика, базовая камера — 1–2 недели.
- Core gameplay: уровни, враги/препятствия, UI (SwiftUI поверх
SCNView). - Аудио:
AVAudioEngineдля 3D-звука. - Интеграция Game Center, IAP, ARKit.
- Полировка производительности, тестирование на слабых устройствах.
Что входит в работу
- Исходный код с комментариями
- Документация по архитектуре и сборке
- Тестовый билд через TestFlight
- Публикация в App Store (аккаунт разработчика предоставляется клиентом)
- Гарантийная поддержка 30 дней после релиза
Ориентиры по срокам
| Тип проекта | Срок |
|---|---|
| Прототип / proof of concept | 2–3 недели |
| Казуальная 3D-игра без AR | 1,5–2 месяца |
| 3D-игра с AR + Game Center | 2–3 месяца |
| Сложный проект (открытый мир, мультиплеер) | Обсуждается отдельно |
Стоимость рассчитывается индивидуально после анализа ТЗ и наличия готовых ассетов.
Наш опыт: реализовали более 10 3D-проектов на SceneKit, включая AR-приложения с высокой производительностью. Все проекты прошли модерацию App Store без отклонений.
Пишите — оценим ваш проект за 1 рабочий день. Разработка под ключ с нуля до публикации. Официальная документация Apple по SceneKit.







