tanaka's Programming Memo

プログラミングについてのメモ。

Projenyチュートリアル:Unityプロジェクトを作成する

f:id:am1tanaka:20171231170411p:plain

Unity用のパッケージマネージャーであるProjenyを使ってUnityのプロジェクトを作ります。

目次

作るプロジェクトの方針

Projenyは複数のUnityのプロジェクトをまとめて扱えます。しかし、Gitなどでバージョン管理することを考えると、1つのProjenyプロジェクトに全てのUnityのプロジェクトを放り込むより、プロジェクトごとにProjenyプロジェクトを作成して、まとめてGitで管理した方が楽そうです。Asset Storeや共有するパッケージは、全てのProjenyプロジェクトから参照できる場所に配置します。

以下のような4階層にします。

f:id:am1tanaka:20180103005530p:plain

どこを共有するのか、プロジェクトとして分けるのか、Gitで管理できるかなどを考えると、こんな感じかなという提案です。赤の部分は、一度作成したら、他のプロジェクトでも共有するものです。それ以外の3つは、プロジェクトごとに作成するのが良さそうだと考えています。

Projenyプロジェクトのフォルダー以下には、Asset Storeのアセットなどは含まないような構成なので、MITライセンスなどのプロジェクトならGitHubに登録して公開してもよいでしょう。

Asset StoreやカスタムのUnityPackageを入れるCustomPackagesフォルダーやGeneralSharedPackagesフォルダーは共有しないか、共有する場合はプライベートリポジトリーにしたり、限定公開設定のクラウドなどで共有するとよいでしょう。

前提条件

  • Windows7 64-bit
  • Projenyはインストール済み。まだの場合はこちらに従ってインストールしてください
  • Unity2017.3 + Visual Studio 2017
  • Gitをインストール済み

共有部分の作成

まずはProjenyの設定ファイルをユーザーフォルダー直下に作成します。

共通のProjeny.yamlの作成

  • コマンドプロンプトを起動します
  • ユーザーフォルダーの場所で開いていることを確認(別の場所だったら、cd %USERPROFILE%などで移動)
  • prj -ccを実行して、設定ファイルを作成します

f:id:am1tanaka:20180102160657p:plain

PathVars:
    # 全てのProjenyプロジェクトが利用する共有パッケージフォルダー
    SharedUnityPackagesDir: 'C:\Users\YourUserName\Documents\UnityProjeny\GeneralSharedPackages'

    # UseDevenv設定がtrueの場合に利用される設定。
    # Visual Studio Solutionの操作で失敗する場合、以下のパスが正しいか設定する。
    VisualStudioCommandLinePath: 'C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\devenv.com'
    # Package Managerの"Open Solution"ボタンや、`prj -ocs`コマンドを実行した時に使われる。
    VisualStudioIdePath: 'C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\devenv.exe'

# 独自のReleaseソースを指定する。
ReleaseSources:
    - LocalFolder:
        Path: 'C:\Users\YourUserName\Documents\UnityProjeny\CustomPackages'

設定されているパスは、ご自身の環境に合わせて変更してください。また、YourUserNameの場所は、ご自身のユーザー名に変更してください。

フォルダーの作成

  • 必要なフォルダーを作成します。Projeny用のプロジェクトフォルダーを作成したいところへ移動します
  • 以下でフォルダーを作成します(変更しても構いません)
mkdir UnityProjeny
mkdir UnityProjeny\CustomPackages
mkdir UnityProjeny\GeneralSharedPackages

以上で共有部分の作成は完了です。ここまでの作業は、最初の1回だけやります。

Projenyプロジェクトの作成

個別のプロジェクトのためのProjenyプロジェクトを作成します。

  • コマンドプロンプトを開きます(開いていたら、そこで作業を継続して構いません)
  • 先に作成したUnityProjenyフォルダーの中にcdで移動します。
  • 以下のコマンドを実行します。taiken03-201703の部分は例のプロジェクト名なので、自由に変更してください
mkdir taiken03-201703
cd taiken03-201703
prj -cc

これで、プロジェクト用のフォルダーを作成して、cdで中に移動して、以下が自動生成されます。

  • プロジェクト用のProjeny.yaml
  • UnityPackagesフォルダー
  • UnityProjectsフォルダー
  • UnityProjectsフォルダー内のデフォルトのProjenyProject.yaml

