Використання бібліотек у проектах на Unity3D

Навіщо розбивати свою програму на окремі модулі/бібліотеки? Можливо багатьом не треба пояснювати чим хороше угруповання коду в бібліотеці, але в Юніті можна жити і без них. Навіщо це я роблю? Мені зручно використовувати одні й самі бібліотеки у різних своїх проектах, навіть самописні. Насамперед навіть самописні. Кожну бібліотеку я зберігаю у своєму репозиторії і якщо в якомусь із проектів знаходжу та виправляю помилку в бібліотеці, то простим комітом, пушем та пулом з інших проектів мої фікси потрапляють у всі проекти.

Організація проекту

Бібліотеки я зазвичай використовую як підмодулі (submodule) в репозиторії гіт. Коли починаю новий проект, то просто додаю до порожнього репозиторію всі підмодулі бібліотек, які я використовуватиму. Щось на зразок

Усі бібліотеки я завжди кладу в папку Libraries – мені так зручно. Ви можете робити, як зручно вам. Кожна бібліотека містить файл проекту з налаштуваннями за промовчанням. Нічого там міняти особливо не треба, окрім деяких випадків. Хіба що встановити версію .net framework у 3.5. А ні, ще один нюанс - у всіх референсів бібліотеки потрібно встановити проперти Copy Local-False. Це позбавить від багатьох проблем і дивацтв після білда.

Далі я створюю в Юніті файли проектів для студії (я використовую visual studio, але підхід працює і для monodevelop). Юніті створює щось на зразок имя_проекта.sln , имя_проекта-csharp.sln і Assembly-CSharp.csproj , Assembly-CSharp-vs.csproj файли. Ці файли вона завжди перетворює і їх чіпати не треба. Що треба зробити - скопіювати имя_проекта.sln в имя_проекта-bundle.sln і далі працювати вже з ним.

Після чого я створюю в порожню бібліотеку класів, яку за традицією називаю Code і додаю до солюшен. Ось їй уже треба додати всі бібліотеки до референсів тавиставити їм Copy Local - True, хоча він повинен стояти за замовчуванням. Друге що треба зробити з цією бібліотекою — задати їй Output Path: ..\Assets\Assemblies\ — зазвичай я створюю цю бібліотеку в корені проекту, тому ..\Assets\ — буде саме тією папкою Assets з якою працює Юніті. І все, збираємо бібліотеку Code, вона викладає файли в Assets \ Assemblies \, Юніті бачить ці файли і додає референси в Assembly-CSharp.csproj . Все має працювати як годинник. Єдині мінуси — треба двічі тиснути білд, і навігація за кодом з проекту Assembly-CSharp.csproj не працюватиме.

Після всього цього мій солюшен виглядає приблизно так:

Юніті

У проекті Code я пишу ігрову логіку, яку можна нишпорити між проектами. Але він не бачить безейвіори з гри, тому може спілкуватися з ними лише через SendMessage

Якщо хочеться безкоштовно

У такому разі можна також використовувати гіт і структуру репозиторію, тільки по місцях доведеться руками робити лінки файлової системи папок з кодом бібліотек в папку Assemblies проекту Юніті. І не треба буде шаманити з файлами проекту, Юніті займатиметься всім сама. Щось типу

В даному випадку .\Libraries\MathEx\Assets\Plugins\MathEx папка де лежать .cs файли.

Спасибі, сподіваюся комусь мої поради стануть у нагоді. Keep your code clean.

upd2: Якщо хочеться дебага, і нормальних номерів рядків у логах, то треба встановити UnityVS, який тепер безкоштовний і найголовніше переключити у всіх проектах Target Framework з .NET 3.5 на Unity 3.5 .net Subset Base Class Libraries, або будь-який інший Unity 3.5 .net

Хардкорна конфа за С++. Ми запрошуємо лише профі.