Unity как подключить dll

Обновлено: 02.07.2024

Не знаю, как у кого принято, писать всё в одном проекте или кто-нибудь может знает что можно класть сторонние сборки в папку Assembly (как подключаются многие плагины), а кто-то может умеет даже и сам собирать свои библиотеки в папку Assembly, но информации о том кто как делает, и уж каких-то рекомендаций о том как настроить свой проект так, чтобы можно было программировать под Юнити так, как будто вы пишете серьёзное приложение, я не видел.

Суть в том, что обычно приложение разбивается на модули, а каждый модуль кладётся в свою отдельную Сборку. Модуль или библиотека в данном случае не важно, важно что если вам хочется разбить своё приложение на отдельные сборки — то это в принципе достаточно просто сделать, хотя есть и свои подводные камни. Одна из основных проблем — это то что мой подход не будет работать в бесплатной версии Юнити (она не поддерживает загрузку Сборок в рантайме), но и для такого случая есть решение на ссылках файловой системы, о котором расскажу в конце.

Зачем?

Зачем разбивать своё приложение на отдельные модули/библиотеки? Возможно многим не надо объяснять чем хороша группировка кода в библиотеки, но в Юнити можно жить и без них. Зачем делаю это я? Мне удобно использовать одни и те же библиотеки в разных своих проектах, даже самописные. В первую очередь даже самописные. Каждую библиотеку я храню в своём репозитории и если в каком-то из проектов нахожу и исправляю ошибку в библиотеке, то простым коммитом, пушем и пулом из других проектов мои фиксы попадают во все проекты.

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

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

