Unity3Dのプロジェクトでライブラリを使用する

誰かがすべてを1つのプロジェクトに書くのが慣例であるか、またはサードパーティのアセンブリをAssemblyフォルダーに入れることができる(接続されているプラ​​グインの数)ことを誰かが知っているが、誰かがAssemblyフォルダーでライブラリをアセンブルする方法さえ知ることができるしかし、誰がどのように行うかについての情報も、まじめなアプリケーションを書いているかのようにUnity向けにプログラムできるようにプロジェクトをセットアップする方法に関する推奨事項も見ませんでした。

結論としては、通常、アプリケーションはモジュールに分割され、各モジュールは独自の個別のアセンブリに配置されます。 この場合のモジュールまたはライブラリは重要ではありません。アプリケーションを個別のアセンブリに分割する場合、落とし穴もありますが、原則として非常に簡単に行うことが重要です。 主な問題の1つは、Unityの無料版では私のアプローチが機能しないことです(ランタイムでのアセンブリのロードはサポートしていません)が、この場合、最後に説明するファイルシステムリンクに関する解決策があります。

なんで?


アプリケーションを個別のモジュール/ライブラリに分割する理由は何ですか? おそらく、多くの人はコードをライブラリにグループ化することのすばらしさを説明する必要はありませんが、Unityではそれらがなくても生きることができます。 なぜこれをしているのですか? 自分で作成したプロジェクトでも、さまざまなプロジェクトで同じライブラリを使用すると便利です。 まず第一に、自分で書いても。 各ライブラリーをリポジトリーに保持し、ライブラリーのプロジェクトの1つで間違いを見つけて修正した場合、他のプロジェクトからの単純なコミット、プッシュ、およびプールにより、修正はすべてのプロジェクトに反映されます。

プロジェクト組織


私は通常、gitリポジトリのサブモジュールとしてライブラリを使用します。 新しいプロジェクトを開始するとき、使用するライブラリのすべてのサブモジュールを空のリポジトリに追加するだけです。 のようなもの

 git init git submodule add my_rep/systemex.git Libraries/SystemEx 


Librariesフォルダーに常に配置するすべてのライブラリ-とても便利です。 あなたが望むようにすることができます。 各ライブラリには、デフォルト設定のプロジェクトファイルが含まれています。 いくつかの場合を除いて、そこに実際に変更する必要はありません。 3.5に.net frameworkバージョンをインストールしない限り。 ただし、別のニュアンス-ライブラリ内のすべての参照でCopy Local - Falseを設定する必要があります。 これにより、ビルド後のほとんどすべての問題と奇妙な状況が保存されます。

次に、Unityでスタジオ用のプロジェクトファイルを作成します(Visual Studioを使用していますが、アプローチはmonodevelopで機能します)。 Unityは、 _.sln_-csharp.slnAssembly-CSharp.csprojAssembly-CSharp-vs.csprojファイルのようなものを作成します。 彼女は常にこれらのファイルを再作成し、それらに触れる必要はありません。 必要なのは、 _.sln_-bundle.slnコピーして、引き続き作業することです。

次に、空のクラスライブラリに作成します。これは、従来、 Codeを呼び出してソリューションに追加します。 ここで、彼女はすでにすべてのライブラリを参照に追加し、 Copy Local - Trueを設定する必要がありますが、これはデフォルトである必要があります。 このライブラリを使用して2番目に行うことは、 Output Path: ..\Assets\Assemblies\に設定することOutput Path: ..\Assets\Assemblies\ -通常、プロジェクトのルートでこのライブラリを作成し..\Assets\したがって、 ..\Assets\ -Unityが動作するAssetsフォルダとまったく同じになります。 それだけです。コードライブラリを作成し、Assets \ Assemblies \にファイルをアップロードしますAssembly-CSharp.csprojはこれらのファイルを参照し、 Assembly-CSharp.csprojへの参照を追加します。 すべてが時計のように機能するはずです。 唯一の欠点は、ビルドを2回取得する必要があり、 Assembly-CSharp.csprojプロジェクトからのコードのナビゲーションが機能しないことです。

このすべての後、私のソリューションは次のようになります。
画像

Codeプロジェクトでは、プロジェクト間で操作できるゲームロジックを記述します。 しかし、彼はゲームからベジオリを見ないため、 SendMessage介してのみベジオリと通信できます。

ニュアンス


*ライブラリでUnityEngine.dllを使用できます。参照に追加する必要がありますが、 Copy Localオフにする必要があります。そうしないと、アセンブリに移動してUnityが不良になります。
*すべてのライブラリは、 Copy LocalをオフにしてCodeのみに残す必要がありCode 。そうしないと、何か余分なものが引き付けられる可能性があります。 特に、エディターも拡張する場合。 一度、私は理由と解決策を見つけるまで、これでしばらく苦しみました。
*同じ方法でエディターを展開できますが、 Output Path: ..\Assets\Editor\Assemblies\ Code.Editorをレイアウトする必要がありますOutput Path: ..\Assets\Editor\Assemblies\
* Unityは、同じアセンブリが複数のフォルダーにあるかどうかを好みませんし、理解しません。
*このメカニズムは有料版でのみ機能します。 より正確には、彼と無料で作業できますが、そのようなプロジェクトの公開は機能しません。

自由にしたい場合


この場合、フォルダーのファイルシステムをライブラリコードとUnityプロジェクトのAssembliesフォルダーに手動でリンクする必要がある場所でのみ、gitとリポジトリの構造を使用することもできます。 そして、プロジェクトファイルでシャーマナイズする必要はありません。Unityはすべて自分で行います。 のようなもの
 mklink /J .\Assets\Plugins\MathEx .\Libraries\MathEx\Assets\Plugins\MathEx 

この場合、 .\Libraries\MathEx\Assets\Plugins\MathEx .csファイルがあるフォルダー。

ありがとう、誰かが私のアドバイスを参考にしてくれることを願っています。 コードをきれいに保ちます。

upd: ZimMがコメントで書いたように、無料版でもすべてうまくいきます。 そのため、ファイルシステムリンクを使用したマジックは通常必要ありません。 彼に感謝します。

upd2:デバッグおよびログの通常の行番号が必要な場合は、UnityVSをインストールする必要があります。UnityVSは無料で、最も重要なことは、すべてのTarget Frameworkプロジェクトで.NET 3.5からUnity 3.5 .net Subset Base Class Libraries、またはその他のUnityに切り替えます3.5 .net

Source: https://habr.com/ru/post/J236755/


All Articles