如何:使用 unity 5 更新
HowTo: uPD with unity 5
首先post。如果我违反任何规则,请告诉我!
我想尝试使用 Pure Data 和 Unity 5。似乎 uPD would be the best fit. I have followed the instructions on the github page 并加载了第一个示例场景。统一控制台报告 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 dll。我在统一项目中替换了 libpdcsharp.dll,控制台现在报告:
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 之间框架不匹配的错误。这与标题为 "Using NuGet in Visual Studio Tools for Unity" 的文章中所述的 unity 配置文件有关。我不能在这里 post link 因为我太新了。
不过,我觉得自己编译成功了libPDBinding.dll
。抱歉拖延,只是确保我做对了:
在使用 libPD\mingw64_build_csharp.bat
编译 libpdcsharp.dll
的 x64 版本后,我在 VS 解决方案中引用了这个和 libpd\libs\mingw64\libwinthread-1.dll
并获得了使用 .NET 3.5 构建的结果 LibPDBinding.dll
。如前所述,libpdcsharp.dll
是使用 batch/make 文件编译的,所以我假设此文件是使用正确的设置构建的是否正确?
我继续复制这 3 个 dll 的统一资产文件夹
作为参考,它是一个空白的统一项目,其中 uPD 作为唯一的包,加载到 uPD 示例场景。
我在 运行 时仍然收到一些错误和一些 visual studio 警告,如下所示。
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
再次感谢您的帮助。非常感激。
查看您的错误,libpdcsharp
当前位于 <ProjectDirectory>/Assets/Magicolo/AudioTools/PureData/Plugins/
此 DLL 文件应放在 <ProjectDirectory>/Asset
。
此外,请确保 libpdcsharp
是使用 .NET 2.0 或 3.5 编译的。如果您使用 .NET 4.0 及更高版本编译它,这将不起作用。
我是 LibPD 的 C# 绑定的维护者。
您还需要将 link 更改为正确的 libwinpthread-1.dll 版本(64 位而不是 32 位)。在您的最终项目中,您需要所有 3 个 dll:
- LibPDBinding.dll(托管包装器)
- libpdcsharp.dll(原生dll)
- libwinpthread-1.dll(用于在 Windows 上启用 POSIX 个线程)
另外:您是否尝试过 NuGet 的版本?无需编译您自己的绑定版本。
编辑:您的警告来自不同的来源:您有两个名为 LibPD
的 类,而 C# 编译器不知道是哪一个使用。
我不确定这些类型是否在同一个命名空间中。
如果它们在同一个命名空间中,则更改您的命名空间。
如果它们位于不同的命名空间中,请添加一行 using LibPd = LibPDBinding.LibPD;
如果您想使用来自 NuGet 的版本,或 using LibPd = <yournamespace>.LibPD;
如果您想使用您的版本。
它正在工作。据我所知,uPD github 代码有一个错误。所以希望它得到修复。与此同时,我刚刚从头开始这个过程,这就是我为使 uPD 测试场景在 unity 5 中工作所做的工作:
- 从 github 获取 uPD。那里有一个统一包
- 从 github 获取 libPD。
- 按照 libPD github 页面上的说明编译 x64
libpdcsharp.dll
版本
- 将您的统一项目中现有的 libpdcsharp.dll 替换为
您编译的 x64 版本
- 在 libpd 文件中找到 libpd\libs\mingw64\libwinthread-1.dll 并
将它放在您的统一项目中 - 与其他 dll 相同的地方就可以了。我
不要认为将 Dll 放在哪里并不重要(至少它没有
我的测试有差异)
- 运行 项目并注意到你在 unity 中遇到错误
EntryPointNotFoundException: libpd_safe_init
- 双击错误打开问题脚本。
- 找到以下代码行:
[DllImport("libpdcsharp", EntryPoint="libpd_safe_init")]
- 将其更改为
[DllImport("libpdcsharp", EntryPoint="libpd_init")]
这是libpdcsharp 中init 函数的真正入口点。我不知道 libpd_safe_init 是什么。
感谢帮助我排除故障并找到问题的贡献者!
首先post。如果我违反任何规则,请告诉我!
我想尝试使用 Pure Data 和 Unity 5。似乎 uPD would be the best fit. I have followed the instructions on the github page 并加载了第一个示例场景。统一控制台报告 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 dll。我在统一项目中替换了 libpdcsharp.dll,控制台现在报告:
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 之间框架不匹配的错误。这与标题为 "Using NuGet in Visual Studio Tools for Unity" 的文章中所述的 unity 配置文件有关。我不能在这里 post link 因为我太新了。
不过,我觉得自己编译成功了libPDBinding.dll
。抱歉拖延,只是确保我做对了:
在使用 libPD\mingw64_build_csharp.bat
编译 libpdcsharp.dll
的 x64 版本后,我在 VS 解决方案中引用了这个和 libpd\libs\mingw64\libwinthread-1.dll
并获得了使用 .NET 3.5 构建的结果 LibPDBinding.dll
。如前所述,libpdcsharp.dll
是使用 batch/make 文件编译的,所以我假设此文件是使用正确的设置构建的是否正确?
我继续复制这 3 个 dll 的统一资产文件夹 作为参考,它是一个空白的统一项目,其中 uPD 作为唯一的包,加载到 uPD 示例场景。
我在 运行 时仍然收到一些错误和一些 visual studio 警告,如下所示。
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
再次感谢您的帮助。非常感激。
查看您的错误,libpdcsharp
当前位于 <ProjectDirectory>/Assets/Magicolo/AudioTools/PureData/Plugins/
此 DLL 文件应放在 <ProjectDirectory>/Asset
。
此外,请确保 libpdcsharp
是使用 .NET 2.0 或 3.5 编译的。如果您使用 .NET 4.0 及更高版本编译它,这将不起作用。
我是 LibPD 的 C# 绑定的维护者。
您还需要将 link 更改为正确的 libwinpthread-1.dll 版本(64 位而不是 32 位)。在您的最终项目中,您需要所有 3 个 dll:
- LibPDBinding.dll(托管包装器)
- libpdcsharp.dll(原生dll)
- libwinpthread-1.dll(用于在 Windows 上启用 POSIX 个线程)
另外:您是否尝试过 NuGet 的版本?无需编译您自己的绑定版本。
编辑:您的警告来自不同的来源:您有两个名为 LibPD
的 类,而 C# 编译器不知道是哪一个使用。
我不确定这些类型是否在同一个命名空间中。
如果它们在同一个命名空间中,则更改您的命名空间。
如果它们位于不同的命名空间中,请添加一行 using LibPd = LibPDBinding.LibPD;
如果您想使用来自 NuGet 的版本,或 using LibPd = <yournamespace>.LibPD;
如果您想使用您的版本。
它正在工作。据我所知,uPD github 代码有一个错误。所以希望它得到修复。与此同时,我刚刚从头开始这个过程,这就是我为使 uPD 测试场景在 unity 5 中工作所做的工作:
- 从 github 获取 uPD。那里有一个统一包
- 从 github 获取 libPD。
- 按照 libPD github 页面上的说明编译 x64 libpdcsharp.dll 版本
- 将您的统一项目中现有的 libpdcsharp.dll 替换为 您编译的 x64 版本
- 在 libpd 文件中找到 libpd\libs\mingw64\libwinthread-1.dll 并 将它放在您的统一项目中 - 与其他 dll 相同的地方就可以了。我 不要认为将 Dll 放在哪里并不重要(至少它没有 我的测试有差异)
- 运行 项目并注意到你在 unity 中遇到错误
EntryPointNotFoundException: libpd_safe_init
- 双击错误打开问题脚本。
- 找到以下代码行:
[DllImport("libpdcsharp", EntryPoint="libpd_safe_init")]
- 将其更改为
[DllImport("libpdcsharp", EntryPoint="libpd_init")]
这是libpdcsharp 中init 函数的真正入口点。我不知道 libpd_safe_init 是什么。
感谢帮助我排除故障并找到问题的贡献者!