HowTo: UPD с Unity 5

Первый пост. Дайте мне знать, если я нарушу какие-либо правила!

Я хотел бы поэкспериментировать с Pure Data и Unity 5. Мне кажется, uPD подойдет лучше всего. Я выполнил инструкции на странице github и загрузил первый образец сцены. Консоль Unity сообщает об ошибках с dll:

Failed to load 'Assets/Magicolo/AudioTools/PureData/Plugins/libpdcsharp.dll', expected 64 bit architecture (IMAGE_FILE_MACHINE_AMD64), but was IMAGE_FILE_MACHINE_I386. You must recompile your plugin for 64 bit architecture.

Поэтому я клонировал основной репозиторий libpd и использовал прилагаемый пакетный файл для создания dll x64. Я заменил libpdcsharp.dll в проекте Unity, и теперь консоль сообщает:

DllNotFoundException: Assets/Magicolo/AudioTools/PureData/Plugins/libpdcsharp.dll
LibPDBinding.LibPD.ProcessArgs[Int32] (System.Int32[] args, System.String& debug) (at Assets/Magicolo/AudioTools/PureData/LibPD/LibPDNativeMessaging.cs:402)
LibPDBinding.LibPD.SendMessage[Int32] (System.String receiver, System.String message, System.Int32[] args) (at Assets/Magicolo/AudioTools/PureData/LibPD/LibPDNativeMessaging.cs:354)
(wrapper synchronized) LibPDBinding.LibPD:SendMessage (string,string,int[])
LibPDBinding.LibPD.ComputeAudio (Boolean state) (at Assets/Magicolo/AudioTools/PureData/LibPD/LibPDNativeMethods.cs:238)
(wrapper synchronized) LibPDBinding.LibPD:ComputeAudio (bool)
LibPDBinding.LibPD.Release () (at Assets/Magicolo/AudioTools/PureData/LibPD/LibPDNativeMethods.cs:207)
(wrapper synchronized) LibPDBinding.LibPD:Release ()
LibPDBinding.LibPD.ReInit () (at Assets/Magicolo/AudioTools/PureData/LibPD/LibPDNativeMethods.cs:79)
(wrapper synchronized) LibPDBinding.LibPD:ReInit ()
LibPDBinding.LibPD..cctor () (at Assets/Magicolo/AudioTools/PureData/LibPD/LibPDNativeMethods.cs:65)
Rethrow as TypeInitializationException: An exception was thrown by the type initializer for LibPDBinding.LibPD
Magicolo.AudioTools.PureDataBridge.SetAudioSettings () (at Assets/Magicolo/AudioTools/PureData/PureDataBridge.cs:46)
Magicolo.AudioTools.PureDataBridge.StartLibPD () (at Assets/Magicolo/AudioTools/PureData/PureDataBridge.cs:25)
Magicolo.AudioTools.PureDataBridge.Start () (at Assets/Magicolo/AudioTools/PureData/PureDataBridge.cs:50)
PureData.StartAll () (at Assets/Magicolo/AudioTools/PureData/PureData.cs:141)
PureData.Initialize () (at Assets/Magicolo/AudioTools/PureData/PureData.cs:58)
PureData.Awake () (at Assets/Magicolo/AudioTools/PureData/PureData.cs:173)

Я также попытался скопировать файл libPDBinding.dll из основного репозитория libpd в проект единства безрезультатно. Мне не хватает понимания, чтобы знать, куда идти дальше, поэтому любая помощь будет оценена по достоинству!

Дальнейший прогресс

Было предложено попробовать NuGet для получения dll привязки. При этом я получаю сообщение об ошибке о несоответствии структуры между моим решением проекта Unity / Visual Studio и пакетом nuget libPDBinding версии 0.10.0. Это связано с профилями единства, как описано в статье под названием «Использование NuGet в инструментах Visual Studio для Unity». Я не могу разместить ссылку здесь, потому что я слишком новичок.

