Как: 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:
- Получить UPD от GitHub. Там пакет единства там
- Получите libPD от github.
- Следуйте инструкциям на странице github libPD, чтобы скомпилировать x64-версию libpdcsharp.dll.
- замените существующий libpdcsharp.dll внутри вашего проекта Unity на скомпилированную вами версию x64
- найдите libpd\libs\mingw64\libwinthread-1.dll в файлах libpd и поместите это в ваш проект Unity - там же, где и другие DLL, все в порядке. Я не думаю, что имеет значение, куда вы положили Dll (по крайней мере, это не имело никакого значения в моих тестах)
- Запустите проект и обратите внимание, что вы получаете ошибку в единстве
EntryPointNotFoundException: libpd_safe_init
- дважды щелкните по ошибке, чтобы открыть скрипт проблемы.
- Найдите следующую строку кода:
[DllImport("libpdcsharp", EntryPoint="libpd_safe_init")]
- Измените это на
[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;
если вы хотите использовать свою версию.