Cygames展 Artworksを支える技術 – ネイティブアプリ開発の取り組み


はじめまして、モバイルアプリエンジニアの蛭浜と申します。
2023年9月2日から10月3日まで『Cygames展 Artworks』が上野の森美術館にて開催されました。
私が所属するモバイルアプリチームではグラパスやサイコミなどゲーム以外のAndroid/iOSアプリを開発・リリースしており、このたび『Cygames展 Artworks』アプリ(以下、「ガイドアプリ」)を開発いたしました。

※『Cygames展 Artworks』アプリは2023年11月6日でアプリストアの公開を終了しています

ガイドアプリの開発ではいくつか新しい技術を採用しました。本記事ではその内容や効果について紹介させていただこうと思います。

ガイドアプリの構成

展覧会の検討段階において、訪れていただいた方々に展示をより楽しんでいただくための企画が数多く提案されました。
その中でも以下の企画をスマートフォンのアプリを通じて提供することが決まり、アプリの制作が始まりました。

  1. 各ゲームのキャラクターによる音声ガイド(バックグランド再生可能)(上記画像の右から2番目「展示説明と音声ガイド」)
  2. 美術館内にいるかどうかを判定する位置認証機能
  3. 3メートルを超える立体バハムート像のAR演出(上記画像の右から1番目「AR表示」)

これらを実現するため、2022年2月頃から技術選定を重ね、アプリのベースとしてはAndroid/iOSネイティブ(※)で制作しつつ、AR機能はUnityを利用するという構成となりました。

  • 位置認証の手法として「GPSなどの位置情報」、「Bluetoothビーコンを受信」、「QRコードをスキャン」などAndroidやiOSプラットフォームの機能を活用
  • AR演出には他アプリでの実績があるUnityを採用
  • 展示作品を観ることに集中できるように、アプリのUIや演出はシンプルにして操作性を優先する

※ネイティブ・・・GoogleやAppleが提供しているAndroidやiOS向けのアプリ作成の仕組み。OSや端末の機能を直接操作することにより、Unityなどのエンジンやフレームワークなどよりも細かい設定や制御が行える。

ネイティブアプリの開発とUnityでのARの開発では必要となる知識が異なるため、それぞれ専門のチームが担当する分業体制となりました。
モバイルアプリチームはAndroid/iOSのネイティブ開発を専門としており、ガイドアプリ全体の設計およびネイティブの実装を担当いたしました。
ARについては開発運営支援/先端コンテンツチームが担当しており、こちらの記事に開発時の話がまとめられております。ぜひご覧ください。

それでは、本記事ではガイドアプリで採用した技術についてネイティブ領域を中心に説明していきたいと思います。

ガイドアプリ開発での取り組み

ガイドアプリの開発では、ネイティブ開発の作業効率を高めるための「Kotlin Multiplatform」と、ネイティブアプリの一部としてUnityを利用する「Unity as a Library」という技術を新たに導入しました。
これらは業界での採用事例は多く存在しますが、Cygamesのプロダクトとしては初の取り組みとなります。

Kotlin Multiplatformについて

AndroidとiOSの両方でネイティブアプリをリリースする際には、ネイティブのプログラミング言語が異なるため、ほぼ同じプログラムを2つ作成しなければならないという課題が生じます。
解決策として、共通のプログラムをAndroidやiOSなど複数のプラットフォームで動作させるクロスプラットフォームと呼ばれる仕組みがあり、ガイドアプリ開発ではKotlinコミュニティが提供しているクロスプラットフォームである「Kotlin Multiplatform」(以下、「KMP」)を導入しました。
KMPではすべてのプログラムを共通化することはできませんが、それでも従来の開発に比べて大幅に作業効率を高めることができました。

なお、他にも有名なクロスプラットフォームとしてUnityやFlutterなどもありますが、今回のような「Bluetoothビーコンを受信」や「QRコードをスキャン」などスマートフォン固有の機能を利用するには専用のプラグインを独自に実装する必要があります。プラグインの作成にはネイティブの言語や仕組みを使う必要があるため、多くの知識が必要となります。
アプリの構成や各フレームワークの特徴、メンバーのスキルなど全体のバランスを考慮した結果、ガイドアプリ開発ではKMPの採用となりました。

KMPの一番の特徴はKotlin言語でプログラムを記述できることです。Androidアプリ開発ではもともとKotlin言語を利用していたこともあり、他の技術よりも学習コストが低く済みました。
クロスプラットフォームであることも含めKMPの採用によりガイドアプリ開発では以下のようなメリットが生まれています。

  • KMPの開発はAndroidアプリ開発と同じIDEで行えるため、追加のソフトウェアをインストールしたり使い方を覚える必要なく、開発環境面での学習コストはほぼ発生しなかった
  • KMPのプログラムはAndroidではモジュール、iOSではFrameworkに変換されるため、特殊な仕組みは必要なく通常のネイティブ向けライブラリと同様に扱えた
  • 通信データや内部保存データの仕様変更が発生しても、共通化により1ファイルの変更のみで済んだ
  • AndroidとiOSでAPIの名称や機能が完全に共通化されコミュニケーションの不整合がなくなった