Далее я создаю в Юнити файлы проектов для студии (я использую 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 работать не будет.

image

После всего этого мой солюшен выглядит примерно так:

В проекте Code , я пишу игровую логику, которую можно шарить между проектами. Но он не видит безейвиоры из игры, поэтому может общаться с ними только через SendMessage

Нюансы

* В своих библиотеках можно использовать UnityEngine.dll — нужно лишь просто добавить её в референсы, но ей обязательно выключить Copy Local иначе она уйдёт в Assemblies и Юнити станет плохо.
* У всех библиотек нужно выключить Copy Local и оставить его только у Code , иначе есть шанс что притянется что-то лишнее. особенно если вы также будете расширять редактор. В своё время я какое-то время помучился с этим, пока нашел причину и решение.
* Расширять редактор можно так же, но надо выкладывать Code.Editor в Output Path: ..\Assets\Editor\Assemblies\
* Юнити не любит и не понимает если одна и та же сборка лежит в нескольких папках.
* Механизм работает только для платных версий. Точнее в бесплатной с ним вроде можно работать, но публиковать такие проекты не получится.

Если хочется бесплатно

В таком случае можно так же использовать гит и структуру репозитория, только по мест придётся руками делать линки файловой системы папок с кодом библиотек в папку Assemblies проекта Юнити. И не надо будет шаманить с файлами проекта, Юнити будет заниматься всем сама. Что-то типа

В данном случае .\Libraries\MathEx\Assets\Plugins\MathEx папка где лежат .cs файлы.

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

upd: Как написал в комментах ZimM, в бесплатной версии тоже всё отлично работает. Так что магия с линками файловой системы в общем то не нужна. Спасибо ему за это.

Обычно скрипт в проекте содержится как файл исходного текста и компилируется Юнити при изменении. Однако также возможно компилировать скрипт в динамически связываемую библиотеку (dll) используя внешний компилятор. Результирующая dll может быть затем добавлена к проекту, а содержащиеся в ней классы прикреплены к объекту как обычные скрипты.

It is generally much easier to work with scripts than DLLs in Unity. However, you may have access to third party Mono code which is supplied in the form of a DLL. When developing your own code, you may be able to use compilers not supported by Unity by compiling the code to a DLL and adding it to your Unity project. You may also want to supply Unity code without the source (for example, for an Asset Store product) and a DLL is an easy way to do this.

Создание dll

Путь к dll Юнити обычно такой

…а две нужных dll называются UnityEngine.dll и UnityEditor.dll.

На Виндовс dll могут быт myfqltys в папках, принадлежащих приложению Юнити. Путь обычно такой

…а имена dll такие же как на Мак ОС.

Здесь опция -r указыват путь к библиотекам, включаемым в построение, в данном случае - Юнити библиотекам. Опция -target указывает какой тип построения требуется,- слово “library” используется для построения dll. Имя исходного файла для компилирования ClassesForDLL.cs (предполагается что этот файл в текущей рабочей папке, но вы можете указать полный путь если нужно). Если все пройдет хорошо результирующий dll файл появится в той же папке, что исходный.

Использование dll

После компиляции dll файл может быт просто перетащен в Юнити проект как и любой другой ассет. Dll ассет имеет треугольник раскрывающий содержимое файла для выбора отдельного класса внутри библиотеки. Классы, которые были унаследованы от MonoBehaviour могут быть перетащены на ГеймОбъект как обычные скрипты. Не MonoBehaviour классы могут быт использованы прямо из других скриптов обычным путем.

A folded-out DLL with the classes visible

A folded-out DLL with the classes visible

Step by step guide for Visual Studio

This section explains how to build and integrate a simple DLL example with Visual Studio, and also how to prepare a debugging session for the DLL.

Настройка проекта

Затем нужно заполнить информацию о новой библиотеке:

  • Name это пространство имен (в этом примере, используйте “DLLTest” в качестве названия).
  • Location это корневая папка проекта.
  • Solution name это папка проекта (название solution).

Next, you should add references to the Unity DLLs. In Visual Studio, open the contextual menu for References in the Solution Explorer and choose Add Reference. Then, choose the option Browse > Browse > select file.

At this stage, you will have the option to select the required DLL file. On Mac OS X, the file path is:

On Windows, the path is:

For this example, rename the class to MyUtilities in the Solution browser and replace its code with the following:

Закончив с кодом, соберите проект, и сгенерируйте DLL файл с отладочными символами.

Использование DLL в Unity


Подключение ссылок на внешние dll
Доброго времени суток,я пытаюсь прикрепить модуль для работы с базой данных, который использует.


Подключение внешней dll
подскажите пожалуйста, как делается(синтаксис). сам программист, но так вышло что с dll вообще.

Подключение внешней DLL к WinCC
Доброго времени суток,подскажите решение такой проблемы или направление куда двигаться: создал DLL.

Подключение dll к проекту из внешней директории
Всем привет. Компилятор: mingw IDE: обычный блокнот + консоль Ситуация: Я создаю.

На сколько знаю dll должна быть "помеченой", . т.е в ней должен быть using UnityEgine;

Cr0c, В том то и дело, что не работает. Unity не видит просто эту dll. Выдаёт ошибку:
error CS0246: The type or namespace name `Ixxat' could not be found. Are you missing an assembly reference?

Вообще юнити пишет её тип как Native. Может быть в этом проблема?

Dll должна в себе держать ссылку на UnityEngine.dll (Program Files\Unity\Editor\Data\Managed\UnityEngine.dll) + using UnityEngine;

Prog_maker, То есть, получается, в моём случае не удастся никак подключить? Ну если доступа к исходному коду DLL нет, тогда думаю не получится. Dll должна в себе держать ссылку на UnityEngine.dll

Добавлено через 1 минуту

То есть, получается, в моём случае не удастся никак подключить?

Step by Step Guide for MonoDevelop and Visual Studio

This section explains how to build and integrate a simple DLL example with MonoDevelop and Visual Studio and also how to prepare a debugging session for the DLL.

Setting Up the Project

You then need to fill out the information for the new library:

At this stage, you will have the option to select the required DLL file. On Mac OSX, the file can be found at

pod4444 28 май 2012, 14:35

Поговорим о том как использовать библиотеки классов в своих проектах на .
Для начала рассмотрим несколько плюсов их использования.

Плюсы библиотек классов:

1) в удобном использование namespace
2) классы, которые не являются MonoBehaviour cкрываются -> отсутствие свалки в проекте
3) защита от школьников: многих отпугнет само использование библиотек, а если пройтись обфускатором, то читаемость кода значительно упадет.
4) удобная транспортировка кода, например если Вы используете какой-то врапер функций, очень удобно копировать всего лишь один файл и сразу же приступать к работе.
5) хранение внутренних ресурсов (картинок, звуков и тд)
6) да просто красиво и удобно (:

Теперь попробуем создать свою библиотеку и запустить с ней проект.

Изображение

Чтобы работать с UnityEngine ее нужно пролинковать, делается это так - в каждой библиотеке есть закладка References в окне Solution Explorer , кликаем правой, выбираем Add Reference

Изображение

Файл UnityEngine.dll находится в %ProgramFiles%\Unity\Editor\Data\Managed\

Изображение

При работе в дальнейшем можно использовать закладку Recent , там хранятся последние использованные библиотеки:

Изображение

После добавления ссылки на библиотеки, она появится в нужной закладке, и в Вашем проекте можно будет писать так using UnityEngine;
Отключим локальное копирование библиотеки, чтобы не было конфликтов, эти библиотеки уже есть в окружении юнити:

Изображение

Изображение

Теперь настроим сохранение сборки в нужное место, т.е в %НашПроектНаЮнити%\Assets\ . Для начала зайдем в настройки нашего проекта Project - Project Properties

Изображение

В закладку Build

Изображение

Там мы увидим поле Output Path . Этот тот путь по которому будет собираться наша библиотека(-и).

Изображение

Не забываем, что у любого проекта есть два состояния Debug\Release и пути сборки у них будут разные, т.е если Вы переключите конфигурацию, то заметите - путь изменился.

Изображение

А так же вам понадобится кнопка Advanced. , находится она снизу в этом же окне

Изображение

Там можно отключить Debug Info , чтобы при сборке у Вас не было символов отладки, если они необходимы, то нужно в настройках проекта в Build Events -> Post-build прописать генерацию поддерживаемых Mono символов (.mdb) строка будет примерно такая
"c:\Program Files (x86)\Unity\Editor\Data\Mono\lib\mono\2.0\pdb2mdb.exe" $(TargetFileName)

Изображение

Сам момент написания кода я затрагивать не буду. Предположим, что Вы уже описали свои классы и пришло время попробовать запустить код в
Чтобы собрать все решение нужно нажать кнопку F6 , соберутся все библиотеки в солюшене, если они изменялись. Чтобы собрать библиотеку под выделением нажимаем Shift+F6 , подробнее можно посмотреть в менюшке Build

Изображение

Если вы правильно указали путь, то .dll окажется сразу в проекте. Все MonoBehaviour можно просмотреть просто раскрыв библиотеку, у меня получилось вот так:

Изображение

Пример решения(Solution) из четырех .dll:

Изображение

В некоторых случаях нужно будет настроить порядок выполнения скриптов, находится это в Edit->Project Settings->Script Execution Order.

Читайте также: