Как: UPD с единством 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 и использовал пакетный файл для создания библиотеки 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 в проект Unity безрезультатно. Мне не хватает понимания, чтобы знать, куда идти дальше, поэтому любая помощь будет признательна!

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

Было предложено попробовать NuGet для получения связующего dll. В связи с этим - я получаю сообщение об ошибке несоответствия фреймворка между моим проектом Unity Project/ Visual Studio и пакетом nuget libPDBinding версии 0.10.0. Это связано с профилями Unities, как описано в статье под названием "Использование NuGet в Visual Studio Tools for 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 был скомпилирован с использованием файла batch/make, поэтому правильно ли считать, что этот файл собран с правильными настройками?

Я перехожу к копированию этих 3-х dll в папке активов Unity. Для справки: это пустой проект Unity с 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)

Визуальные студийные предупреждения х 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

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

3 ответа

Решение

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

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

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

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

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

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

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

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

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

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

РЕДАКТИРОВАТЬ: Ваше предупреждение из другого источника: у вас есть два класса с именем LibPDи компилятор C# не знает, какой использовать.

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

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

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

Другие вопросы по тегам