複数人で1つのUnityプロジェクトを管理するには
前回まで3回にわたって、実際にUnity 5を使用した簡単なコインプッシャーゲームを製作する方法を見てきました。今回は、複数人で1つのゲームを製作する際に必要となるバージョン管理システムと、実際にUnityプロジェクトを管理する方法について解説したいと思います。
複数人でUnityプロジェクトを製作していくには(GameJamでの例)
複数人でゲーム製作をするときは、作業分担をして進めていくと思います。その例として、2日間で1グループ1つのゲームを製作する「GameJam」というイベント(ハッカソン)が挙げられます。
「GameJam」では1グループあたり5~7人(※場所によって変動する)がプログラマー2人、2Dグラフィック2人、3Dグラフィック1人、サウンド1人で役割分担をしています。
では、グループ全員で1つのプロジェクトを完成させるためには、どのようにファイルを管理すれば良いのでしょうか? オススメは、「バージョン管理システム」を利用することです。
バージョン管理システムとは
バージョン管理システムは、プロジェクトのスクリプトや素材などの変更履歴を記録・追跡するためのシステムです。スクリプトを変更したとき、「いつ」「誰が」「どのように変更したのか」をすべて見ることができます。最新バージョンのスクリプトで不具合等が発生した際には、過去のスクリプトの状態に戻すことも可能です。
また、複数人で同じスクリプトを編集しても、マージ(統合)させることができます。これまでに著者が参加・開催してきたGameJamでは、下記のような3種類の方法で管理しているケースが見受けられました。
- SkypeやDropboxでスクリプトや素材を送る
- Unityアセットサーバーを利用したバージョン管理
- Gitを利用したバージョン管理
それぞれのケースでどのように管理していたのかを、簡単に説明します。
SkypeやDropboxでスクリプトや素材を送る
グループにバージョン管理システムを利用したことのない人がいる場合に、この方法を採るグループもありましたが、あまりオススメできません。
SkypeやDropboxでファイルを受け渡ししたグループは、ゲーム製作時間のほとんどが、プロジェクトをマージ(結合)させる時間に取られていました。また、GameJamの途中経過で同じファイルを何度も送る場面も出てきていました(ゲームがどこまで動かせる状態なのかを何度か確認していた)。その度に同じファイル名のスクリプトや素材を送っていたため、いつ送ったのが最新バージョンの物か非常にわかりづらくなっていたのです。
さらに、素材を正しく受け渡しできたとしても、スクリプトと素材の依存関係(スクリプト内でpublic変数として宣言したGameObjectの設定など)を結合先で正しく設定し直さなければならないので、二度手間になってしまいます。
Unityアセットサーバーを利用したバージョン管理
Unityアセットサーバーは、Unityが公式で用意していたバージョン管理システムです。Unity上のGUIで利用でき、バージョン管理システムを簡単に利用できるアセットでした(有料)。しかし、現在では過去の製品となっており、Unity社もメンテナンスを行っていないとのことです(公式より)。
アセットサーバー(チームライセンス)− Unity Documentation
http://docs.unity3d.com/ja/current/Manual/AssetServer.html
Gitを利用したバージョン管理
これまでのGameJamで多く利用されているバージョン管理システムです。Gitは複数人で同じプロジェクトを編集する用途に向いており、コマンドを利用するだけでプロジェクトを最新の状態にすることができます。
欠点としては、バージョン管理システムを利用したことのない人がグループにいると、まずバージョン管理について説明しなければならない場合がほとんどなので、GameJam序盤では少々時間を取られてしまいます。
しかし、バージョン管理システムはGameJamなどのゲーム製作イベントだけでなく、様々なIT企業でも利用されているため、使い方を覚えることをオススメします。
GitでUnityのプロジェクトを管理する(version管理時のUnityの各種設定)
Gitには様々なコマンドがあります。プロジェクト管理を行う前に、まず最低限押さえておきたいコマンドを紹介します。
クローン(clone) | サーバ上にあるバージョン管理を行なっているプロジェクトをローカル(自分自身のPC)に保存 |
---|---|
コミット(commit) | プロジェクト内に新しく追加した素材やファイルの変更点をローカルで保存 |
プッシュ(push) | コミットした内容をサーバ上のプロジェクトにアップ |
プル(pull) | 他のプロジェクト編集者の変更点をローカルに保存 |
リセット(Reset) | 自分自身が変更したファイルを変更前の状態に戻す |
マージ(merge) | プルで他人のコミットと自分のコミットが被った(競合した)場合に、どちらのコミットが正しいのかを選択 |
他にもコマンドはたくさんありますが、最低限でも上記のコマンドを覚えておけば、Gitを未経験のままGameJamに参加してもスムーズにバージョン管理を利用できるでしょう。
外部サービス(GitHub、Bitbucket)を利用する際の注意点
バージョン管理システムを利用する際、自分でサーバを建てることもできますが、アカウントを登録するだけで「GitHub」や「Bitbucket」といった外部のバージョン管理システムを利用できます。
これらのサービスを利用すると、全世界にプロジェクト等を公開できる「パブリックリポジトリ」と、アクセス権限がある人以外は見ることのできない「プライベートリポジトリ」の二種類のリポジトリを作成することができます。
なお、Unityのプロジェクトでこれらのサービスを利用する際には、プライベートリポジトリが作成可能かどうかを確認してください。例えば、Unityのアセットストアで購入した有料のアセットを含むプロジェクトをパブリックリポジトリで全世界に公開してしまうと、購入したアセットが無料で全世界の人々にダウンロードされてしまいます。アセットストアで購入したものや、他の人に利用されたくない素材がUnityプロジェクト内に含まれている場合は、必ずプライベートリポジトリを利用してください。
余談ですが、無料でバージョン管理システムを利用したいのであればBitbucketをオススメします。理由として、無料ユーザでもプライベートリポジトリが利用できるからです。GitHubでプライベートリポジトリを利用する場合は料金が発生します(学生アカウントを取得すればプライベートリポジトリを利用可能)。
前置きが長くなりましたが、ここからは実際にGitでUnityのプロジェクトを管理する方法を説明していきます。
Unityでの設定
複数人でバージョン管理システムを利用する際には、まずプロジェクトを編集するUnityのバージョンを合わせましょう。そして、UnityプロジェクトをGitでバージョン管理するにはUnity側で少し設定が必要になります。Unityプロジェクトを編集する全員が以下の設定を行ってください。実際にUnityを操作しながら説明します。メニューバーから[Edit]→[Project Settings]→[Editor]を選択すると、インスペクタウィンドウに「Editor Settings」が表示されます(図1)。また、Editor Settingsの初期値は図2のようになっています。
ここで、「Editor Settings」内の「Version Control」を[Hidden Meta Files]から[Visible Meta Files]に、「Asset Serialization」を[Mixed]から[Force Text]に変更します(図3)。この2つの項目を変更することで、コミット時にファイルやスクリプトが競合を起こしても修正可能な状態にできます。
Gitでの設定
続いて、Git側の設定です。Gitでバージョン管理を行なう際には、まず管理対象としないファイルを.Gitignoreに設定します。.Gitignoreにリスト1の項目を追加してください。
Unityプロジェクトを編集するときの注意
ここでは、GitでUnityプロジェクトを編集するときの注意点をTips的に紹介します。
同名のファイルを上書きしたい場合
一度組み込んだ画像や3Dモデルなどのモデル素材に修正があり、同じファイル名で上書きしたい場合は、Unityエディタ外でファイルを上書きしてください(図4)。
Unityエディタ上で同じファイルを取り込むと、上書きではなく同じファイル名に数字が追加された名前になってしまいます(図5)。
エディタ外でファイルの移動・ファイルの改名をする場合
Unityエディタ上でファイルを移動・改名する場合は特に問題ないのですが、もしエディタ外でファイルを移動・改名する場合は(ファイル名).metaも移動・改名してください(図6)。
Gitでプロジェクトを更新する前に保存
Gitでプロジェクトを更新する前には、必ずシーンやプロジェクトを保存しましょう。プロジェクトの保存は、メニューバーから[File]→[Save Project]で行えます(図7)。
プロジェクトを保存することで、Unityプロジェクト内の.metaファイルが更新されます。
複数人で1つのシーンを編集しない
複数人で1つのシーンを編集してしまうと、マージが非常に困難となります。Unity 5では「Smart Merge」と呼ばれる機能が追加されており、シーンの結合が以前よりも簡単に行えるようになりました。
Smart Merge−Unity Documentation
http://docs.unity3d.com/ja/current/Manual/SmartMerge.html
GameJamなどのイベントでは作業時間が非常に限られているため、できるだけマージ作業に時間を取られたくありません。そこで、筆者が参加したGameJamではどのように作業を行なったのかを書き留めておきたいと思います。
そのGameJamでは7名のメンバーでゲームを製作しました。そのうちUnity内で作業を行なったメンバーは4人(残り時間によって若干変動)で、以下の作業分担をしました。
- ゲームのコア部分を製作
- ゲームのステージを製作
- ゲーム内に現れるキャラクターの移動・動きを製作
- タイトル・エンディングなどを製作
上3つはゲーム部分を製作する作業です。だからと言ってこれら3つの作業を1つのシーンで編集してしまうと、後でマージせざるを得なくなってしまいます。
そこで、メインとなるゲームシーンとは別に、各個人でテスト用のシーンを作成して、そこでそれぞれの作業を行ないました。このようにすれば、後でシーンをマージする必要がありません(他の人のテスト用シーンを編集しないように注意!)。
また、「メインとなるゲームシーンは1人だけが触る」と決めておいたほうが良いです。「そのゲームシーンを触れるのはプログラムのリーダーだけ」等、プロジェクト製作前に決定しておきましょう。
まとめ
最後に、Gitを利用したUnityのプロジェクト管理を行なう際の注意点をまとめておきます。複数人での開発では、これらのことに気をつけて進めてみてください。
Unityプロジェクトをバージョン管理するときに必要な設定
- Unityで「Project Setting」を設定し直す
- Gitでバージョン管理に含めないファイルを.Gitignoreに設定
Unityプロジェクトのバージョン管理時に気をつけること
- Unityエディタ外での操作(ファイル上書き、ファイル名変更・移動)
- Gitでプロジェクトを更新する前にシーンとプロジェクトを保存(複数人で1つのシーンを編集しない)
次回は、日本各地で開催されているゲーム製作イベントやコンテスト等の様子を紹介します。これらのイベントやコンテストを通じて、ゲーム製作現場の熱を感じていただければと思います。また、ゲーム製作に興味のある方は、ぜひ本連載で学んだことを活かして、イベントやコンテストへ参加できるようになっていただければ幸いです。