UnityゲームにCI/CDを使うべき理由

本記事では、Unityゲームでの継続的インテグレーションとデプロイの必要性が高まっていることについてご説明いたします。技術的な詳細をご説明する前に、CI/CDが提供できる価値が急速に高まっている中で、一般的にDevOpsがビデオゲーム業界で過小評価されていることについてご説明いたします。次に、UnityプロジェクトにおけるCI/CDの具体的なメリット、考慮すべき多くの技術的課題、およびいくつかの解決策についてご説明いたします。
![codemagic-blog-header-mix-unity (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028491/e53d8ef6-40c9-2e01-de2a-d37f6a38c3f6.png)


本記事のトピックの概要は次のとおりです：
* Unityとは？
* Codemagicとは？
* どんな問題を当社は解決しているのか？
* Unityクラウドビルドだけでは足りない理由とは？
* Codemagicがこれらの問題を解決する方法とは？

では、その前に、まず基本的なことをいくつかご説明いたします。

## Unityとは？
![](https://blog.codemagic.io/uploads/2021/09/unity.png)

[Unity](https://unity.com/)は、**クロスプラットフォームの3D/2Dゲームエンジン**として、広く普及しています。これは、強力なアニメーションツール、内蔵の地形エディタ、サウンドミキシング、モバイル、AR、VR、ゲームコンソールなどのデバイスへの対応など、膨大な機能を備えています。Unityは、趣味の開発者から巨大なAAAスタジオまで幅広く使用されています。また、Escape from Tarkov、Pokémon Go、Monument Valley、Hollow Knight、Fall Guysなどの人気ゲームの制作に使用されています。

Unityには巨大な開発者コミュニティがあり、公式およびユーザーが作成したチュートリアル、ガイド、デモ、アセットなどが無限に提供されています。UnityのフォーラムやStack Overflowでは、新しい開発者を支援したり、質問に答えてくれるエキスパートたちが常にいます。

## Codemagicとは？
![](https://blog.codemagic.io/uploads/2021/09/codemagic.png)

[Codemagic](https://codemagic.io/?utm_source=qiita&utm_medium=referral&utm_campaign=flutter_distribution&utm_content=japanese_lang)は、主にモバイルプロジェクト用の**CI/CDプラットフォーム**です。CI/CD（継続的インテグレーション、継続的デリバリー/デプロイ）とは、ソフトウェア開発における一連の原則と実践を表す包括的な用語です。CI/CDを実際に導入するのに役立つ専用ツールやプラットフォームがいくつかあります。これらには通常、ソフトウェアの（頻繁な）テスト、ビルド、デリバリーの自動化が含まれます。これらのツールは、プロジェクトのリポジトリと統合され、重要な変更が発生したときに、この自動プロセスを起動します。

[Codemagic CI/CD](https://codemagic.io/?utm_source=qiita&utm_medium=referral&utm_campaign=flutter_distribution&utm_content=japanese_lang)は、Azure DevOps、GitHub、GitLab、Bitbucket、さらに、その他のセルフホスト型またはクラウドベースのGitリポジトリと統合します。これは、AndroidやiOSのネイティブ、Flutter、React Native、Cordova、Ionic、そしてもちろん、Unityにも対応しています。codemagic.yamlを使って、ビルド、テスト、リリースのパイプライン全体を自動化することができ、技術スタック（ご使用のプログラミング言語、フレームワーク、ツールなど）と統合することができます。Codemagicは、macOSとLinuxホストを備えており、iOSとAndroidプロジェクトを簡単に構築、署名、デプロイできます。また、Google PlayやApp Storeとシームレスに統合されています。

## どんな問題を当社は解決しているのか？

CI/CDやDevOpsという言葉を聞いたことがない方は、これら2つがどのような関係にあるのか、なぜ学ぶことを検討しなければならないのかと疑問に思われるかもしれません。ゲーム開発者であれば、より良いゲームを作るためではなく、ゲームのマーケティングに貴重な時間を費やすのとまさに同じように、意識高い系のソフトウェア開発手法を導入することに、抵抗を感じるかもしれません。そう思うのは、珍しいことではありません。

### スマートに働くのではなく、がむしゃらに働くという文化

ビデオゲーム業界は、長時間労働（残業代未払い）など、問題のある開発サイクルが蔓延していることで悪名高いです。これは、期待はずれでバグだらけのゲームが発売されることが多くなったことで、痛感させられる問題となっています。これは、ある程度予想できたことなのかもしれません。

ゲーム制作は複雑です。それは、頭が痛くなるほど多くのクリエイティブな分野と、非常に複雑なソフトウェアとの連携が必要な共同作業です。また、消費者の要求、予算、プロジェクトの規模が大きくなるにつれ、ヒューマンエラーの数が増えているのは不思議ではありません。この業界でもう一つ沸騰しているトレンドによると、恐らく犯人は、「管理の不備」であると指摘しています。

私が言及しているトレンドとは、開発者のホラーストーリーが増えているということです。例えば、リリース日を急ぎすぎたために、数え切れないほどの延期を余儀なくされたり、途方もなく長い開発サイクルの途中で、主要なチームメンバーがプロジェクトを離れたり、プログラマーが週80時間労働で働いて、発売後すぐに大規模なデイワンパッチをドロップしたりなど...。このようなことが恐ろしく多くなってきました。驚くことではありませんが、適切に実装されたDevOpsの原則は、この業界の主要企業以外ではほとんど見られません。しかし、これは確かに、あるべき姿ではありません。ソフトウェア業界以外の場所で働いたことのある人なら、誰でもこう言うでしょう。

「どんなに優秀で情熱的な開発者であっても、ゲームは作るのが難しく、ヒューマンエラーは避けられない」、と。ですが、だからこそ、リリース前もリリース後も、**一貫したビルドとリリースプロセスでゲームの品質を頻繁に検証することがゲームには欠かせません**。

### UnityプロジェクトでCI/CDを活用するメリット

本記事では、現代のゲーム開発におけるDevOpsの重要な価値について、あまり深くは掘り下げません。([このGDCトーク](https://www.youtube.com/watch?v=t9HRzE7_2Xc) で基本的な紹介をしています。) 少なくとも、CI/CDはますます重要な役割を果たし始めています。CI/CDは、すべてのリリースを滞りなく行うための特効薬ではありませんが、プロジェクトが**ビルドに成功し、テストに合格し、配布プラットフォームにデプロイされる**ことを**保証します。これにより、より頻繁にQAテストを行うための強固な基盤を作り、最終的にはリリースプロセスや最終製品に対する信頼性を高めることができます。これらを踏まえた上で、ようやく、これらのメリットがUnityプロジェクトでどのように発揮されるのかについてお話することができます。

手動でUnityプロジェクトを構築するのは時間の無駄（プロジェクトの規模によっては多大な時間を費やす可能性があります）になるのは言うまでもありませんが、明らかにスムーズな体験とは程遠いものです。例えば、プロジェクトが複数のプラットフォームを対象にしているとします。その場合、プラットフォームを切り替え、待機し、ビルドを実行し、待機し、ビルドを圧縮または配布し、さらに待機してから、目的のターゲットをすべてビルドするために、Unity Editorで同じ単調なサイクルを繰り返すという苦痛をすでにご経験されているかもしれません。今までの経緯を考えれば、明らかにもっと良い方法があります。

具体的には、Unity Editorのコマンドライン引数により、Unity EditorのGUIを開く必要すらなく、ビルドプロセスを自動化したり、テストを実行したりできます（テストの書き方については、まったく別の喜ばれないトピックですが）。その結果、**Unityのビルドをスクリプト化して、より効率的に、待ち時間を減らして実行することができます**。そして、これらのスクリプトをクラウド型のCI/CDプラットフォームや、Jenkinsを介してローカルの専用マシンにフックすることができます。これには、魅力的な特典が多数ついてきます：

#### プラットフォームの切り替えを忘れられる
ビルドプロセスの自動化を設定すれば、この光景ともおさらばできます。

![](https://blog.codemagic.io/uploads/2021/09/image1.png)

#### 自動的に構築、パッケージング、配布
もう、貴重な開発時間を、手作業で構築し、圧縮し、ターゲットのプラットフォームに配布するのに費やす必要はありません。これらのステップはすべて、ビルドパイプラインのスクリプトによって自動化できます。先にお伝えしましたように、これにより、ゲームの価値を高めるための有益な作業にもっと時間を使えるようになります。

#### 一貫したビルドパイプラインと健全なコードベース
Unity Editorの大きな特長の一つは、プレイヤーを作る必要が一切なく、ゲームのかなり初めから最後まで開発できることです。ですが、手動でたまに専用のマシンでビルドを実行していると、最悪のタイミングでエラーや配布の問題が発生することがあります。 

前述しましたように、CI/CDはテストの実行、ビルド、ターゲットプラットフォームやQAテスターへの配布を自動的に、つまり、より頻繁に行うことができます。これは、コミット、タグの作成、プルリクエストの更新などでトリガーできます。自動化されたより頻繁なプロセスに切り替えることで、ソースコード、ビルドパイプライン、配布の統合の健全性を常に監視することができるだけでなく、最初のリリースやその後のパッチの配布準備に自信も持てます。

#### iOSやmacOS用に構築
macOSホストにアクセスできる環境があれば、Apple製品でビルド、署名、配布ができるかどうかを心配することなく、最終的にお好みのOSを使ってゲーム開発ができます。また、これらのホストを使って、ILCPPバックエンドでmacOS用にビルドすることもできます（これはmacOSホストでのみ可能です）。

### Unity CI/CDの技術的課題
そのすべてが素晴らしいと思いますし、実際に最高の結果をもたらすことができます。しかし、Unity用に何らかのCI/CDソリューションをセットアップしようとすると、多くのユニークな課題に直面することになります（そのうちの一つは、すでにお伝えしたとおりです）。

Unityは、クロスプラットフォームのゲームエンジンです。これは、MacかiOSに向けて構築するという避けられない問題につながります。WindowsやLinuxでは、プレイヤー用のXcodeプロジェクトを構築できますが、コード署名の認証が必要で、配布用の最終アーカイブを生成するためにmacOSホストにアップロードする必要があります。つまり、macOSのビルドホストが、これらのターゲットに対して、パイプラインのどこかで必要になるということです。一部の管理されたCIプラットフォームでは、macOSのホストが提供されていますが、問題はそれだけではありません。

また、UnityのSDKやプロジェクトでは、通常必要とされる帯域幅よりも多くの帯域幅が要求されます。基本的なプロジェクトとUnity SDKだけでも、同等のネイティブモバイルアプリのセットアップよりも、かなり大きなVMイメージが必要になります。必要なストレージ容量は、膨大な数の2D・3Dアセット、オーディオファイルなど、天文学的に大きくなります。つまり、VMはより多くのストレージスペースを必要とし、恒久的なストレージの可用性に対してより敏感になるということです。一般的なUnityのCI/CDパイプラインでは、GPUバウンド（負荷がかかる）またはアクセラレート（CPUとともにGPUを使用）されたジョブが多いため、ハードウェアの問題が深刻化します。これには、Playモードのユニットテストや統合テストの実行、ライトマップのベイク、シェーダーバリアントの構築などが含まれます。しかし、結果的には、さらに大きな問題を解決するのが先決です。

### Unityのライセンスシステム
CI/CDパイプラインを確立するための技術的な複雑さのほとんどは、Unityライセンスの問題には勝てません。このライセンスの問題は、長い間この試みの主な障害となっています。Unity Editorには登録ライセンスが必要です。これは、Unity IDのメールアドレスとパスワードでサインインするか、ライセンスファイルを提供することを意味します。またこれは、Editorを使って、選択されたCI/CDプラットフォームの任意のクラウドVM上に、GUIインターフェイスなしでプロジェクトを構築する場合にも適用されます。Unity Editorのライセンスには2つの重要な制限があり、これが、些細な問題から大きな問題へと発展させています。 

1. 最大2台のマシンでしか使用できない
2. ライセンス保持者は、一度に1つのUnity Editorインスタンスしか使用できない

このため、GitHub ActionsのようなマネージドCIサービスには非常に不向きです。なぜなら、ビルドごとにライセンスの有効化と無効化を行う必要があるからです。一度に複数のビルドに使用することができないため、1つのライセンスでは拡張できません(1つのライセンスは一人用なため、これはライセンス侵害につながる恐れがあります)。またこれは、Azureの自動スケールのような機能にも明らかに問題を引き起こします。 

ローカルの専用ビルドマシンにライセンスを使用したり、ビルド後に自動的にリリースを試みることはできます。しかし、チームの規模やコンカレント（同時）の要求が高まると、すぐに柔軟性の問題に直面してしまいます。これらの制限はすでに、開発チームにとって、ライセンス管理によるコストの最適化が根強い課題となっていますが、CI/CDシステムにとってはすぐに、非常に困難な課題となります。

#### Unityビルドサーバー
このような制約に対抗するために、Unityは2020年に待望の更新ライセンス制度を開始しました。ビルドサーバーのライセンスでは、専用のライセンスサーバーを介して、更新されていないライセンスのリース、返却、自動回収などを活用できます。また、これによってライセンスの価格設定も大幅に安くなっています。 

ですが、ビルドサーバーのライセンスには、独自の一連の大きな制限があります。

1. 専用のライセンスサーバーが必要。
    a. 一般的なLinuxやWindows OSのバージョンで動作しますが、機能させるためには一貫したホスト名、MACアドレス、CPUの数が必要です。(クラウドVMは要注意)。
    b. このサーバーはプライベートネットワークのみを想定していますが、SSHトンネルで公開できます。
2. Unity 2019.4.3 LTS以降でのみ利用可能。
3. CLIのみ（GUI Unity Editorはない）。
4. Unity ProかEnterpriseライセンスプランで利用可能。
5. 新しいライセンスは、Unity Proビルドサーバーライセンス1件（1ライセンスあたり600ドル）か、Unityエンタープライズビルドサーバーライセンス5件（1ライセンスあたり400ドル）の単位で購入可能。

つまり新システムは、WindowsやLinux上で動作するフローティングライセンスサーバーで、SSHトンネルを介してリモートネットワーク内のクライアントや管理されたCIサービスに公開できます。このサーバーにより、ライセンスの使用や拡張が容易になり、もっと安価になります。これは、小規模なチームにとっても、クラウドベースのCI/CDパイプライン用の絶対的に推奨されるライセンス体系です。それでも、動作させるためには、それなりの設定とカスタマイズは絶対に必要です。

## 単にUnityクラウドビルドを使えばいいのでは？　

CI/CDをセットアップする前に、Unity Editorのライセンスを使用するには、重大な課題が複数あります。一方で、UnityプロジェクトでCI/CDを実行するための方法として、ある特定のオプションが、私たちの取り得る方法に関するリストからはっきりと欠けていました。ライセンスの問題を回避する簡単な方法は、一般的で汎用的なCI/CDツールやプラットフォームの代わりに、Unityクラウドビルドを使用することだと思われます。

### 何が問題なのか？
Unityクラウドビルドは、Unity自身が有償サービスとして提供している、初心者に優しいCI/CDソリューションです。これは最小限のセットアップを意味しますが、さらに重要なのは、ライセンスの問題を完全に回避することです。Unityクラウドビルドは、チームメンバー全員分の月額料金を支払う必要があり、ライセンスを追加購入する必要なしに追加料金でコンカレント（同時）ビルド数を増やせます。先にお伝えした山のような問題を解決する、魅力的で頭痛のしないソリューションのように見えるかもしれませんが、悪は細部に宿るものです。Unityクラウドビルドでは、パフォーマンスや各機能を簡単なセットアップと引き換えにしなければなりません。

#### 配布の自動化ができない
最大の問題は、Unityのサービスでは、本当に配布を自動化できないことです。Unityが提供するのはUDP（Unity配布ポータル）のみで、これは、Samsung Galaxy StoreやONE storeなどのサードパーティ製ストアにのみ接続されています。そのため、Google Play、App Store、Steam、itch.ioなどへの配布を自動化する明確な方法がありません。つまり、Unityクラウドビルドは、CI/CDソリューションというよりは、ビルドを手動でダウンロードできるマネージドCIサービスということになります。

#### ビルドの遅さと制御の悪さ
ビルド環境はほとんど制御できません。VMの仕様や外部ツールをコントロールすることはできないのです。また、先にご説明したことを考慮すると、カスタムVMのベースイメージを提供したり、専用ホストを使用したりする機能も明らかに欠けています。このため、Unityクラウドビルドは非常に遅くなり、高速化するためのオプションはありません。

![](https://blog.codemagic.io/uploads/2021/09/image2.png)

#### 診断しにくい問題
Unityクラウドビルドは管理されたシステムであり、ほとんどコントロールできないため、特に診断が難しいビルドの問題が発生しやすくなります。ビルドマシンやVMインスタンスに直接アクセスできないため、サポートはフォーラムに頼るしかありません。単独でUnityを使用しているユーザーの中には、このような理由で手動ビルドを選択している人もいます。

## Codemagicがこれらの問題を解決する方法
当社はこの問題点、解決すべき理由、解決する過程で直面する課題などを確認いたしました。表面的には、Unityクラウドビルドはこれらの問題をすべて回避しているように見えますが、独自の頭痛の種を抱えています。そこで、今からようやく、Codemagicがご提供する代替ツールをご紹介させていただきます。

### コントロール
Codemagicをご使用いただくと、CI/CDパイプラインを**完全にコントロール**できます。これにより、あらゆる規模のチームに付加価値が生まれます。ご趣味でご使用いただく場合、Butlerのような外部ツールと簡単に統合して、itch.ioのリリースを自動化できます。法人のお客様は、専用のマシンにカスタムベースのイメージをご利用いただくことが可能です。

### ハードウェアオプション
Codemagicは、お客様のニーズに合わせて、**様々なレベルのパフォーマンス**を持つ、macOSおよびLinux VMをご提供することが可能です。それらは専用のmacOSホストを備えており、これは特に、Unityのビルドを高速化する上で重要な役割を果たします。この方法では、ビルドマシンが必要とするのはプロジェクトの最新のdiffだけで、事前インストールされたUnity Editor、最新のXcode、Android SDKなどを含めることができます。法人のお客様は、強力なMac Proのビルドマシンをご選択いただくことも可能です。

### 配布
Codemagicはモバイル専用のCI/CDで、**App Store**や**Google Play**に配布するための統合が簡単です。複雑なGroovyスクリプトを書いたり、認証情報のプライバシーを心配したりする必要はございません。Codemagicには、認証情報を暗号化したり、iOSのビルドに自動的に署名したりするツールが組み込まれています。Codemagicは、Xcodeを搭載したmacOSホストをご提供しており、また、署名や配布用の認証情報を設定するための堅牢で安全なシステムをご提供しております。ポストビルドのスクリプトで他のプラットフォームへの配布を簡単に実現できます。

### 柔軟な価格設定
Codemagicは、趣味でご利用になるユーザー様向けに無制限の**無料**プランをご提供しています。より多くのビルド分数にアップグレードしたり、ご希望のレベルのハードウェアをご選択いただくこともできますが、**従量課金（Pay as you go）**プランでは、ご使用になった分のみをお支払いいただくご必要がございます。**ビジネス**と**法人**のお客様は、Unityクラウドビルドには全くない、さらに多くの機能をご利用いただけます。これらのオプションの中からご必要なものだけを対象にお支払いいただくことで、費用を最適化することができます。

### サポート
ご自分でUnity用Codemagicのセットアップに飛び込むご必要はございません。まずは、[Kevin](https://codemagic.io/contact/)にご連絡いただき、デモを受けてみてください。Unity Editorのライセンスを使用することもできますし、Codemagicがビルドサーバーライセンスのセットアップをお手伝いさせていただくことも可能です。


稼動後は、Codemagicの情熱的で信頼できるサポートチームがお客様をサポートさせていただきますので、ご安心ください。Codemagicは、Flutterのユーザーアンケートで最高のCI/CDツールに選ばれました。パイプラインのいずれかの部分に問題が発生した場合はいつでも、Codemagicにご連絡ください。迅速に対応させていただきます。

## 結論
ゲーム開発におけるCI/CDの必要性は、どんどん明らかになってきました。何か月も放置していた専用のビルドマシンを起動して、さまざまなターゲットプラットフォームにゲームをリリースするのは、もはや合理的ではありません。自宅で仕事をするのが一般的になるにつれて、Unityプロジェクトを構築して配布するための明確で信頼性の高いパスを持つことが、本番環境においてますます重要になってきました。

Unityの開発にCI/CDソリューションを導入するには多くの課題があります。パフォーマンスと帯域幅の要求が尋常ではなく、ライセンスシステムが不利に働く場合があり、Unityサービスのソリューションには多くの改善余地があります。[Codemagic](https://codemagic.io/?utm_source=qiita&utm_medium=referral&utm_campaign=flutter_distribution&utm_content=japanese_lang)は、これらの問題に対する強力なソリューションをご提供しており、独自の利点を複数備えております。

いずれのソリューションをご選択されるにしても、なぜゲーム開発にCI/CDが不可欠なのか、Unityゲーム用のオプションは何があるのかについて、より深くご理解いただけましたら幸いです。