本開発でのKMPの採用は試行フェーズだったため、リポジトリやユースケースまでのレイヤーまでをKMPで実装し、ViewModelやViewについてはKotlin/Swiftそれぞれでの実装としました。
将来的にはViewModelレイヤーもKMPで共通化したり、Compose MultiplatformによるUIレイヤーの共通化も検証したいと考えています。

最後にガイドアプリでは以下のライブラリを活用させていただきました。参考までに紹介させていただきます。

Unity as a Libraryについて

Cygamesでは今までにUnityベースのアプリでユーザにARを提供してきた実績もあり、ガイドアプリのAR機能もUnityでの実装となりました。
これまでのCygamesのアプリはネイティブもしくはUnityのどちらか一方で作成していましたが、ガイドアプリは「Unity as a Library」という仕組みによりネイティブアプリの特定の場面でのみUnityを動かすという混合型となります。

左3つはネイティブのみで実装、一番右はネイティブとUnityが混合

UnityによるAR(左)とネイティブのボタン(中央)を重ねてAR撮影画面(右)を構成

UnityによるAR(左)とネイティブのボタン(中央)を重ねてAR撮影画面(右)を構成

Unity as a Library」(以下、「UaaL」)とはUnityで作成したプログラムをネイティブのライブラリとして利用する仕組みです。(Unity 2019.3 以降で利用可能)
仕組みは単純で、ネイティブアプリはUnityから作成したライブラリに含まれるViewを画面上に配置することで、Unityで作成した高機能なプログラムをネイティブアプリの一部として動作させることができます。

AR開発とネイティブアプリ開発では専門領域が違うため、ガイドアプリ開発ではそれぞれを専門とするUnity(AR)チームとネイティブチームで協力して開発を行いました。

これまでAR開発を行ってきたUnityチーム、もしくはネイティブ開発が得意なネイティブチームのどちらか一方のみだと新しく覚えることや品質など不安な面が多いですが、UaaLの仕組みにより互いの得意分野を組み合わせることができました。

1つのアプリの中に複数の技術が混在すると負担も大きくなりそうですが、ネイティブチームとしては他のネイティブ用ライブラリと同じようにリンクすれば利用できますし、Unity部分を呼び出さない限りは他の箇所の作業に影響することはありません。
Unityチームとしては検証時はUnityエディター上のプレビューで即座に動作確認ができることはもちろんのこと、ガイドアプリ本体とは関係なくUnity部分だけをそのままAndroid/iOSアプリとして端末にインストールし動作確認を行うこともできます。
このように作業ブロックが完全に分離されているため、ネイティブとUnityの開発チームが分かれていても互いの進捗に依存することなく自身の専門領域の開発に専念することができました。

作業環境の面では、ネイティブチームによるガイドアプリ本体用のリポジトリと、UnityチームによるAR用のリポジトリを用意しました。
別々のリポジトリとした理由として、リポジトリの肥大化防止やそれぞれの作業で必要となる開発環境が異なること、互いの依存関係を極力下げることなどがあります。
しかしながら、リポジトリを分けてしまうとUnityチームの対応内容をネイティブのリポジトリに反映するための作業負担も生じます。
対策として、「Unityチームのリポジトリをビルドしてネイティブチームのリポジトリ宛にプルリクエストを作成する」までの処理をGitHub Actionsのワークフローで自動化することにより、エンジニア同士の作業負担を最低限まで軽減することができました。

このようにガイドアプリ開発では、UaaLの採用によってネイティブアプリの特定の場面にUnityの高度な演出を盛り込むことができ、複数の異なる技術を組み合わせることによる負担も少なく抑えることができました。

おわりに

本記事では新たに導入・活用した技術を中心に『Cygames展 Artworks』アプリ開発について紹介させていただきました。ご一読いただきましてありがとうございました。

最後に、モバイルアプリチームではグラパスやサイコミなどゲーム以外のAndroid/iOSアプリも開発・リリースしており、ともに「最高のコンテンツをつくる」仲間を募集しております。
今回のようなネイティブアプリの開発・リリースをはじめ、Unityアプリ向けにデバイスやプラットフォーム特有の機能(プッシュ通知配信やNFC読み込みなど)を使うためのUnityプラグイン開発なども行っています。
もし興味をお持ちいただけましたら、ぜひこちらの採用ページ(AndroidエンジニアiOSエンジニア)をご確認ください。