このフォルダーのProjeny.yamlは以下のようにしました。

PathVars:
    UnityProjectsDir: '[ConfigDir]/UnityProjects'
    ProjenyPackagesDir: '[ConfigDir]/UnityPackages'
    LogPath: '[ConfigDir]/PrjLog.txt'
    # Unityの場所。デフォルト以外の場所にしていたら、以下を設定すること
    # UnityExePath: 'C:\Program Files\Unity20170300\Editor\Unity.exe'

DefaultProject: taiken03-201703

共有パッケージはホームフォルダーで指定したので、ここではProjenyPackagesDirの設定に変更して、このプロジェクト用のパッケージ置き場を指定しました。また、このフォルダーではデフォルトのプロジェクトはtaiken03-201703なので、その設定を加えました。

Unityのバージョンはプロジェクトごとに異なる可能性があるので、UnityExePathの雛形をコメント行に加えてあります。Unityをデフォルトの場所以外にインストールしていたり、複数バージョンのUnityを利用している場合は、UnityExePathのコメントを外して、使いたいUnityのパスを設定してください。

UnityProjects/ProjenyProject.yamlファイルは以下の通りです。恐らく変更は不要だと思いますが、コメントをつけておきました。これで、このProjenyプロジェクト内で共有するパッケージの場所をProjenyPackagesDir、全てのProjenyプロジェクトで共有するパッケージの場所をSharedUnityPackagesDir、Unityプロジェクト内でのみ使うパッケージの場所をUnityのAssetsフォルダー下のPackagesフォルダーに設定しています。

PackageFolders:
    # このProjenyプロジェクト全体で共有するパッケージフォルダーの指定です
    # 特に問題がなければ、このプロジェクトのパッケージはここに作ります
    - '[ProjenyPackagesDir]'
    # 全てのProjenyプロジェクトで共有するパッケージフォルダーの指定
    - '[SharedUnityPackagesDir]'
    # [ProjectRoot] は UnityProjects/YourProjectName を示します
    # Unityプロジェクト専用のパッケージがあれば、この下に配置します
    - '[ProjectRoot]/Packages'

Unityプロジェクトの作成

Projenyのプロジェクトはできたので、次にUnityプロジェクトを作成します。先に作成したC:\Users\YourUserName\Documents\UnityProjeny\taiken03-201703フォルダーで作業します。

Gitでバージョン管理をしたい場合は、Unity用のプロジェクトを作成する前にGitの初期化をしておきます。これを事前にやっておくことで、.gitignoreファイルが自動的に生成されます(バージョン管理をしない場合は飛ばして構いません)。

git init

次に以下で、Projenyプロジェクト内のUnityProjectsフォルダー内にターゲットとなるプロジェクトを作成して、初期化をします。

prj -p taiken03-201703 -cpr
prj -in

以上で、UnityProjectsフォルダー内にtaiken03-201703フォルダーが作成されて、その中のtaiken03-201703-WindowsフォルダーがUnity用のプロジェクトになります。

作成したプロジェクトの使い方

作成したProjenyプロジェクトは以下のような構成になります。

f:id:am1tanaka:20180102175510p:plain

このフォルダー下は、.gitignoreで定義されたフォルダー以外は全てGitで管理することを想定しています。

それでは、Unityでtaiken03-201703-Windowsフォルダーを開きましょう。

新しいシーンやスクリプトを作成する

ここからの作業は、手順としては公式マニュアルには書かれていないので手探りで理解しました。

Projenyでは、全てのリソースは何からのPackageに属している必要があります。そのため、いきなりシーンを保存しようとしたり、新しいスクリプトを作成すると、以下のようなエラーが発生します。

f:id:am1tanaka:20180102223012p:plain

「Projenyが関知しないところにディレクトリーが作成されたので、このデータを失う可能性がある。全てのユーザーデータは、UnityPackagesディレクトリー内になければならない。」ということです。

では、このUnityプロジェクトのパッケージを作ります。

  • UnityのProjenyメニューからPackage Manager...を選択して開きます

f:id:am1tanaka:20180102181427p:plain

  • 左三角をクリックして、Packagesを表示します

f:id:am1tanaka:20180102223816p:plain

  • "Packages"の下のコンボボックスをクリックして開いて、[ProjenyPackagesDir]を選択します。ここがこのProjenyプロジェクトの共有パッケージで、このプロジェクト用に作成するリソースは基本的にこのパッケージに設定します

