【问题标题】:HowTo: uPD with unity 5如何:使用 unity 5 更新
【发布时间】:2016-10-25 09:10:29
【问题描述】:

第一次发帖。如果我违反任何规则,请告诉我!

我想尝试使用 Pure Data 和 Unity 5。看来uPD 是最合适的。我已按照github page 上的说明加载了第一个示例场景。 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 dll。我替换了 unity 项目中的 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 存储库复制到统一项目,但无济于事。我不知道下一步该去哪里,所以任何帮助都将不胜感激!

进一步的进展

建议尝试NuGet获取绑定dll。在此 - 我收到有关我的统一项目/Visual Studio 解决方案与 nuget 包 libPDBinding 版本 0.10.0 之间的框架不匹配的错误。这与标题为“在 Visual Studio Tools for Unity 中使用 NuGet”的文章中描述的统一配置文件有关。我不能在这里发布链接,因为我太新了。

但是,我认为我成功编译了自己的libPDBinding.dll。很抱歉把它拖出来,只是确保我做对了: 在使用libPD\mingw64_build_csharp.bat 编译了一个x64 版本的libpdcsharp.dll 之后,我在VS 解决方案中引用了这个和libpd\libs\mingw64\libwinthread-1.dll,得到了使用.NET 3.5 构建的LibPDBinding.dll。如前所述,libpdcsharp.dll 是使用批处理/制作文件编译的,所以我是否正确假设该文件已使用正确的设置构建?

我继续复制这 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

再次感谢您的帮助。非常感激。

【问题讨论】:

  • 请注意@Rick,如果您是一位经验丰富的 Unity 开发人员新手。对于像 uPD 这样的东西,你必须在“管理器”类中使用它(管理器类,我的意思是——想象一下你的音效管理器或乐谱管理器——它适用于 Unity 项目的所有场景中的所有内容)。要在 Unity 中执行此操作,请执行此操作...stackoverflow.com/a/35891919/294884
  • 感谢@JoeBlow 的提示。很高兴知道这一点。所以,就目前而言,我绕过了 LibPD 和任何衍生产品,并开始使用Heavy,它解释 PD 补丁并提供编译您自己的 DLL 的源代码。我认为在尝试处理和调试 LibPD 包之前我需要更多经验。

标签: c# unity3d libpd


【解决方案1】:

查看您的错误,libpdcsharp 当前位于<ProjectDirectory>/Assets/Magicolo/AudioTools/PureData/Plugins/

这个DLL文件应该放在<ProjectDirectory>/Asset

另外,请确保 libpdcsharp 是使用 .NET 2.03.5 编译的。如果您使用 .NET 4.0 及更高版本编译它,这将不起作用。

【讨论】:

  • 这有帮助。我不再有 DLL not found 异常,因为 LibPDBinding.dll 是用 .Net 4.x 构建的。我仍然无法让它运行。我添加了有关剩余错误的更多详细信息。多于。谢谢。
【解决方案2】:

我是 LibPD 的 C# 绑定的维护者。

您还需要将链接更改为正确的 libwinpthread-1.dll 版本(64 位而不是 32 位)。在您的最终项目中,您需要所有 3 个 dll:

  • LibPDBinding.dll(托管包装器)
  • libpdcsharp.dll(本机 dll)
  • libwinpthread-1.dll(用于在 Windows 上启用 POSIX 线程)

另外:你试过NuGet的版本吗?无需编译您自己的绑定版本。

编辑:您的警告来自不同的来源:您有两个名为 LibPD 的类,而 C# 编译器不知道该使用哪一个。

我不确定这些类型是否在同一个命名空间中。

如果它们在同一个命名空间中,则更改您的命名空间。

如果它们位于不同的命名空间中,如果您想使用来自 NuGet 的版本,请添加一行 using LibPd = LibPDBinding.LibPD;,如果您想使用您的版本,请添加一行 using LibPd = <yournamespace>.LibPD;

【讨论】:

  • 我在上一篇文章的末尾添加了更多细节。包括所有 DLL 确实减少了错误,但它在运行时仍然失败。让我知道您是否可以提供进一步帮助。谢谢!
  • 你是对的。这让我找到了答案。我应该意识到 uPD 创建者本质上为 libpd 创建了自己的绑定代码,因此存在冲突的命名空间。从项目中删除 LibPDBinding.dll 后,我当然不再有冲突类型错误。剩下的唯一错误是“找不到入口点”,因此我检查了指定的入口点,结果发现是不正确的。或者至少它没有让图书馆发挥作用。
【解决方案3】:

它正在工作。据我所知,uPD github 代码有一个错误。所以希望它得到修复。与此同时,我刚刚从头开始这个过程,这就是我为使 uPD 测试场景在 unity 5 中工作所做的工作:

  1. 从 github 获取 uPD。里面有一个统一包
  2. 从 github 获取 libPD。
  3. 按照 libPD github 页面上的说明编译 x64 libpdcsharp.dll 的版本
  4. 将您的 unity 项目中现有的 libpdcsharp.dll 替换为 你编译的 x64 版本
  5. 在 libpd 文件中找到 libpd\libs\mingw64\libwinthread-1.dll 并 将它放在您的统一项目中 - 与其他 dll 相同的位置就可以了。一世 不要认为将 Dll 放在哪里并不重要(至少它没有 我的测试中的差异)
  6. 运行项目,发现unity中出现错误EntryPointNotFoundException: libpd_safe_init
  7. 双击错误打开问题脚本。
  8. 找到以下代码行:[DllImport("libpdcsharp", EntryPoint="libpd_safe_init")]
  9. 将其更改为[DllImport("libpdcsharp", EntryPoint="libpd_init")] 这是libpdcsharp 中init 函数的真正入口点。我不知道 libpd_safe_init 是什么。

感谢帮助我解决问题并找到问题的贡献者!

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多