ブログネタに困ってきたので、 不定期にUnityに関することをまとめていこうかなと思ってます。
第一回は、やっぱりここからかなと思い『プロジェクト』についてです。
プロジェクト(Project)とは?
プロジェクト、日本語としても一般的な単語となっていますが、 「計画」や「企画」といった意味です。
Unityにおいても想像通りの意味でひとつのゲーム開発プロジェクトを表します。 といっても、文書管理なんかは含まないのであくまでゲームプログラム的な意味でですが。
基本的にひとつのゲームに対してひとつのプロジェクトを作成します。
プロジェクトの実体
Unityを起動し"NEW PROJECT"を選択すると、 プロジェクトの新規作成画面が表示され、 適当に項目を選択するとプロジェクトが作成されます。 また、一度作成したプロジェクトは起動画面のショートカットや"OPEN OTHER"から開くことができます。
しかし、Unityは一体何をもってプロジェクトをプロジェクトとして認識しているのでしょうか?
試しに空のフォルダをつくってUnityにプロジェクトとして読み込ませてみます。 すると、Unityはこれをプロジェクトとして認識し、編集画面を表示します。 Unityにとってプロジェクトとは単なるフォルダに過ぎません。 プロジェクトの名前はフォルダの名前になります。
プロジェクトの構造(Structure)
プロジェクトは単なるフォルダではありますが、 Unityがその内容を認識するために内部の構造に関してある程度のルールがあります。 これは「プロジェクト直下のAssetsフォルダをアセットの保存場所とする」というようなものです。 Unityが認識する特殊なフォルダはプロジェクトの作成時、 あるいはそのフォルダが存在しないと判断されたときなどに自動的に作成されます。 特殊なフォルダ(Assetsなど)をリネームしてしまうと存在しないと判断されてしまうため気を付けましょう。
Unityで開発をしていると様々なファイルやフォルダがプロジェクトフォルダ内に作成されますが、 これらはゲームプロジェクトとして必要不可欠な(失われると再生できない)一次的なものと、 高速化や他のツールからの利用のために一次的なファイルから作成された(失われても再生できる)二次的なものに分けられます。
一次的なファイル・フォルダ
一次的な(失われると再生できない)フォルダはAssetsとProjectSettingsのみです。
Assetsフォルダ
Assetsフォルダはプロジェクトの核となるフォルダです。
開発者がゲームに組み込みたいソースコード、画像、音楽、テキスト等はすべてこのフォルダの中に入れます。 また一般的な利用法において、 開発者が唯一Unityエディタを介さずに内部に変更を加えてもよい場所になります。
Assetsフォルダは内部にさらに構造を持っており、 それによってプラグインなどが実現できます。
ProjectSettingsフォルダ
ProjectSettingsフォルダはプロジェクト全体に対する設定を保存しているフォルダです。
内部に含まれるファイルはUnityエディタメニューの「Edit > Project Settings」にて編集された情報です。 またプロジェクトに対応するUnityエディタのバージョンもここに記録されています。
二次的なファイル・フォルダ
二次的な(失われても再生できる)ファイルやフォルダは上記の一次的なもの以外ということになります。
代表的なものを挙げておきますがこれ以外にもあるかもしれません。 またプロジェクト直下にあったからといってUnityが作成したものかどうかはわかりません。 Unityではプロジェクトフォルダがカレントディレクトリとして扱われるため、 例えばプラグインがAssetsフォルダ内には入れたくない情報を保存しているかもしれません。
Libraryフォルダ
Libraryフォルダは円滑な開発を行うためのキャッシュを保存しているフォルダです。
AssetsやProjectSettingsはゲームの情報すべてを内包していますが、 それらの情報はゲーム内にてそのまま使われるとは限りません。 多くの場合、複数の情報を組み合わせてゲームプログラムとして使用するのに最適な情報へと変換されたのちに使用されます。 こういった情報をその都度作成していると非常に時間がかかるため、 一度作成した情報は保存しておいて変更がなければ再利用されます。 この再利用情報(キャッシュ)を保存しているのがLibraryフォルダです。
Libraryフォルダの内容は再生可能だといいましたが、 実はビルドの設定などほんの少しだけ再生できない情報が含まれています。 ゲームに関する内容ではなくエディタに関する内容、 かつプロジェクト固有な設定についてはLibraryフォルダに保存されているのかもしれません。
過去のバージョンのUnityではデフォルトでLibraryフォルダに アセットの依存関係などの一次的な情報が含まれていたようですが、 現在はAssetsフォルダ内の.metaという拡張子のファイル(デフォルトで隠しファイル設定)を用いて保存しているようです。
objフォルダ
プログラムをビルドする際にMonoDevelopやVisual Studioによって作成される一時的なファイルを保存しているフォルダです。
Unityが作成しているものではないためかこれだけ命名規則が違います。
Tempフォルダ
プログラムをビルドする際にUnityによって作成される一時的なファイルを保存しているフォルダです。
Assembly-(CSharpまたはUnityScript)[-vs].(csprojまたはunityproj)
Assetsフォルダ内のスクリプトを編集するためのプロジェクトファイルです。 MonoDevelopやVisual Studioにて読み込むために作成されます。
"CSharp"や"UnityScript"(JavaScript)といった文字列が対象としている言語を表しており、 "-vs"がVisual Studio用であることを示しています。
Assetsフォルダ内にエディタ用スクリプトやプラグインを含めていると、 "Editor"や"Plugins"といった文字列が追加されることもあります。 またVisual Studio Tools for Unity (UnityVS)を利用していると、 さらに名前が変わることがあります。
(プロジェクト名)[-csharp].sln
プロジェクトファイルを管理するためのソリューションファイルです。 プロジェクトファイル同様、MonoDevelopやVisual Studioで読み込むために作成されます。
"-csharp"はVisual Studio用のC#プロジェクト(.csproj)のみを扱うファイルになっています。
(プロジェクト名)[-csharp].userprefs
MonoDevelopが編集状態を保存するために作成するファイルです。
余談1:プロジェクトのバージョン管理システム設定
これまで見てきた通り、 Unityプロジェクトのバージョン管理を行う際、 必要となるのはAssetsフォルダとProjectSettingsフォルダ内のみです。 その他の部分は頻繁に書き換わるためバージョン管理の対象に含めると管理がしづらくなります。
またUnityではバージョン管理システムを用いる際に以下の設定が推奨されています。
Edit > Project Settings > Editor 内の項目
Version Control > Mode : "Visible Meta Files"
Asset Serialization > Mode : "Force Text"
これによりAssetsフォルダ内の.metaファイルから隠しファイル属性が消え、 シーンファイルなどがテキスト形式で出力されるようになります (diffが読めるようになる)。
余談2:プロジェクト名の変更
ここまで読んでいるのであれば蛇足かもしれませんが、 Unityのプロジェクト名はフォルダ名と同一なので、 プロジェクト名を変更したいときにはフォルダ名を変えればそれで済みます。 プロジェクト名に依存している項目も再生成されるので問題ありません (項目を削除せずに変更するとゴミが残る可能性はあります)。 ただし、プラグイン等がプロジェクト名に依存していないとも限らないので十分注意してください。
プロジェクト名を変更するとプロジェクトのパスが変わるため、 起動画面のショートカットは自動的に削除されます。 "OPEN OTHER"から再度プロジェクトを指定すると 変更された名前でショートカットが作成されます。
おわりに
最初なのでサクッと終わらせるつもりで「プロジェクト」にしたのですが、 調べているうちにものすごく長くなってしまった・・・。
ちなみに「一次的」とか「二次的」とかけっこうてきとーに言葉使っているので、 人に話すと伝わらないかもしれません、注意。
参考
https://unity3d.com/jp/learn/tutorials/modules/beginner/architecture/folders-in-version-control
https://docs.unity3d.com/Manual/ExternalVersionControlSystemSupport.html
執筆時のUnityのバージョン:5.1.2