Ми спеціалізуємося на розробці 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 — перший і основний рендерер для 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. На одному з проектів ми оптимізували рендеринг з 40 до 60 fps, зменшивши кількість draw calls вдвічі за рахунок об'єднання матеріалів.
Коли варто відмовитися від 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.







