Всем привет! В своей статье я хочу рассказать о опыте разработки игры для Apple Watch. Игра называется Space Beaver(Бобер и Космос). Она также доступна и на iphone. Но в этой статье будет рассказ именно о версии для часов. Исходный код здесь.
![](https://habrastorage.org/r/w780q1/files/2fb/8eb/887/2fb8eb8877e943a3807a546c24b9fb8b.jpg)
Идея:
Суть игры — быстрый свап в зависимости от направления стрелок. Если блоки со стрелками заполнили всё игровое поле то игрок проиграл.
После создания игры на iphone, решил попробовать портировать её на Apple Watch. Но к сожалению оказалось что используемый движок(Unity) не поддерживает эту платформу — т.е нельзя сделать сборку игры именно под часы ( unity roadmap). Есть сторонние плагины для взаимодействия юнити игры на iphone и приложения на Apple Watch (watchkit-unity) но это не то что мне нужно было.
Разработка:
В 2016 году Apple выпустила SpriteKit для Apple Watch и добавила поддержку Game Center (видео). И я решил воспользоваться этим. Игру писал на swift. Тестировал на симуляторе, т.к нет ни iphone ни Apple Watch.
Для начала сделал новый проект(Single View Application). Затем добавил новую target (WatchOS -> Game App).
![](https://habrastorage.org/r/w1560/files/a40/4df/eea/a404dfeea4a149439d5423fa371be16b.png)
В проект добавяться две папки. Первая папка с главным storyboard. Он содержит контроллер игры с SpriteKit сценой и дополнительные контроллеры меню, геймцентра и окончания игры. Также в первой папке находятся иконки и ресурсы для storyboard. Вторая папка (Extension) содержит исходный код и ресурсы для сцены SpriteKit.
Начал разработку с главного меню главного меню.
![](https://habrastorage.org/r/w780q1/files/202/7b5/93b/2027b593b2eb4f3fa2dc1cd983740f17.jpg)
Изначально хотел весь UI сделать на SpriteKit. Но не нашёл удобного способа использовать кнопки в SpriteKit. Поэтому решил сделать все меню на стандартных элементах для WatchKit.
Хотел подключить соцсети (логин в вк и фейсбук) и репост рекордов, но оказалось что нет простого способа сделать это. В ios есть Social Framework, но он пока не поддерживает WatchOS. Поэтому решил отложить до лучших времён.
Затем взялся за создание экрана самой игры (MainGameController и сцена SpriteKit).
![](https://habrastorage.org/r/w780q1/files/773/14f/6a0/77314f6a0a484a1f8f286b8ff4e9c411.jpg)
Здесь было всё стандартно для SpriteKit. В методе update выполняется код перемещения блоков и их удаление в зависимости от жестов игрока. Кстати, жесты я использовал стандартные рекогнайзеры. С библиотеки в сториборд перетащил и указал events. Сделал анимации неправильных жестов с помощью SKAction.
Добавил обучение — также использовал анимации SKAction.
Добавил музыку с помощью класса SKAudioNode. Кстати, музыка управляется с помощью SKAction.play() и SKAction.stop().
Добавил в игру эффекты haptic feedback(тактильная обратная связь). Эффекты используются при проигрыше и при неправильном жесте. Использовал функцию WKInterfaceDevice.current().play(.) ( WKInterfaceDevice).
Добавил паузу при использовании force touch на экране главной игры. Использовал элемент WKInterfaceMenu. Пытался использовать свои иконки вместо значков, но там с изображения берётся только альфа. Можно также поменять цвет фона.
![](https://habrastorage.org/r/w780q1/files/fb8/b09/7fa/fb8b097fa0e34640b0142d0e9693a8b2.jpg)
После создания экрана игры приступил к всплывающем окну завершения игры (GameEndController).
Здесь всё стандартно для WatchKit. При проигрыше наверх стека кидаю контроллер проигрыша, при нажатии на кнопку replay убираю верхний контроллер, на кнопку-стрелку назад — переходим на экран главного меню. Как писал выше, хотел добавить кнопку поделиться рекордом в соцсетях, но не нашёл удобного способа.
![](https://habrastorage.org/r/w780q1/files/4d7/c34/1c7/4d7c341c72f24286911d9772d49f3b42.jpg)
Затем начал прикручивать геймцентр (GameCenterWatchController). У эпл есть видео, но там рассказывается про пошаговый мультиплеер и ничего не говориться как подключать к игре таблицу лидеров (Leaderboard). Поэтому я решил воспользоваться контроллером для таблиц (WKInterfaceTable). Получал рекорды через метод GameKitHelper.sharedInstance.getPlayerScores() Кстати, пока тестирование геймцентра не поддерживается на симуляторе(не импортируется библиотека GameKit). Поэтому я так нормально эту функцию и не протестировал.
![](https://habrastorage.org/r/w780q1/files/658/73b/713/65873b71356c44d2834cda9647a4ce47.jpg)
При релизе возникло несколько проблем:
1) Я делал игру для часов отдельно от проекта основной игры. При сборке игры для ios, unity(5.5.1) создаёт XCode проект. Я в этот проект добавил target для Apple Watch. Но никак не получалось заархивировать(Archive) сборку. Немного поигрался с настройками сборки проекта: выставил для проекта(Unity-Phone) Build Settings: Supported Platforms — iOS, Architectures — Standard architectures. Для TARGETS: BeaverSpace: Supported Platforms — iOS, Architectures — Standard architectures; SpaceBeaverWatch: Supported Platforms — watchOS, Architectures — Standard architectures; SpaceBeaverWatch Extension: Supported Platforms — watchOS, Architectures — Standard architectures.
![](https://habrastorage.org/r/w1560/files/c6e/51e/78c/c6e51e78ce29414a8486d71c004efab6.png)
2) Игра не прошла ревью апстора с первого раза. Я в проект добавил target для Apple Watch и скопировал в него файлы из другого проекта. Но при этом забыл поменять модули в каждом контроллере главного storyboard для часов. После исправления всё было нормально.
![](https://habrastorage.org/r/w1560/files/35f/b9a/818/35fb9a8183244db482a11cffb25e096d.png)
В заключение:
На игру для Apple Watch я потратил 2 недели, но при этом сделал основную версию на ios за 4 месяца в свободное время. В целом очень понравилось разрабатывать для часов, несмотря на возникшие проблемы и неудобства. Порадовало то что Apple сделала поддержку SpriteKit для WatchOS. Планирую продвигать игру для часов в тематических группах вк и вместе с основной игрой. Также добавил ключевых слов связанных с Apple Watch. Пока на 541 месте по запросу “apple watch game” в US.
Всем спасибо за внимание.
→ Исходный код игры Space Beaver (Бобер и Космос) тут.
![](https://habrastorage.org/files/2fb/8eb/887/2fb8eb8877e943a3807a546c24b9fb8b.jpg)
Идея:
Суть игры — быстрый свап в зависимости от направления стрелок. Если блоки со стрелками заполнили всё игровое поле то игрок проиграл.
После создания игры на iphone, решил попробовать портировать её на Apple Watch. Но к сожалению оказалось что используемый движок(Unity) не поддерживает эту платформу — т.е нельзя сделать сборку игры именно под часы ( unity roadmap). Есть сторонние плагины для взаимодействия юнити игры на iphone и приложения на Apple Watch (watchkit-unity) но это не то что мне нужно было.
Разработка:
В 2016 году Apple выпустила SpriteKit для Apple Watch и добавила поддержку Game Center (видео). И я решил воспользоваться этим. Игру писал на swift. Тестировал на симуляторе, т.к нет ни iphone ни Apple Watch.
Для начала сделал новый проект(Single View Application). Затем добавил новую target (WatchOS -> Game App).
![](https://habrastorage.org/files/a40/4df/eea/a404dfeea4a149439d5423fa371be16b.png)
В проект добавяться две папки. Первая папка с главным storyboard. Он содержит контроллер игры с SpriteKit сценой и дополнительные контроллеры меню, геймцентра и окончания игры. Также в первой папке находятся иконки и ресурсы для storyboard. Вторая папка (Extension) содержит исходный код и ресурсы для сцены SpriteKit.
Начал разработку с главного меню главного меню.
![](https://habrastorage.org/files/202/7b5/93b/2027b593b2eb4f3fa2dc1cd983740f17.jpg)
Изначально хотел весь UI сделать на SpriteKit. Но не нашёл удобного способа использовать кнопки в SpriteKit. Поэтому решил сделать все меню на стандартных элементах для WatchKit.
Хотел подключить соцсети (логин в вк и фейсбук) и репост рекордов, но оказалось что нет простого способа сделать это. В ios есть Social Framework, но он пока не поддерживает WatchOS. Поэтому решил отложить до лучших времён.
Затем взялся за создание экрана самой игры (MainGameController и сцена SpriteKit).
![](https://habrastorage.org/files/773/14f/6a0/77314f6a0a484a1f8f286b8ff4e9c411.jpg)
Здесь было всё стандартно для SpriteKit. В методе update выполняется код перемещения блоков и их удаление в зависимости от жестов игрока. Кстати, жесты я использовал стандартные рекогнайзеры. С библиотеки в сториборд перетащил и указал events. Сделал анимации неправильных жестов с помощью SKAction.
Добавил обучение — также использовал анимации SKAction.
Добавил музыку с помощью класса SKAudioNode. Кстати, музыка управляется с помощью SKAction.play() и SKAction.stop().
Добавил в игру эффекты haptic feedback(тактильная обратная связь). Эффекты используются при проигрыше и при неправильном жесте. Использовал функцию WKInterfaceDevice.current().play(.) ( WKInterfaceDevice).
Добавил паузу при использовании force touch на экране главной игры. Использовал элемент WKInterfaceMenu. Пытался использовать свои иконки вместо значков, но там с изображения берётся только альфа. Можно также поменять цвет фона.
![](https://habrastorage.org/files/fb8/b09/7fa/fb8b097fa0e34640b0142d0e9693a8b2.jpg)
После создания экрана игры приступил к всплывающем окну завершения игры (GameEndController).
Здесь всё стандартно для WatchKit. При проигрыше наверх стека кидаю контроллер проигрыша, при нажатии на кнопку replay убираю верхний контроллер, на кнопку-стрелку назад — переходим на экран главного меню. Как писал выше, хотел добавить кнопку поделиться рекордом в соцсетях, но не нашёл удобного способа.
![](https://habrastorage.org/files/4d7/c34/1c7/4d7c341c72f24286911d9772d49f3b42.jpg)
Затем начал прикручивать геймцентр (GameCenterWatchController). У эпл есть видео, но там рассказывается про пошаговый мультиплеер и ничего не говориться как подключать к игре таблицу лидеров (Leaderboard). Поэтому я решил воспользоваться контроллером для таблиц (WKInterfaceTable). Получал рекорды через метод GameKitHelper.sharedInstance.getPlayerScores() Кстати, пока тестирование геймцентра не поддерживается на симуляторе(не импортируется библиотека GameKit). Поэтому я так нормально эту функцию и не протестировал.
![](https://habrastorage.org/files/658/73b/713/65873b71356c44d2834cda9647a4ce47.jpg)
При релизе возникло несколько проблем:
1) Я делал игру для часов отдельно от проекта основной игры. При сборке игры для ios, unity(5.5.1) создаёт XCode проект. Я в этот проект добавил target для Apple Watch. Но никак не получалось заархивировать(Archive) сборку. Немного поигрался с настройками сборки проекта: выставил для проекта(Unity-Phone) Build Settings: Supported Platforms — iOS, Architectures — Standard architectures. Для TARGETS: BeaverSpace: Supported Platforms — iOS, Architectures — Standard architectures; SpaceBeaverWatch: Supported Platforms — watchOS, Architectures — Standard architectures; SpaceBeaverWatch Extension: Supported Platforms — watchOS, Architectures — Standard architectures.
![](https://habrastorage.org/files/c6e/51e/78c/c6e51e78ce29414a8486d71c004efab6.png)
2) Игра не прошла ревью апстора с первого раза. Я в проект добавил target для Apple Watch и скопировал в него файлы из другого проекта. Но при этом забыл поменять модули в каждом контроллере главного storyboard для часов. После исправления всё было нормально.
![](https://habrastorage.org/files/35f/b9a/818/35fb9a8183244db482a11cffb25e096d.png)
В заключение:
На игру для Apple Watch я потратил 2 недели, но при этом сделал основную версию на ios за 4 месяца в свободное время. В целом очень понравилось разрабатывать для часов, несмотря на возникшие проблемы и неудобства. Порадовало то что Apple сделала поддержку SpriteKit для WatchOS. Планирую продвигать игру для часов в тематических группах вк и вместе с основной игрой. Также добавил ключевых слов связанных с Apple Watch. Пока на 541 месте по запросу “apple watch game” в US.
Всем спасибо за внимание.
→ Исходный код игры Space Beaver (Бобер и Космос) тут.