tanaka's Programming Memo

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

Projeny - Unity用のプロジェクトとパッケージマネージャー

f:id:am1tanaka:20171231170411p:plain

Zenjectと同じ開発元からGitHubで公開されているUnity用のプロジェクトとパッケージマネージャーです。ざっくりと、以下のような機能を提供するものです。

  • Assetフォルダーをリンクで構成することで、プロジェクトと、スクリプトやプレハブなどを分離します
  • 分離したスクリプトやプレハブは、他のパッケージやプロジェクトからリンクで参照できます
  • これにより、容量を削減したり、複数のプラットフォーム間での移動を簡易化することができます
  • ダウンロード済みのAsset Storeのデータを管理する機能もあります。

2017/12/31時点では、Unity5.3+Visual Studio 2013向けに開発されたものが提供されています。それが原因か、うちの環境が悪いのか分かりませんが、とりあえずUnity2017.3+Visual Studio 2017だと、Visual Studio Solutionに関連する一部の機能が動作しませんでした。リポジトリーの最終の更新は、1月前ぐらいなので開発が止まっている訳ではないようですが、Zenjectに比べるとIssuesへの対応も鈍く、プロダクトで使うのは不安かも知れません。MITライセンスなのでバリバリ手を入れて使う覚悟があればいいかも知れません。

以下、公式のGitHubページのドキュメントを読んだメモです。2017/12/31現在、使えるのはWindowsのみです。

目次

公式のREADMEをざっと意訳

GitHub - modesttree/Projeny: A project and package manager for Unityのドキュメントのざっとした意訳です。訳の精度は怪しいので、おおよその機能を把握するなどのお役に立てば幸いです。

Introduction

ProjenyはUnity3Dのプロジェクトの肥大化を抑えて開発時間を節約することを目的にしたものです。Projenyは以下のような機能を提供します。

  • コード、シーン、プレハブといったUnityの様々なアセットを、コピー&ペーストなしに複数のプロジェクトで共有
  • プラットフォームを簡単に切り替える
  • インストール済みのAsset Storeのパッケージのアップグレードやダウングレードを簡単に行う
  • 変更されたファイルのみを再コンパイルすることでコンパイル時間を減らす
  • 巨大な一つのUnityプロジェクト内でファイルの関係性を管理するのではなく、プロジェクトをパッケージに分割してそれらの依存関係を管理する
  • パッケージ間の依存関係を記述できるので、ライブラリーやリンク切れの心配なく、パッケージを使える
  • パッケージの依存関係をcsprojに生成して利用することで、Unityが出力するものよりも良質なSolutionファイルを生成できる

ProjenyはUnity 5.3.1以降で動作します。(注:Visual Studioは2013向けです)

インストール

Pythonからソースファイルを直に利用するか、Windows版の64-bitのバイナリーを利用します。2017/12/31現在はWindowsのみ対応で、将来的にOS Xに対応予定となっています。

バイナリーからの利用

ソースからの利用

概要

Projenyは、ジャンクションやシンボリックリンクと呼ばれるディレクトリーのリンクを使って、Unityのプロジェクトを構築します。

サンプルを使って説明します。ここからProjenySamples-vX.X.X.zipをダウンロードして、新しいフォルダーを作成してその中に展開してください。

UnityProjectsフォルダー内に3つのUnityのプロジェクトフォルダーが入っています。それぞれにProjectSettingsフォルダーはありますが、Assetsフォルダーはありません。まだProjenyで初期化をしていないからです。サンプルのルートにProjeny.yamlというテキストファイルがあります。このファイルがProjenyの設定で利用されます。

これらのプロジェクトを初期化するために、コマンドラインを起動して、サンプルのルートフォルダーに移動します。Projeny.yamlがあるフォルダーです。以下を実行すると、初期化されます。

prj --init

f:id:am1tanaka:20171221182357p:plain

f:id:am1tanaka:20171221182542p:plain

インストール後、CubeMoverプロジェクトのフォルダーを見ると、以下のような構成になっています。

  • UnityProjects
    • CubeMover
      • ProjectSettings
      • CubeMover-Windows
        • Assets
          • CubeMover
          • Plugins
            • CommonShapeMover
            • Projeny
        • ProjectSettings

CubeMover-Windows以下が新しく追加されたフォルダーで、お馴染みのAssetsフォルダーが作られています。このフォルダー内に更にCommonShapeMoverCubeMoverといったフォルダーが作られています。

CubeMover-WindowsフォルダーがUnityのプロジェクトフォルダーで、これをUnityで開きます。CubeMoverフォルダー内のCubeMainシーンを開くと、立方体が色を変えながら左右に動くサンプルが確認できます。

f:id:am1tanaka:20171230225534p:plain

新しく作成されたフォルダー内のファイルやフォルダーはリンク形式のもので、実体は他の場所にあります。

Gitなどでバージョン管理をしている場合は、.gitignoreなどを使ってCubeMover-WindowsフォルダーなどのUnityのプラットフォームごとのプロジェクトフォルダーは管理しないようにします。GitかSubversionを利用している場合は、Projenyを初期化した時に自動的にignoreファイルが作られます。以下、.gitignoreに追加される内容です。