f:id:am1tanaka:20180102221710p:plain

  • [New]をクリックします

f:id:am1tanaka:20180102221936p:plain

  • パッケージ名を入力して、"Submit"ボタンをクリックします。パッケージ名はここではtaiken03-201703としました

f:id:am1tanaka:20180102222030p:plain

  • これでパッケージができました。これだけだとまだUnityが使えるようになりません。作成したパッケージをドラッグして、"Assets Folder"にドロップします

f:id:am1tanaka:20180102222214p:plain

  • "Update Directories"ボタンをクリックすると、Directory Linkに反映されて、UnityのProjectビューにtaiken03-201703フォルダーが表示されます

以上でパッケージが出来上がります。これ以降、このプロジェクトのリソースはこのtaiken03-201703フォルダーの中に保存していきます。

簡単なシーンを作ってみる

試しに、球を操作できるような簡単なシーンを作ってみます。

  • ProjenyのPackage Managerはとりあえず不要なので、[x]ボタンをクリックして閉じます
  • Projectビューの"taiken03-201703"を右クリックして、Create -> Folderを選択して、フォルダーを作成します

f:id:am1tanaka:20180102232229p:plain

  • フォルダーの名前をScenesにします
  • [Ctrl]+[S]キーを押して、シーンを保存します
  • "Save Scene"ダイアログが表示されたら、taiken03-201703 -> Scenesと開いて、Tameshiなどのファイル名で保存します

これで以下のようにシーンが保存できました。

f:id:am1tanaka:20180102222906p:plain

これでHierarchyの変更はこのシーンに保存されます。では、球を作成します。

  • HierarchyビューのCreateから3D Object -> Sphereを選択します

f:id:am1tanaka:20180102224106p:plain

  • 操作するためのスクリプトを作成します
  • Hierarchyビューに作成したSphereを選択します
  • Inspectorビューの下の"Add Component"ボタンをクリックして、Physics -> Rigidbodyを設定します
  • Inspectorビューの下の"Add Component"ボタンをクリックして、New Scriptを選択します