Тем не менее, я думаю, что мне удалось составить свой собственный libPDBinding.dll. Приношу извинения за затягивание, просто удостоверяюсь, что я делаю это правильно: после использования libPD\mingw64_build_csharp.bat для компиляции x64-версии libpdcsharp.dll я ссылаюсь на это и libpd\libs\mingw64\libwinthread-1.dll в решении VS и получаю результирующий LibPDBinding.dll, который был создан с помощью .NET 3.5. Как уже упоминалось, libpdcsharp.dll был скомпилирован с использованием файла пакетной обработки/создания, поэтому правильно ли я предполагаю, что этот файл был собран с правильными настройками?

Я продолжаю копировать эти 3 dll в папку ресурсов единства. Для справки, это пустой проект единства с uPD в качестве единственного пакета, загруженного в пример сцены uPD.

Я все еще получаю некоторые ошибки во время выполнения и некоторые предупреждения визуальной студии следующим образом.

Ошибка выполнения Unity:

EntryPointNotFoundException: libpd_safe_init
LibPDBinding.LibPD.ReInit () (at Assets/Magicolo/AudioTools/PureData/LibPD/LibPDNativeMethods.cs:81)
(wrapper synchronized) LibPDBinding.LibPD:ReInit ()
LibPDBinding.LibPD..cctor () (at Assets/Magicolo/AudioTools/PureData/LibPD/LibPDNativeMethods.cs:65)
Rethrow as TypeInitializationException: An exception was thrown by the type initializer for LibPDBinding.LibPD
Magicolo.AudioTools.PureDataBridge.SetAudioSettings () (at Assets/Magicolo/AudioTools/PureData/PureDataBridge.cs:46)
Magicolo.AudioTools.PureDataBridge.StartLibPD () (at Assets/Magicolo/AudioTools/PureData/PureDataBridge.cs:25)
Magicolo.AudioTools.PureDataBridge.Start () (at Assets/Magicolo/AudioTools/PureData/PureDataBridge.cs:50)
PureData.StartAll () (at Assets/Magicolo/AudioTools/PureData/PureData.cs:141)
PureData.Initialize () (at Assets/Magicolo/AudioTools/PureData/PureData.cs:58)
PureData.Awake () (at Assets/Magicolo/AudioTools/PureData/PureData.cs:173)

Предупреждения Visual Studio x 50 или около того:

Warning CS0436  The type 'LibPD' in 'D:\unity projects\libpdinunity\Assets\Magicolo\AudioTools\PureData\LibPD\LibPdNativeUnity.cs' conflicts with the imported type 'LibPD' in 'LibPDBinding, Version=0.3.0.177, Culture=neutral, PublicKeyToken=null'. Using the type defined in 'D:\unity projects\libpdinunity\Assets\Magicolo\AudioTools\PureData\LibPD\LibPdNativeUnity.cs'.   libpdinunity.CSharp D:\unity projects\libpdinunity\Assets\Magicolo\AudioTools\PureData\PureDataCommunicator.cs  87  Active

Еще раз спасибо за любую помощь. Очень признателен.


person Rick    schedule 25.10.2016    source источник
comment
Просто примечание @Rick, если вы опытный разработчик, плохо знакомый с Unity. Для чего-то вроде uPD вы должны использовать его в классе менеджера (под классом менеджера я просто имею в виду что-то вроде — представьте себе вашего менеджера звуковых эффектов или менеджера партитуры — который доступен для всего во всех сценах проекта Unity). Чтобы сделать это в Unity, вы делаете это... stackoverflow.com/a/35891919/294884   -  person Fattie    schedule 25.10.2016
comment
Спасибо за совет @JoeBlow. Это хорошо знать. Итак, на данный момент я обошел LibPD и любые производные и начал играть с Heavy, который интерпретирует патчи PD и предоставляет исходный код. для компиляции собственных DLL. Я думаю, что мне нужно больше опыта, прежде чем я попытаюсь заняться и отладить пакеты LibPD.   -  person Rick    schedule 30.10.2016


Ответы (3)


Глядя на вашу ошибку, libpdcsharp в настоящее время находится в <ProjectDirectory>/Assets/Magicolo/AudioTools/PureData/Plugins/

Этот файл DLL должен быть помещен в <ProjectDirectory>/Asset.

Кроме того, убедитесь, что libpdcsharp скомпилирован с .NET 2.0 или 3.5. Это не сработает, если вы скомпилируете его с помощью .NET 4.0 и выше.