/*-Android
/*-Webplayer
/*-WebGL
/*-Linux
/*-OSX
/*-iOS
/*-Windows
/*-UWP
/*.sln
/ProjenyProjectCustom.yaml

該当フォルダーはリンクかUnityが自動生成するファイルのみなので、バージョン管理をする必要はありません。リンク先の実体ファイルは、UnityProjectsフォルダーと同じ階層にあるUnityPackagesフォルダーに入っています。

各プロジェクトフォルダーごとに入っているProjenyProject.yamlというテキストファイルに、Projenyが各プロジェクトとパッケージを結びつける情報が記載されています。このファイルは手作りもできますが、Projenyの組み込みプラグインを使って管理することができます。サンプルのCubeMoverプロジェクトをUnityで開いたら、Projenyメニューから Package Manager...を選ぶと管理ウィンドウを開くことができます。

f:id:am1tanaka:20171221190240p:plain

f:id:am1tanaka:20171221190259p:plain

Projenyを利用するメリット

設定ファイルや沢山のフォルダー、リンクといった複雑な構造を持ち込んでも、Projenyが有利な点を確認していきます。

1 - プロジェクト間でのファイルの共有

リンクを使うことで、コピー&ペーストをせずに、同じパッケージのフォルダーを複数のプロジェクトで共有することができます。DLLを作成して、必要なプロジェクトにコピーする方法はありますが面倒です。

2 - パッケージの組織化とアセットストアの統合

Projenyは、作成したプロジェクトの管理も可能ですが、Asset Storeでインストールしたようなパッケージの管理にも有効です。

Asset Storeで入手したり購入したアセットを、UnityPackagesフォルダーに追加することで、Projectごとに必要なパッケージの組み込みや解除を簡単に行えるようになります。また、Projenyのインターフェースを使うことで、アセットのアップグレードやダウングレードも簡単に行えます。

3 - プラットフォームの切り替え

プロジェクトフォルダー名に-Wiindowsとついていたり、複数のProjectSettingsが用意されているのは、プラットフォームごとに別々のプロジェクトフォルダーをProjenyで作成できるからです。これにより、ビルドターゲットを変更する際のアセットの再構築をせずに済みます。

サンプルにはWindows用の-Windowsプロジェクトしかありませんが、-iOS-Androidといった様々なプラットフォーム用のプロジェクトを作ることが可能です。

ProjenyでメインのProjectSettingsディレクトリーへのリンクを作れば、異なるプラットフォーム間で、同じプロジェクト設定を共有できます。

サンプルのCubeMoverプロジェクトで、ProjenyメニューからChange Platform -> iOSと選べば、動作を確認することができます。

f:id:am1tanaka:20171221193745p:plain

最初の一回はUnityがファイル処理をするために完了に時間がかかりますが、二回目以降はすぐに切り替わるようになります。

バージョン違いのUnityが複数インストールされていた場合、以下のようなエラーが発生する場合があります。

f:id:am1tanaka:20171221193831p:plain

設定ファイルにUnityの実行ファイルへのパスを設定すると直すことができます。補足に方法を記しました。

4 - コンパイル時間の改善

Unityでは、まずPluginsフォルダー内のC#ファイルをコンパイルして、次に他のC#ファイルをコンパイルします。Pluginsフォルダーが変更されていなかった場合、最初のステップは不要になります(実際にはもう少し複雑です。詳細は こちら )。

この性質を利用して、アセットストアなどで入手した更新が不要なパッケージはPluginsフォルダーに配置して、変更する対象のものをAssetsフォルダーに配置することで、コンパイルを効率的にできます。

*-Windowsフォルダーはバージョン管理の対象ではないので、このようなフォルダーの構成の変更が与える影響は少ないです。これらの変更はProjenyのPackage Managerウィンドウで簡単に行えます。

AllMovers-Windowsプロジェクトで例示します。デフォルトのフォルダーは以下のようになっています。

  • AllMovers
  • CommonShapeMover
  • CubeMover
  • Plugins
    • Projeny
  • SphereMover

作業する対象がAllMoversプロジェクトのみであれば、その他のCommonShapeMover, CubeMover, そしてSphereMoverプロジェクトはスクリプトを変更するたびに再コンパイルする必要はありません。そこで、それらのプロジェクトはPluginsフォルダー下に移動します。

ProjenyメニューからPackage Manager...を選択して、管理ウィンドウを開きます。

f:id:am1tanaka:20171221200128p:plain

Editボタンをクリックすると、ProjenyProject.yamlがコードエディターで開かれます。これを手作業で変更することもできますし、GUIで操作することも可能です。ProjenyProject.yamlは以下のような内容です。

AssetsFolder:
- AllMovers
- CommonShapeMover
- CubeMover
- SphereMover
ProjectSettingsPath: '[ProjectRoot]/ProjectSettings'
TargetPlatforms:
- Windows
- UWP

GUIで操作する場合は、CommonShapeMover, CubeMover, そしてSphereMoverプロジェクトをドラッグして、"Plugins Folder"欄にドロップします。

f:id:am1tanaka:20171221200450p:plain

それから"Update Directories"ボタンをクリックすると、ProjenyProject.yamlファイルが更新されて、プロジェクト内のリンクが変更されます。Unityで更新が反映されると、プロジェクトは以下のように変更されます。

f:id:am1tanaka:20171221200654p:plain

(注:変換時にエラーが発生しましたが、実行したら問題なく動作しました。)

これで、AllMoversプロジェクトを更新した時のコンパイル時間の短縮が見込めます。

5 - プラットフォームごとのパッケージフォルダー

Unity5で、プラットフォーム上のDLLの有効無効が設定できるようになりました。DLLをインポートして、Inspectorビューのチェックボタンで切り替えることができますが、Projenyでは同様のことを全てのアセットやフォルダーに対してできます。これは、Projenyがプラットフォームごとに別のフォルダーを生成して、それぞれ異なるパッケージを設定できるからです。

例えば特定のプラットフォーム向けの大量のデータを持つ巨大なリソースフォルダーがあった場合でも、Projenyを使えばプラットフォームごとに別々にリソースフォルダーを持たせることができるので、プラットフォームを切り替える度に発生していた再構築の処理をせずに済みます。

これによりコードも簡単にできます。プラットフォームごとにパッケージフォルダーを持たせるので、#ifdefによるパッケージごとの切り替えコードが不要になり、他のプラットフォームの設定が引き起こすエラーを無くすことができます。

Projeny.yamlリファレンスのところで具体的な使い方などを説明します。

6 - パッケージの依存関係管理

UnityPackagesフォルダーにパッケージを追加する時に、そのパッケージの依存情報も指定することができます。ProjenyがUnityプロジェクトフォルダーを生成するときに、自動的に必要なパッケージが示されます。

この動作は、AllMovers-Windowsプロジェクトで確認できます。ProjenyのPackage Managerをメニューから開いて、プロジェクトセクション内のCommonShapeMover, CubeMover, そしてSphereMoverプロジェクトをDeleteキーや右クリックから"Remove"で削除してみてください。

"Update Directiories"をクリックして処理が完了すると、ProjectビューのPluginsフォルダーに、削除したはずのプロジェクトが残っています。ProjenyProject.yamlファイルからは以下のように設定は消えています。

AssetsFolder:
- AllMovers
ProjectSettingsPath: '[ProjectRoot]/ProjectSettings'
TargetPlatforms:
- Windows
- UWP

しかし、AllMoversパッケージがプロジェクト内にそれらのパッケージの依存情報を持っているのです。Package Managerウィンドウの左端の左三角ボタンをクリックします。

f:id:am1tanaka:20171221224404p:plain

画面が以下のように切り替わって、削除したパッケージがリストに載っているのが確認できます。

f:id:am1tanaka:20171221224515p:plain

先のProjenyProject.yamlの情報に、このプロジェクトで利用できる全てのパッケージ一覧が追加して表示されました。

パッケージリストからAllMoversを右クリックして、Edit ProjenyPackage.yamlを選択すると、UnityPackages/AllMovers/ProjenyPackage.yamlがコードエディターで開きます。

f:id:am1tanaka:20171221225007p:plain

以下のようなファイルです。

Dependencies:
    - CubeMover
    - SphereMover

これにより、AllMoversパッケージは、CubeMoverSphereMoverパッケージに依存していることが分かるので、それらが自動的に追加されたのです。ProjenyPackage.yamlファイルをプロジェクトに追加したら、それ以降は自動的に依存先のプロジェクトが組み込まれます。そして組み込んだプロジェクトの依存関係も確認していくので、CubeMoverSphereMoverが依存しているCommonShapeMoverプロジェクトも組み込まれたのです。

7 - Visual Studio Solutionのカスタマイズ

パッケージ間の依存関係を設定することで、Visual StudioのSolutionファイルを最適化できます。AllMovers-Windowsプロジェクトで動きを確認します。

プロジェクトを開いたら、ProjenyメニューからPackage Manager...を選択して、管理ウィンドウを開いたら、右にある右三角のボタンを以下の画面になるまでクリックします。

f:id:am1tanaka:20171231160837p:plain

"Open Solution"ボタンをクリックすると、Unityで設定したコードエディターが起動します。起動するエディターは、Projeny.yamlファイルのVisualStudioIdePathで以下のように明示的に指定することもできます(注:Visual Studio 2017の場合はパスがC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\devenv.exeなどに変わります。エラーが出ないなら、指定する必要はありません)。

PathVars:
    UnityPackagesDir: '[ConfigDir]/UnityPackages'
    UnityProjectsDir: '[ConfigDir]/UnityProjects'
    LogPath: '[ConfigDir]/PrjLog.txt'
    VisualStudioIdePath: 'C:/Program Files (x86)/Microsoft Visual Studio 12.0/Common7/IDE/devenv.exe'```

Solutionを開くと、"AssetsFolder"と"PluginsFoler"の2つのプロジェクトが確認できます。

f:id:am1tanaka:20171226180934p:plain

"AssetsFolder"には、UnityのAssetsフォルダー内の全てのC#ファイルが含まれます。"PluginsFolder"の方には、Pluginsフォルダー内にあるC#ファイルが含まれます。これがデフォルトの状態です。

Projenyのパッケージマネージャーで、AllMovers, CubeMover, SphereMoverの3つを、"Visual Studio Solution"欄にドラッグ&ドロップして、"Update Solution"ボタンをクリックします。

f:id:am1tanaka:20171226181427p:plain

Visual Studioに切り替えると、再読み込みをするかのウィンドウが表示されるので、再読み込みをします。そうすると、以下のようにプロジェクトが増えました。

f:id:am1tanaka:20171226181537p:plain

移動させたプロジェクトが、別のプロジェクトとして管理されるようになりました。また、先ほどまであった"AssetsFolder"プロジェクトが消えています。"PluginsFolder"は残っていますが、これは"CommonShapeMover"を移動しなかったからです。

このようにするとコードを組み立てるのが便利になる上、モジュール単位での依存関係が設定できるようになり、それが重要な点です。通常のUnityプロジェクトでは、あらゆるコードがプロジェクト内に組み込まれます。小さいプロジェクトならそれでも問題ありませんが、大きなプロジェクトではモジュールごとにコードを分けることができることで、Big Ball Of Mud(大きな泥だんご)にならないで済みます。

算術系のライブラリ集など、一緒に再利用することを前提にしたような場合に、複数のUnityプロジェクトに分けて開発することができます。そのような場合、ライブラリ内の特定のゲームコードを無視できることが重要です。作成している算術ライブラリとゲームのコードを密接に関連させてしまうと、他のプロジェクトで使えなくなってしまうからです。Projenyで生成したSolutionファイルを使ってコンパイルすれば、ゲームコードと算術ライブラリの間に密接な依存関係があって、Unity自身がそれに依存しているとしても、この問題は起きません。

(注:以下、うちのUnity2017.3+Visual Studio 2017の環境では動作しませんでした)

Unityに以下の設定をすることで、Projenyが生成したVisual Studio Solutionファイルをメインで利用しているエディターのデフォルト設定として利用することができます。

  • Unityを開いて、EditメニューからPreferences -> External Toolsを開く
  • "External Script Editor"欄の次にあるドロップダウンをクリック
  • "Browse"をクリック
  • Projenyのインストールフォルダー(デフォルトでは、C:\Program Files (x86)\Projeny)を開いて、ファイルタイプをAll Filesにして、Bin/PrjOpenInVisualStudio.batを設定します

f:id:am1tanaka:20171226215214p:plain

  • "External Script Editor Args"欄に、"$(File)" "$(Line)"を入力します

f:id:am1tanaka:20171226215251p:plain

あとは、Projeny.yamlVisualStudioIdePathの設定をすることで、UnityでC#のファイルをダブルクリックするとProjenyで作成したSolutionで開くようになります。

(注:うちで動かなかったのはここまで)

以下、注意事項です。

  • Package Manager内のVisual Studio Solutionのリストは、ProjenyProject.yamlファイルに保存されます。ここまでの作業をした後に、Package Mangaerの"Edit"ボタンをクリックすると、設定内容を確認することができます
  • C#プロジェクトの依存関係は、先のセクションで説明したProjenyPackage.yamlファイルで定義される依存関係を元に生成されます。Visual Studioで、References(参照) -> Add Reference(参照の追加)をクリックして、Solution -> Projectsで確認することができます
  • Solutionファイルは、UnityProjects/AllMovers-Windows.slnに生成されて保存されます。Unityが生成するSolutionファイルは、UnityProjects/AllMovers-WIndows/AllMovers-Windows.slnに保存されるので、それぞれ別々に存在することになります
  • Solutionファイルとcsprojファイルは自動的に生成されます。プリプロセッサーの定義や出力パスなどを手動で設定する必要はありません。Update Solutionを実行すると、手で加えた変更は上書きされます。また、バージョン管理ツールを利用している場合、csprojファイルやslnファイルは、Assetsフォルダーがignore設定されているので、管理対象外になります。Projenyで更新すれば自動的に再生成されるので、これが問題になることはありません
  • このカスタム設定で生成されたDLLはそのまま使われるのではなく、Unityで再コンパイルされます
  • Solutionファイルはプラットフォームごとに生成されて、それらには対象のプラットフォーム向けのプリプロセッサーの定義が含まれます。これにより、プラットフォームを変更する際に、Visual Studioを一旦閉じて、別のSolutionを開きなおす必要がなくなるので、手間が省けます
  • ProjectリストにはPython正規表現(7.2. re — Regular expression operations — Python 2.7.14 documentation)が使えます。Package ManagerのVisual Studio Solutionリストの何もないところを右クリックして、"Add As Regex..."を選択します。例えば、全てのパッケージのVisual Studioプロジェクトを生成するには、.*正規表現で加えます。Python正規表現が使えます

Asset StoreのアセットとReleasesリストの管理

ProjenyメニューからPackage Managerを開いて、ウィンドウ左にある矢印ボタンを2回押すと、以下のような画面になります。

f:id:am1tanaka:20171221225816p:plain

"Releases"リストは、外部のアセットとそのバージョン番号の一覧です。多くの場合はAsset Storeからダウンロードしたものですが、ローカルPCやリモートファイルサーバーから検索されたその他の情報も列挙されます。デフォルトでは、ProjenyはAsset Storeキャッシュからリストを生成します。

"Releases"から何か一つアセットをドラッグして、右側の"Packages"欄にドロップすると、そのアセットが登録されます(複数バージョンのUnityをインストールしていると、エラーが発生する場合があります。補足に対応方法を書きましたので、エラーが出たら参照してください)。以下、TextMesh Proを追加した時の例です。

f:id:am1tanaka:20171228214420p:plain

"Releases"に表示される名前と"Packages"に表示される名前が一致している必要はありません。Projenyはフォルダー名をデフォルトのPackageの名前として使います。アセットによっては、特定のフォルダー名でなければならない場合があり、そのための仕様です。デフォルトの名前を変更したい場合は、"Packages"に追加したあとに、右クリックメニューから"Rename"をしてください。

"Releases"の方の名前は緑色で表示されます。releaseをインストールするたびに、ProjenyはProjenyInstall.yamlというファイルに新しいパッケージフォルダーを追加します。このファイルには、そのパッケージがどこから得られたかや、バージョンといった情報が含まれます。このファイルによって、Projenyはパッケージがどのreleaseに対応しているかを把握します。サンプルのAllMoversCubeMoverといった独自に作成した簡単なパッケージの場合は、これらはnoneになっている場合が多いです。

このファイルはパッケージのアップグレードやダウングレードが発生するかの確認にも使われます。バージョンの違うアセットを、"Releases"から"Packages"に移動しようとすると、ポップアップが表示されます。アップグレードによって不具合が発生したら、"Releases"一覧に古いバージョンが残っていれば、それに戻せばよいということになります。

"Releases"から"Packages"に追加したら、それを"Project"の"Asset Folder"か"Plugins Folder"に追加して、"Update Directories"ボタンをクリックするのを忘れないでください。その作業をすることでUnityのプロジェクトに反映されます。

"Releases"一覧に新しいアセットを追加したい場合は、まずはAsset Storeで欲しいアセットを必要なら購入した後にダウンロードします。ダウンロード後にインポートするかのダイアログが表示されたらキャンセルします。ProjenyのPackage Managerを開いて、"Refresh"ボタンをクリックすると、新しく入手したアセットが"Releases"に追加されます。

自作アセットを"Releases"に登録する方法や、Asset Storeのキャッシュの応用についてはこちらを参照してください。

複数のパッケージフォルダーを管理する

ここまでは、プロジェクトの全てのパッケージは、定義済みの一つのフォルダーに入っていることを前提にしてきましたが、必要に応じて、パッケージがどこにあるかを示すことで、複数の場所にあるパッケージを定義することができます。この機能は、プロジェクト専用のパッケージを、共有パッケージのUnityPackagesフォルダーと別のフォルダーで管理したい場合に有用です。

All-MoversプロジェクトのAllMovers-Windowsプロジェクトで説明します。UnityからサンプルのAll-Moversフォルダー内のUnityProjects/AllMovers/AllMovers-Windowsフォルダーを開くか、あるいは、コマンドラインから以下を実行することでプロジェクトを開きます。

prj --project AllMovers --openUnity
prj -p am -ou

UnityのProjenyメニューからPackage Manager...を選択してパッケージマネージャーを開きます。左三角のボタンを一回クリックして"Packages"を表示します。枠で囲んだドロップダウンリストをクリックすると、パッケージを読み込む場所を指定できます。

f:id:am1tanaka:20171224193950p:plain

ドロップダウンから"[ProjectRoot]\Packages"を選択します。Packagesのリストが空欄になるので、何もないところを右クリックして、"New Package"を選択します。

f:id:am1tanaka:20171224194305p:plain

Testという名前を入力して[Enter]キーで確定すると、以下のスクリーンショットのようになります。

f:id:am1tanaka:20171224194420p:plain

再び、Packagesの空いているところを右クリックして、今度は"Show Root Folder In Explorer"を選択します。

f:id:am1tanaka:20171224194606p:plain

そうすると、サンプルフォルダー内のUnityProjectsの中のPackagesフォルダー内にTestフォルダーができていることが確認できます。

f:id:am1tanaka:20171224194733p:plain

このPackagesフォルダーの場所を示すリストは、プロジェクトごとにProjenyProject.yamlファイルで管理されます。これで、共有するUnityPackagesフォルダーと、プロジェクトごとのフォルダー内の2ヶ所にパッケージを持てることになります。

UnityProjects/ProjenyProject.yamlを開くと、以下のような設定が確認できます。

PackageFolders:
    - '[SharedUnityPackagesDir]'
    - '[ProjectRoot]/Packages'

このリストがパッケージマネージャーのGUIのドロップダウンに表示されます。

プロジェクト設定の共有

Unityのプロジェクト間でパッケージを共有するのと同様に、プロジェクトの設定も共有することができます。プロジェクトの設定は、UnityのEditメニューのProject Settingsに含まれる全てのメニューの値を含めることができます。この機能は、あるパッケージを少し設定を変更するだけで再利用したい場合などに有用です。

All-Moversプロジェクトで動作を確認します。AllMovers-WindowsフォルダーをUnityで開いたら、ProjenyメニューからChange Project -> Newを選択します。以下のようなポップアップが表示されます。

f:id:am1tanaka:20171228223426p:plain

"Share Project Settings with 'AllMovers'"というチェックボックスがデフォルトではチェックされていないので、チェックします。名前をTestにしたら"Submit"ボタンをクリックします。

これで新しい"Test"というUnityプロジェクトが作成されて、Unityが開きます。このプロジェクトでEditメニューからProject Settingsを選択して設定を変更すると、"AllMovers"と"Test"のどちらのプロジェクトのプロジェクト設定にも反映します。

このプロジェクトの設定は、ProjenyProcest.yamlファイル内で定義されます。パッケージマネージャーの"Edit"ボタンをクリックして開くか、テキストエディターなどでUnityProjects/Test/ProjenyProject.yamlを開くと、以下のような設定が確認できます。

ProjectSettingsPath: '[ProjectRoot]/ProjectSettings'
TargetPlatforms:
- AllMovers
- Windows

このプロジェクトにはまだ何もパッケージを追加していないので、AssetsFolderPluginsFolderの定義はまだありません。

Directory Linkの注意点

  • Unityフォルダー内でのパッケージフォルダーの移動
    • UnityのProjectビュー内のファイルやフォルダーは自由に移動できます。しかし、パッケージフォルダー自身は動かさないようにしてください。そうしないと、Projenyで"Update Directories"を押してDirectory Linksを更新した時に、ファイルが複製されてしまいます。
  • プロジェクトのコピー&ペーストは機能しません
    • フォルダー全体をハードディスクの他の場所にコピー&ペーストすると、ペーストした先の空のDirectory Linksは空になります。この問題を解決するには、コピー&ペーストをした後で、コピー先のフォルダーで prj -cla --init を実行します。これにより、生成されたファイルを全て削除(-cla)してから、全てのプロジェクトのためにDirectory Linksを初期化し直します(--init)。
  • gitなどを利用している場合、git cleanの利用に気をつける必要があります
    • git clean -dfは問題なく動作しますが、git clean -xdf(.gitignoreに指定されているファイルやフォルダーも削除対象にするオプション)ではいくつかのデータを失います。何故なら、git cleanがDirectory Linksを辿った先を削除するからです。UnityProjectsフォルダー内に生成されたファイルだけを削除するつもりが、UnityPackagesディレクトリー内のいくつかのファイルも削除されてしまいます。git clean -dfは、.gitignoreで指定されているファイルやフォルダーを削除対象から除外するので、UnityProjectsフォルダーは対象外なので問題は起きません。-xオプションを指定していた場合、管理対象外のファイルやフォルダーを削除してしいまいます。-xオプションを使いたい場合は、先にprj -claを実行してDirectory Linkを削除してから実行することを推奨します
  • git cleanと異なり、WindowsのExplorerによる削除は安全です
    • Windowsエクスプローラーで、UnityProjectsフォルダー内の異なるプロジェクトを削除した場合は、git cleanとは異なり、UnityPackagesフォルダー内のファイルは一切削除されません。エクスプローラーは、Directory Linksを削除する際に、リンク先を削除するのではなく、参照だけを削除するからです
  • 最初にプロジェクトを開いたあと(あるいは、新しいパッケージを追加したあと)、Unityは以下の警告を表示しますが、無視して構いません
[Asset] is a symbolic link. Using symlinks in Unity projects may cause your project to become corrupted if you create multiple references to the same asset, use recursive symlinks or use symlinks to share assets between projects used with different versions of Unity. Make sure you know what you are doing.

よくある質問

どうやって新しいパッケージを作るのですか?

方法1 - Package Managerを使う

  • UnityのProjenyメニューからPackage Managerを選択
  • 左の三角のボタンをクリックして、Packagesセクションを表示
  • "New"ボタンをクリックするか、右クリックして、"New Package"を選択
  • 新しいパッケージの名前を入力
  • Assets FolderPlugins Folder欄に、作成したパッケージをドラッグ&ドロップ
  • (必要なら)ProjenyPackage.yamlに新しいパッケージを追加する。詳しくは ProjenyPackage.yaml reference を参照

方法2 - 手動

  • UnityPackagesフォルダーを開く
  • 新しく作るパッケージの名前のフォルダーを作成する
  • このパッケージを、ProjenyPackage.yamlProjenyProject.yamlにフォルダー名を追加して加えることができます。
  • (必要なら)ProjenyPackage.yamlに新しいパッケージを追加する。詳しくは ProjenyPackage.yaml reference を参照

新しいプロジェクトの作り方は?

方法1 - Unityで行う

  • ProjenyメニューからCreate Projeny -> New... を選択
  • 新しいプロジェクトの名前を入力して、Project Settingsを共有するかどうかを、チェックボックスのチェックによって設定
  • 新しいプロジェクトをUnityが開き直したら、Package Managerメニューを再び開いて、必要なパッケージの追加などを行う
  • (必要なら)ProjenyProject.yamlに新しいプロジェクトを追加する。詳しくは ProjenyProject.yaml reference を参照

方法2 - コマンドライン

  • コマンドプロンプトPowerShellを開いて、Projeny.yamlファイルがあるフォルダーに移動
  • prj --project MyNewProject --createProjectを実行(あるいは、prj -p MyNewProject -cpr)
  • 以上で完了。Unityで、MyNewProject-Windowsフォルダーを開くことができます
  • (必要なら)ProjenyProject.yamlに新しいプロジェクトを追加する。詳しくは ProjenyProject.yaml reference を参照

Projenyを使ったPackageやProjectを自前で作る方法は?

方法1 - コマンドライン

  • コマンドプロンプトかパワーシェルを開いて、新しくプロジェクトやパッケージを作りたいフォルダーへ移動
  • prj --createConfig(あるいは、prj -cc)を実行
  • Projeny.yamlという名前のファイルが作成されて、基本的な設定が記入されます。詳細は Projeny.yaml リファレンスを参照
    • Projectsの保存場所にUnityProjectsフォルダーを使います
    • Packagesの保存場所にUnityPackagesフォルダーを使います
    • 全てのプロジェクトはUnityProjects/PROJECT_NAME/Packagesフォルダー内にそれぞれ個別のオプションを持ちます
  • 以上が完了したら、新しいプロジェクトを作成するとよいでしょう

方法2 - 手動で行う

  • プロジェクトのルートになるフォルダーを作成します
  • Projeny.yamlという名前のファイルを作成したフォルダー内に作って、以下の内容を記載します
PathVars:
  UnityProjectsDir: '[ConfigDir]/UnityProjects'
  LogPath: '[ConfigDir]/PrjLog.txt'
  • UnityProjectsという名前の新しいフォルダーを作成します
  • 以上が完了したら、新しいプロジェクトを作成するとよいでしょう

UnityのStandard Assetsをインポートする方法は?

Unity5.3.4用の全てのStandard Assetsを、Projenyのパッケージにまとめて、それぞれの依存設定をProjenyPackage.yamlファイルに記載しました。それらは、Release PageStandardAssets-Unity5.3.4.zipをダウンロードすると使えます。ダウンロードしたZIPファイルを、UnityPackagesフォルダーに展開したら、ProjenyのPackage Managerで、必要なアセットをプロジェクトにドラッグ&ドロップしましょう。

Projeny.yaml リファレンス

Projeny.yamlには、Unityなどのツールへのパスや、ログファイルを出力する先などのProjenyの一般的な設定が入っています。

prjコマンドを使って、Projenyをコマンドラインから呼び出すと、以下のパスから設定を読み込もうとします。

  • [Current directory]/Projeny.yaml
  • [User Home Directory]/Projeny.yaml (Johnというユーザー名だった場合、C:/Users/John/Projeny.yaml)

上記の両方に設定ファイルを配置しておくのが一般的です。ホームディレクトリーに設定を置いておくと、Visual StudioやUnityなどのツール用にパスを定義するのが楽になります。

先に記した手順に従って新しいプロジェクトを作成した場合は、Projeny.yamlは以下のようなデフォルト設定の内容になっているでしょう。

PathVars:
    UnityProjectsDir: '[ConfigDir]/UnityProjects'
    LogPath: '[ConfigDir]/PrjLog.txt'

これは、Projenyが要求する最低限の設定です(LogPathは必須ではありませんが、エラーの詳細を知るために設定しておくべきです。Projenyを実行するたびに、指定のパスのPrjLog.txtファイルに、実行結果の情報が書き込まれます。

以下、設定の全リストです。使いやすいようにデフォルト値が設定されているので、必要がなければ設定する必要はありません。#から始まる行はコメントです。

# コマンドラインをよく利用する場合のために、プロジェクトに
# エイリアスを設定することができる。以下、デモプロジェクトの
# 設定例で、`prj -p am`で、`prj -p AllMovers`を実行したのと同等になる。
ProjectAliases:
    am: AllMovers
    cm: CubeMover
    sm: SphereMover

# `-p`オプションなしでコマンドラインから`prj`を実行した場合に
# 実行されるデフォルトのプロジェクト設定
DefaultProject: AllMovers

# Projenyが利用するパスの一覧。
# 設定ファイルで利用する独自のパスを追加してもよい。
# また、`[SOME_ENVIRONMENT_VARIABLE]`などとして、同様にその他の環境設定を追加することもできる。
PathVars:
    # 必須設定。Projenyが利用するプロジェクトの場所を指定。
    UnityProjectsDir: '[ConfigDir]/UnityProjects'

    # ProjenyがUnityを実行する時に呼び出すパス。
    # Unityを以下と異なる場所にインストールしていたら、設定する必要がある。
    UnityExePath: 'C:/Program Files/Unity/Editor/Unity.exe'

    # `-b`や`bf`、`bcs`オプションを利用する際に使われる設定。
    # Visual Studio Solutionファイルの生成に使われる。
    # 以下がデフォルトの設定。Visual Studio Solutionファイル関連の
    # 操作が失敗する場合は、以下の設定の場所を確認して、該当するファイルが
    # なければ、正しい場所を設定すること。
    MsBuildExePath: 'C:/Windows/Microsoft.NET/Framework/v4.0.30319/msbuild.exe'

    # UseDevenv設定がtrueの場合に利用される設定。
    # Visual Studio Solutionの操作で失敗する場合、以下のパスが正しいか設定する。
    # Visual Studio 2017の場合、"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\devenv.com"などに変更。
    VisualStudioCommandLinePath: 'C:/Program Files (x86)/Microsoft Visual Studio 12.0/Common7/IDE/devenv.com'

    # Package Managerの"Open Solution"ボタンや、`prj -ocs`コマンドを実行した時に使われる。
    # Visual Studio 2017の場合、"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\devenv.exe"などに変更。
    VisualStudioIdePath: 'C:/Program Files (x86)/Microsoft Visual Studio 12.0/Common7/IDE/devenv.exe'

    # `prj`コマンドが出力するログファイルを出力する先を設定。
    LogPath: '[ConfigDir]/PrjLog.txt'

Console:
    # 利用するコンソールが多色対応の場合、trueにすることで
    # 警告を黄色、エラーを赤などで表示するようになる。
    UseColors: False

# 独自のReleaseソースを指定する。
# Asset Store以外の自分のパッケージをReleasesに表示したい場合、以下に追加する。
ReleaseSources:
    - LocalFolder:
        Path: 'C:/MyUnityPackages'

    # 複数のローカルフォルダーを指定することもできる。
    - LocalFolder:
        Path: 'G:/NetworkSharedUnityPackages'

    # 複数のファイルサーバーを指定することもできる。
    - FileServer:
        ManifestUrl: 'http://localhost:8092/ProjenyReleaseManifest.txt'

Compilation:
    # この値は、`-b`、`bf`、`bcs`のコマンドラインオプションで利用される。
    # デフォルトでは、Projenyは"MsBuildExePath"で定義されたMsBuildを
    # 使ってSolutionをビルドする。しかし、Visual StudioのGUIを
    # 使ってビルドするために、devenv.exeを使いたい場合もあるかも知れない。
    # その場合、この値を`true`にして、"PathVars"セクションの'VisualStudioCommandLinePath'を
    # 正しく設定する。
    UseDevenv: False

SolutionGeneration:
    # Visual Studioプロジェクトを作成する際に、"DefaultNamespace"内で利用される設定。
    # 外部に出す場合は、設定しておいた方がよさそう。
    RootNamespace: MyCompanyName

Unity:
    # デフォルトで64bit Windows用にビルドさせたい場合は、このオプションを含める。
    Win64IsDefault: True

ProjenyProject.yaml リファレンス

通常はProjenyProject.yamlはUnityのPackage Managerから編集しますが、Package ManagerのGUIには全ての操作が含まれていません(例えば、SolutionフォルダーはPackage Managerからは設定できません)。

ProjenyProject.yamlファイルは複数作成することができるので、プロジェクトごとに設定が可能です。Project名がFooだった場合、Projenyは以下の4箇所を確認します。

  1. UnityProjects/Foo/ProjenyProject.yaml
  2. UnityProjects/Foo/ProjenyProjectCustom.yaml
  3. UnityProjects/ProjenyProject.yaml
  4. UnityProjects/ProjenyProjectCustom.yaml

これらは全て同じ書式で記述します。(3)と(4)は、自動的に全てのプロジェクトから利用されます。そのため、色々なところから利用したいPackageはここに定義するのがよいでしょう。

(2)と(4)は、gitなどのバージョン管理ソフトの対象外にしましょう。それにより、特定のパッケージを開発者ごとに自由に設定できるようになります。例えば、異なる開発者が同じプロジェクトで作業しつつ、別々のプラグインを開発していたり、個別にシーンを持たせたい場合などに、ProjenyProjectCustom.yamlファイルにパッケージを登録します。

ProjenyProject.yamlのフォーマットは以下の通りです。

AssetsFolder:
    - {PackageName}
    - {PackageName}

PluginsFolder:
    - {PackageName}
    - {PackageName}
    - {PackageName}

SolutionProjects:
    - {PackageName}
    - /{PackageNamePattern}
    - /{PackageNamePattern}
    - {PackageName}

SolutionFolders:
    {FolderName}: /{PackageNamePattern}
    {FolderName}: /{PackageNamePattern}

PackageFolders:
    - {DirectoryPath}
    - {DirectoryPath}

TargetPlatforms:
    - Windows
    - WebPlayer
    - Android
    - WebGL
    - OSX
    - Linux
    - iOS
    - UWP

パッケージの指定方法は以下の通りです。

  • {PackageName}は、PackageFoldersフォルダーに含まれる一つのディレクトリー名です
  • {PackageNamePattern}は、Python正規表現を使って、UnityPackagesフォルダー内の一つ以上のパッケージを指定するのに使われます

注記事項です。

  • AssetsFolderカテゴリー以下に並べるパッケージは、Unityのプロジェクト内のAssetsフォルダー内に配置する必要があります
  • PluginsFolderカテゴリー以下に並べるパッケージは、Unityのプロジェクト内のAssets/Pluginsフォルダー内にある必要があります
  • SolutionProjectsカテゴリー以下に並べる全てのパッケージは、それぞれの.csprojファイルが生成されます。ProjenyメニューからUpdate C# Projectや、Update SolutionボタンをPackage Manager内から押した際に、実行されます
    • パッケージ名をそのまま書くのではなく、正規表現を使うことができます。例えば、C#プロジェクトをプロジェクト内の全てのパッケージに対して生成したい場合は、/.*を追加すれば、全てのパッケージに適用されます
  • 生成されるSolutionのフォルダーを作成して、プロジェクト間を関連付けることができます。フォルダーごとに一つの正規表現パターンを持ち、プロジェクトの全リストのフィルターとして使われます。最初に/のプレフィックスが必要です
  • パッケージファイル内で使われる正規表現は、Python正規表現ルールが適用されます

ProjenyPackage.yaml リファレンス

Projectの設定と違い、Packageの設定にはGUIがありません。そのため、設定をするにはProjenyPackage.yamlファイルを直接編集する必要があります。

ProjenyPackage.yamlファイルの最も良く使われるケースは、このパッケージが依存している他のパッケージのリストを以下のように列挙することです。

Dependencies:
    - CubeMover
    - SphereMover

上記は、デモプロジェクトのUnityPackages/AllMovers/ProjenyPackage.yamlの設定です。

このファイルは作らなくても構いません。ない場合は、このパッケージは他のパッケージを自動的に組み込むことはしません。

ProjenyPackage.yamlが取り得る全てのオプションの例を以下に挙げます。

Dependencies:
    - {PackageName}
    - {PackageName}
    - {PackageName}

Extras:
    - {PackageName}
    - {PackageName}

FolderType: {FolderType}

Platforms:
    - {PlatformName}
    - {PlatformName}
    - {PlatformName}

ForcePluginsDirectory: {True/False}
ForceAssetsDirectory: {True/False}
  • {PackageName}は、UnityPackagesフォルダーの名前で指定します
  • DependenciesExtras以下に列挙された全てのPackageは、このパッケージを利用するプロジェクトに自動的に加えられます
    • DependenciesExtrasの唯一の違いは、Dependenciesに定義したパッケージのフォルダー下にはProjenyが自動的にcsprojの依存設定を生成し、Extrasの方はそれをしないという点です。殆どの場合はDependenciesでよいですが、ごく稀にExtrasが必要になる場合があります。例えば、作成しているパッケージをテストする一連の単体テストコードを個別のパッケージとして作成して、それを常に作成しているパッケージと一緒に運用したい場合、Extrasリストが追加場所として適しています。これらをDependenciesに含めると、循環依存になってProjenyがエラーを出力することになります。
  • デフォルトでは、Projenyはパッケージを全てのプラットフォームに対応していると見なします。Platformsリストを追加すると、リストで指定した以外のプラットフォームにはパッケージのリンクが作成されなくなります。リスト中の{PlatformName}として使える文字列は以下の通りです
  • ForcePluginsDirectoryを設定すると、指定のパッケージはAssets/Plugins/PackageNameに配置されます
    • 指定の場所にパッケージを配置することを前提にハードコーディングされている場合があるので、そのための設定です
  • ForceAssetsDirectoryも同様で、Assets/PackageNameに配置されます
  • FolderTypeで以下のようなことが設定できます

カスタムのReleaseのソース

Asset StoreのアセットとReleasesリストの管理のところで触れましたが、Releasesのリストは通常はAsset Storeで入手したアセットのリストですが、その他のソースを加えることもできます。

Asset Storeのキャッシュも含めて、全てのソースは、Unity Packageを集めたものです。

ローカルフォルダーのソースをReleasesに含めたい場合は、Projeny.yamlを開いて、以下のような行を追加して、指定の行に追加したいUnityパッケージを入れます。

ReleaseSources:
    - LocalFolder:
        Path: 'C:/MyLocalFolderSource'

システム全体で共有できるProjenyの設定場所として最適なのは、ユーザーのホームフォルダー直下にProjeny.yamlを配置することです(C:/Users/[Your User Name]/Projeny.yaml)。この場所は、そのユーザーがPC上に作成した全てのProjenyプロジェクトから参照されます。

指定したフォルダーに、.unitypackageファイルをコピー&ペーストして、Package Managerの"Refresh"ボタンをクリックすれば、追加したUnityパッケージがReleasesのリストに表示されるようになります。

複数のローカルフォルダーやネットワーク上のフォルダーをソースとして設定に追加することもできます。

また、MyCustomPackage@1.2.unitypackageなどのようにUnityパッケージ名をつけておけば、バージョンが有効になります。この例の場合、MyCustomPackageのバージョン1.2であることを示しています。この手法はカスタムパッケージのみ必要です。Asset Storeからダウンロードしたアセットのバージョン情報は組み込み済みになっています。

ReleaseソースをLAN上で共有すれば、オフィスなどでの開発ではとても便利になるでしょう。会社などで巨大な一つの"Releases"のコレクションを構築して、それを共有してアクセスすることができます。

ネットワーク共有を利用したくない場合は、File Serverを使ってURLで共有する方法があります。URLを設定したら、ネットワーク上でUnityパッケージにアクセスできる静的なWebサイトを動かします。まずは公開したい.unitypackageファイルを並べたリストを静的なWebサイトに持たせる必要があります。.unitypackageファイルを配置したフォルダーを、PrjUpdateReleaseManifest [directory](Projeny/Binフォルダーにあるバッチファイル)を実行してスキャンします。.unitypackageファイルがあるフォルダーから実行する場合は、単純にPrjUpdateReleaseManifest .でも構いません。そうすると、対象のフォルダーにProjenyReleaseManifest.txtというファイルが作られます。PrjUpdateReleaseManifestを、'watch'オプションを指定して実行すると、指定のフォルダーに.unitypackageをアップロードすると自動的にPrjUpdateReleaseManifest.txtの更新が行われるようになります。

設定が完了したら、以下のような設定をProjeny.yamlに追加することで、File ServerのReleaseソースへの参照が可能になります。

ReleaseSources:
    - FileServer:
        ManifestUrl: 'http://mysharedserver/ProjenyReleaseManifest.txt'

コマンドラインリファレンス

殆どのProjenyのコマンドは、UnityのPackage Managerから実行できます。しかし、Visual Studio Solutkonのビルドなど、一部のことは実行できません。また、サーバーを継続的に更新したり、チームで共有するビルドパイプラインがある場合などは、コマンドラインの方が便利な場合があります。

以下に、prjコマンドに設定できる全てのパラメーターを示します。これらのオプションは自由に組み合わせが可能です。prjは合理的な順位でそれらを実行します。

  • --openDocumentation / -d
  • --project / -p
    • 他のパラメーターにより行う動作の対象プロジェクトを指定します
    • プロジェクトが1つなら、このオプションは省略できます
    • prj -p AllMovers -ulを実行した場合、AllMoversプロジェクトの全てのDirectory Linkを更新します(デフォルトのプラットフォームはWindowsです)
    • 与えられる値は、UnityProjectsフォルダー内にあるフォルダー名です
      • 全てのプロジェクトリストは、-lpコマンドで確認できます
      • ProjenyProject.yamlファイルで定義したプロジェクト名のエイリアスを渡すこともできます
  • --platform / -pl
    • 他のパラメーターによって指定されるコマンドの対象プラットフォームを指定します
    • 省略するとWindowsを対象にします
    • 有効な値は以下の通りです
    • 例えば、prj -p AllMovers -pl ios -ulを実行すると、AllMovers-iOSフォルダー内のDirectory Linkが全て更新されます
  • --updateLinks / -ul
    • 指定のProjectとPlatformのDirectory Linkを全て更新します
    • Projenyは与えられたプロジェクトに関連するProject.yamlファイルを読み込んで、必要な全てのパッケージを割り出して、パッケージごとにAssetsAssets/Pluginsフォルダーへの全てのDirectory Linkを作成します
    • このコマンドを実行する時には、必ずプロジェクトを指定するか、Projeny.yamlファイルにデフォルトのプロジェクトを設定しておく必要があります。また、プラットフォームをオプションで指定できます
  • --listProjects / -lp
    • UnityProjectsフォルダー下にある全てのプロジェクト名や、定義されていたらエイリアスも一覧表示します
  • --updateCustomSolution / -ucs
    • 指定されたプロジェクトとプラットフォームのProjeny.yamlの設定に従って、.csproj.slnファイルを生成します
    • この動作の詳細はVisual Studio Solutionのカスタマイズを参照
    • プロジェクトにDLLを追加したり、Player Settingsの追加や削除をした場合は、このコマンドと一緒に-ussを指定するか、このコマンドを実行する前に実行する必要があります
    • このコマンドを実行する時には、必ずプロジェクトを指定するか、Projeny.yamlファイルにデフォルトのプロジェクトを設定しておく必要があります。また、プラットフォームをオプションで指定できます
  • --updateUnitySolution / -uus
    • スタンドアロンMonoDevelop Solutionを作成するために、Unity.exeを実行します。-ucsコマンドと一緒に使うことができます。この操作は、Unityを起動して、AssetsメニューからOpen C# Projectを実行することと同じです(Visual StudioMonoDevelopのどちらが開くかは関係ありません)。
  • --verbose / -v--veryVerbose / -vv
    • これらのパラメーターは、コンソール出力にどの程度詳細に出力するかのスイッチです。-vを指定するといくらかの詳細が追加出力されて、-vvだとUnityエディターログやVisual Studioなどのログも含めたあらゆる情報が出力されます
  • --buildCustomSolution / -b
    • カスタムのSolutionをビルドします
    • ビルドの際には、UseDevenvの設定に応じて、Projeny.yamlVisualStudioCommandLinePathか、MsBuildExePathの設定を使います
    • -ucsコマンドを使ってカスタムSolutionファイルを生成していない場合、このコマンドは失敗します
    • このコマンドを実行する時には、必ずプロジェクトを指定するか、Projeny.yamlファイルにデフォルトのプロジェクトを設定しておく必要があります。また、プラットフォームをオプションで指定できます
  • --buildFull / -bf
    • このコマンドは、prj -ul -uus -ucs -bを実行することと同じです
      • 与えられたプロジェクトとプラットフォームのリンクと、カスタムSolutioを更新してから、カスタムSolutionでビルドします
    • このコマンドを実行する時には、必ずプロジェクトを指定するか、Projeny.yamlファイルにデフォルトのプロジェクトを設定しておく必要があります。また、プラットフォームをオプションで指定できます
  • --openUnity / -ou
    • 指定のプロジェクト/プラットフォームをUnityで開きます
    • このコマンドを実行する時には、必ずプロジェクトを指定するか、Projeny.yamlファイルにデフォルトのプロジェクトを設定しておく必要があります。また、プラットフォームをオプションで指定できます
  • --openCustomSolution / -ocs
    • 指定のプロジェクト/プラットフォームのカスタムSolutionをVisual Studioで開きます
    • このオプションを実行するには、Projeny.yamlVisualStudioIdePathを設定しておく必要があります
    • -ucsコマンドを使ってカスタムSolutionファイルを生成していない場合、このコマンドは失敗します
    • このコマンドを実行する時には、必ずプロジェクトを指定するか、Projeny.yamlファイルにデフォルトのプロジェクトを設定しておく必要があります。また、プラットフォームをオプションで指定できます
  • --clearProjectGeneratedFiles / -clp
    • 指定のプロジェクトのために生成されたファイルやフォルダーを全て削除します。このコマンドは、実際のファイルやフォルダーは削除しません。このコマンドで削除するのは、指定したDirectory Linkと、Unityが生成したテンポラリーファイルです
    • このコマンドは、プロジェクトをリセットしたい時に便利です。prj -clp -bfとすると、まずはプロジェクトのために生成済みだったファイルを全て削除してから、再生成して、Visual Studio Solutionをビルドします
    • このコマンドを実行する時には、必ずプロジェクトを指定するか、Projeny.yamlファイルにデフォルトのプロジェクトを設定しておく必要があります
  • --clearAllProjectGeneratedFiles / -cla
    • 全てのプロジェクトを対象とした-clpコマンドです
  • --deleteAllLinks / -dal
    • 全てのプロジェクトのDirectory Linkを全て削除します。このコマンドは-inコマンドの逆のものです
  • --init / -in
    • このコマンドは、UnityProjectsフォルダー下の全てのプロジェクトに対して、-ulコマンドを実行することと同じです
  • --deleteProject / -dpr
    • UnityProjectsフォルダーから指定のプロジェクトを削除します
  • --suppressPrompts / -sp
    • 確認プロンプトの省略コマンドです。これを指定しなかった場合、重要な操作の前に確認のプロンプトが表示されます
  • --createProject / -cpr
    • UnityProjectsフォルダー内に新しいプロジェクトを作成します。そして、デフォルト設定がされているProjenyProject.yamlファイルが追加されて、Directory Linkが作成されます
  • --configPath / -cfg
    • メインとなるProjenyProject.yaml設定ファイルのパスを指定します
    • 省略した場合、[CurrentDirectory]/ProjenyProject.yamlを参照します
  • --listPackages / -lpa
    • UnityPackagesフォルダー内にある全てのパッケージを一覧表示します
  • --deletePackage / -dpa
    • UnityPackagesフォルダーから指定のパッケージを削除します
  • --installRelease / -ins
    • 指定のリリースやバージョンのソースをReleaseソースから検索します
  • --listReleases / -lr
    • 全てのReleaseソースにある全てのReleaseを一覧表示します
  • --editProjectYaml / -epy
    • 指定のプロジェクトのProjenyProject.yamlファイルを開きます
  • --createPackage / -cpa
    • 指定の名前のパッケージ用のフォルダーを、UnityPackagesフォルダーの下に作成します

付録

外部リソースを使うことについて

  • DLL内では、UNITY_WEBPLAYERUNITY_5_3といったプリプロセッサーを利用することができないので、プラットフォームごとにDLLを作成することになります。Unity5.3以降であれば、プラットフォームごとにどのDLLを含めるかを指定することができるので、このような使い方が楽になります
  • 外部リソースからコードを利用するには、いくつかの制限があります。特に、カスタムのベースクラスを持ったMonoBehaviourは、GameObjectに追加することができません
  • Unityは、MonoBehaviourがどこにあるかを把握しません。そのため、MonoBehaviourをダブルクリックしても、ソースファイルを開くことができません

補足

以下、マニュアルに載っていないことの補足です。

プラットフォーム切り替えやアセットの管理がうまくいかない時の対処

Unityを複数利用しているなどでインストール先がデフォルトのパス以外だった場合、プラットフォームの切り替えや、アセットの管理をしようとした時にエラーが発生する場合があります。

Can't move assetstore package from Releases section to Packages · Issue #65 · modesttree/Projeny · GitHubに以下のような書き込みがありました。

I managed to fix this by setting the UnityExePath PathVar in the Projeny.yaml to the new Unity.exe path. I had installed more than 1 version of unity.

プロジェクトフォルダー直下にあるProjeny.yamlファイルのPathVar:の要素にUnityExePathを追加することで直せました。自分はOドライブにインストール先を変更していたので、以下のように最後の行を追加しました。

ProjectAliases:
    am: AllMovers
    cm: CubeMover
    sm: SphereMover

PathVars:
    UnityProjectsDir: '[ConfigDir]/UnityProjects'
    SharedUnityPackagesDir: '[ConfigDir]/UnityPackages'
    LogPath: '[ConfigDir]/PrjLog.txt'
    UnityExePath: 'O:\Program Files\Unity20170300\Editor\Unity.exe'

指定するパスは、ご自身の環境に合わせて変更してください。これでプラットフォームの切り替えも、アセットの読み込みもどちらも正常に動くようになりました。エラーが発生した場合はお試しください。

Visual Studio Solutionが開けない場合の対処

サンプルのAllMovesプロジェクトのカスタムのVisual Studio Solutionを開こうとした時に、以下のようなエラーが出て開けませんでした。

f:id:am1tanaka:20171230215408p:plain

Unity Projectsフォルダーの間に改行が入っているのが問題だったようで、別のフォルダーに移動させたところ開けるようになりました。ただ、問題なく開けていたような記憶もあり、本当にこれが原因かは分かりません。とりあえず、エラーが発生してからは、フォルダーを変更してプロジェクトを生成し直したらうまくいきました。因みに、フォルダーの移動後は、コマンドラインProjeny.yamlがある場所から以下を実行して、環境の再構築をしました。

prj -cla -dal -in
prj -ucs -uus -p AllMovers

まとめ

Visual Studio Solutionの辺りで不具合が出ていたり、Unity Collaborateで使えるかや、バージョン管理とどう組み合わせるかなど、確認したいことが残っておりますが、概ね良さそうな感じのツールです。うまくいけば、HDDの容量の削減や、違う場所での作業の効率化ができそうです。あとは使ってみてのお楽しみです。

訳が怪しい部分があれこれあると思いますので、何かあればお知らせいただければ幸いです。

参考URL