f:id:am1tanaka:20180102224331p:plain

  • スクリプト名は適当にSousaなどにしておきます
  • この場所はPackage外ですのでProjenyに怒られます。taiken03-201703パッケージに新しい‘Scripts`という名前のフォルダーを作成して、その中に移動しましょう

f:id:am1tanaka:20180102224548p:plain

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof (Rigidbody))]
public class Sousa : MonoBehaviour {

    [TooltipAttribute("移動速度")]
    public float SPEED = 10f;
    private Rigidbody rb;

    // Use this for initialization
    void Start () {
        rb = GetComponent<Rigidbody>();
        rb.useGravity = false;
    }
    
    // Update is called once per frame
    void Update () {
        Vector3 ctrl = new Vector3(
            Input.GetAxisRaw("Horizontal"),
            Input.GetAxisRaw("Vertical"),
            0f
            );
        Vector3 vel = ctrl.normalized * SPEED;
        rb.velocity = vel;
    }
}

できたら、上書き保存をしてUnityを実行してください。矢印キーや、[W][A][S][D]キーで球が操作できます。

f:id:am1tanaka:20180102225248p:plain

ここまでの作業で、追加されたり変更があったフォルダーやファイルは以下の通りです。

f:id:am1tanaka:20180102225608p:plain

スクリプトやシーンが、"UnityPackages"フォルダーに追加されていることが分かります。本来、Unityのリソースは、Unityプロジェクトフォルダー内の"Assets"フォルダーにあるのですが、Projenyを使うとその構造が変わる、ということが見てとれます。これが、後のAsset Storeや共有パッケージの利用時に役立つのです。

Asset Storeのアセットの利用

Asset Storeのアセットの組み込み方です。これがProjenyを使ってみようと思いたった機能です。

アセットを利用するには、以下の手順を踏みます。

  • Asset Storeからアセットをダウンロード(これまでにダウンロードしたことがあるアセットでは不要です)
  • "Releases"から、共有パッケージにドラッグ&ドロップして加えます
  • パッケージからPluginフォルダーに加えます
  • Directory Linkを更新します

最初のステップは省略できる場合が多いので、まずは"Releases"から共有パッケージに加える作業から試みましょう。

アセットを共有パッケージに加える

Asset Storeのアセットは、共有パッケージフォルダーに展開します。この作業は一度やれば、2回目以降は最初から共有Packagesに列挙されるので飛ばすことができます。

  • UnityのProjenyメニューからPackage Manager...を選択して開きます
  • 赤枠で囲んだ辺りにある左三角ボタンを、"Releases"欄が表示されるまでクリックします

f:id:am1tanaka:20180102181611p:plain

Asset StoreのパッケージはGitで管理したくないので、"SharedUnityPackagesDir"に加えます。

  • ウィンドウ右上の"Packages"の下のコンボボックスをクリックして、[SharedUnityPackagesDir]に変更します。

f:id:am1tanaka:20180103191941p:plain

"SharedUnityPackagesDir"は、ホームフォルダー直下のProjeny.yamlに加えた設定で、Gitで管理しない位置の共有用フォルダーを指しています。使いたいアセットを"Releases"からドラッグして、"Packages"欄の下にドロップして加えていくと、"SharedUnityPackagesDir"で指定したフォルダーにAsset Storeのアセットが展開されていきます。

以下、"Allosaurus"と"Post Processing Stack", "Unity Particle Pack", "Japanese Otaku City"を加えた例です。

f:id:am1tanaka:20180103192127p:plain

足りないアセットをAsset Storeからダウンロードする

必要なアセットが全て揃っていたら、次へ進んでください。使いたいアセットが無かった場合の手順です。

  • UnityのWindowメニューからAsset Storeを開きます
  • Sign in してなかったらします
  • 欲しいアセットを検索して、必要なら購入します
  • "ダウンロード"ボタンをクリックして、ダウンロードします。以下は、Standard Assetsを例にしています

f:id:am1tanaka:20180102233210p:plain

  • ダウンロードが完了したら自動的に展開されて、インポートするかを聞かれますが、インポートはしないでください!

f:id:am1tanaka:20180102233809p:plain

直にインポートしてしまうと、新しいフォルダーを作った時と同様、Projenyが管理するべきフォルダーを無視して読み込んでしまいます。読み込みもProjenyのPackage Mangerで行う必要があります。

必要なアセットを全て上記の流れでダウンロードだけしてください。完了したら、アセットを共有パッケージに加えるの手順で、共有Packageに加えてください。

間違えてインポートしてしまったら

簡単に取り消す方法はないので、一つ一つ削除するしかありません。まずはエラーを確認して、問題のフォルダーを見つけます。

以下のように、"The directories in question are following:"という行と、"UnityEngine.Debug:LogError(Object)"という行の間に、問題のフォルダーが表示されています。

f:id:am1tanaka:20180102235116p:plain

これをProjectビューなどで見つけて削除してください。

f:id:am1tanaka:20180102235406p:plain

削除後、エラーが表示されなくなったらOKです。

PackagesのアセットをPlugins Folderに追加する

ここまでだと、パッケージを展開しただけで、Unityプロジェクトには組み込まれていません。Plugins Folderに読み込む必要があります。

  • Package Managerを開いていなかったら、UnityのProjenyメニューからPackages Manager...を選んで開きます
  • 左右どちらかの三角をクリックして以下の"Packages"と"Project"が表示される画面にします

f:id:am1tanaka:20180103000247p:plain

  • "Packages"の下のコンボボックスが"[SharedUnityPackagesDir]"になっていなかったら、クリックして開いて選択します
  • "Packages"のリストから、使いたいアセットを選択して、"Plugins Folder"にドラッグ&ドロップします。

f:id:am1tanaka:20180103192438p:plain

  • "Update Directories"ボタンをクリックします

以上で、追加したアセットへのDirectory Linkが生成されて、Unityのプロジェクトにアセットが組み込まれます。最初の一回は、リソースの再構築が必要なので、作業が完了するまでしばらく待ってください。以下のウィンドウが表示されたら"I Made a Backup, Go Ahead!"をクリックしてください。

f:id:am1tanaka:20180102184334p:plain

Pluginsフォルダーに追加したので、以下のようにProjectビューのPluginsフォルダー下に配置されます。

f:id:am1tanaka:20180103001157p:plain

一度登録したアセットは、"SharedUnityPackagesDir"を同じ場所に指定すれば、他のProjenyプロジェクトでもすぐにPackages欄から使えるようになります。2回目以降はインポート時間や容量を減らすことができます。

組み込んだアセットの削除方法

先にインストールしたアセットのうち、"Post Processing Stack"は、"Unity Particle Pack"に含まれているので、スクリプトでエラーが発生してしまいました。このような時のアセットの削除方法です。

  • UnityのProjenyメニューからPackage Manager...を選択して開きます
  • Plugins Folderから不要なパッケージを選択します
  • [Delete]キーなどでリストから削除します
  • "Update Directories"ボタンをクリックします

f:id:am1tanaka:20180102185231p:plain

実ファイルを削除しなくても、これでDirectory Linkが削除されて、Unityプロジェクトから削除することができます。

GitHubなどで公開にする時の設定

ここまでの説明では、非公開の共有Packagesと、公開の自分のPackagesの主に2箇所での設定でした。しかし、GitHubで公開を前提とした場合、パスワードや重要な情報はダミーにして、テスト用のものは非公開のPackageを用意した方がよさそうです。

例えば、Projenyプロジェクト直下のProjeny.yamlに、以下のようにIgnorePackagesDirという設定を追加します。

PathVars:
    UnityProjectsDir: '[ConfigDir]/UnityProjects'
    ProjenyPackagesDir: '[ConfigDir]/UnityPackages'
    IgnorePackagesDir: '[ConfigDir]/IgnorePackages'
    LogPath: '[ConfigDir]/PrjLog.txt'
    # Unityの場所。デフォルト以外の場所にしていたら、以下を設定すること
    # UnityExePath: 'C:\Program Files\Unity20170300\Editor\Unity.exe'

DefaultProject: taiken03-201703

次に、同じフォルダーの.gitignoreに以下の設定を追加します(なければファイルを作成します)。

**/IgnorePackages/**
**/IgnorePackages.meta

UnityからProjenyメニューのPackage Manager...を選択して開いて、Projectの"Edit"ボタンをクリックします。

f:id:am1tanaka:20180104002827p:plain

しばらく待つと、Visual Studioなどで、ProjenyProject.yamlファイルが開きますので、以下のように[IgnorePackagesDir]を加えます。

PackageFolders:
    # このProjenyプロジェクト全体で共有するパッケージフォルダーの指定です
    # 特に問題がなければ、このプロジェクトのパッケージはここに作ります
    - '[ProjenyPackagesDir]'
    # 全てのProjenyプロジェクトで共有するパッケージフォルダーの指定
    - '[SharedUnityPackagesDir]'
    # [ProjectRoot] は UnityProjects/YourProjectName を示します
    # Unityプロジェクト専用のパッケージがあれば、この下に配置します
    - '[ProjectRoot]/Packages'

    # GitHubで管理しないパッケージ
    - '[IgnorePackagesDir]`