person Programmer    schedule 25.10.2016
comment
Это помогло. У меня больше нет исключения, связанного с ненайденной библиотекой DLL, и библиотека LibPDBinding.dll создавалась с помощью .Net 4.x. У меня все еще есть проблемы с запуском. Я добавил более подробную информацию об оставшейся ошибке. над. Спасибо. - person Rick; 25.10.2016

Я сопровождаю привязку C# к LibPD.

Также нужно изменить ссылку на правильную версию libwinpthread-1.dll (64 бит вместо 32). В вашем финальном проекте вам нужны все 3 dll:

  • LibPDBinding.dll (управляемая оболочка)
  • libpdcsharp.dll (родная dll)
  • libwinpthread-1.dll (для включения потоков POSIX в Windows)

Также: Пробовали ли вы версию из NuGet? Нет необходимости компилировать собственную версию привязки.

EDIT: ваше предупреждение из другого источника: у вас есть два класса с именем LibPD, и компилятор C# не знает, какой из них использовать.

Я не уверен, находятся ли эти типы в одном и том же пространстве имен.

Если они находятся в одном пространстве имен, измените свое пространство имен.

Если они находятся в разных пространствах имен, добавьте строку using LibPd = LibPDBinding.LibPD;, если вы хотите использовать версию из NuGet, или using LibPd = <yournamespace>.LibPD;, если вы хотите использовать свою версию.

person Residuum    schedule 25.10.2016
comment
Я добавил некоторые подробности в конец моего последнего поста. Включение всех DLL уменьшило количество ошибок, но во время выполнения все еще не работает. Дайте мне знать, если вы можете помочь дальше. Спасибо! - person Rick; 25.10.2016
comment
Ты прав. Это привело меня к поиску ответа. Я должен был понять, что создатель uPD, по сути, создал свой собственный код привязки для libpd, поэтому были конфликтующие пространства имен. После того, как я удалил LibPDBinding.dll из проекта, у меня, конечно же, больше не было ошибки конфликтующего типа. осталась только одна ошибка: точка входа не найдена, поэтому я проверил указанную точку входа, которая оказалась неверной. Или, по крайней мере, это не позволяло библиотеке функционировать. - person Rick; 25.10.2016

Это работает. Насколько я могу судить, в коде UPD на github есть ошибка. Так что надеюсь исправят. Тем временем я только начал процесс с нуля, и вот что я сделал, чтобы тестовая сцена uPD работала в Unity 5:

  1. Получите uPD с github. Там есть пакет единства
  2. Получите libPD с github.
  3. Следуйте инструкциям на странице libPD github, чтобы скомпилировать 64-разрядную версию libpdcsharp.dll.
  4. замените существующую libpdcsharp.dll внутри вашего проекта Unity на скомпилированную версию x64
  5. найдите libpd\libs\mingw64\libwinthread-1.dll в файлах libpd и поместите ее в свой проект единства - там же, где и другая dll, все в порядке. Я не думаю, что имеет значение, куда вы поместите Dll (по крайней мере, в моих тестах это не имело значения).
  6. Запустите проект и обратите внимание, что вы получаете ошибку в единстве EntryPointNotFoundException: libpd_safe_init
  7. дважды щелкните ошибку, чтобы открыть сценарий проблемы.
  8. Найдите следующую строку кода: [DllImport("libpdcsharp", EntryPoint="libpd_safe_init")]
  9. Измените его на [DllImport("libpdcsharp", EntryPoint="libpd_init")] Это реальная точка входа для функции инициализации в libpdcsharp. Я не знаю, что такое libpd_safe_init.

Спасибо участникам, которые помогли мне устранить неполадки и найти проблему!

person Rick    schedule 25.10.2016
comment
libpd_safe_init() был удален в 2014 году. Похоже, что uPD не соответствует API libPd. В качестве примечания: в настоящее время я предлагаю обновление C# API и в ближайшем будущем начну с работы, чтобы привязка была более идиоматической C#. Не стесняйтесь оставлять отзывы: github.com/libpd/libpd/issues/153 - person Residuum; 25.10.2016