あとは以下の通り、Unityで設定します。

  • Package Managerで"Packages"を開きます
  • コンボボックスを[IgnorePackagesDir]にします
  • [New]ボタンをクリックして、IgnorePackagesという名前のパッケージを作成します
  • それを"Project"のAssets Folder欄にドラッグ&ドロップして、"Update Directories"をクリックします

以上で、UnityにIgnorePackagesというフォルダーが表示されます。この中に入れたリソースは、GitHubにはアップされません。

まとめ

Projenyでプロジェクトを構築して、リソースの新規作成や組み込み、Asset Storeのアセットの組み込みができるようになりました。

Projenyでは、全てのリソースは何れかのPackageに属さなければいけない、ということを念頭に入れておく必要があります。Packageフォルダー内であれば、削除や追加は普通の操作でできますが、Packageを削除する場合は、Package Managerを使う必要があることも注意です。また、フォルダー構造を変えたら、"Update Directories"をクリックすることも忘れてはいけません。

Asset Storeのアセットのうち、個別のフォルダーやファイルの読み込みをキャンセルしたり、あるプロジェクト向けの改変をしたい時などは、予めプロジェクトを分けるなどの運用上の工夫も必要になりそうです。

学習コストがやや必要で、まだ手放しで利用を推奨できる完成度には至っていないと思います。しかし、一度理解して環境を作ってしまえば、Asset Storeのアセットを使い回す時の手間が減るのと、容量が膨らまないという点だけでも、個人的には大きなメリットだと感じます。また、プロジェクトをPackageごとに簡単にフォルダーに分割できるので、Gitで管理するか楽になりました。

しばらくは使い続けてみようと思います。

参考URL