最近モノビットエンジンのボイスチャットを使う機会がありまして。
とりあえず引っかかったところをいろいろ書いていきたい。
環境はWindows10、Unity 5.6.1f1、VR VoiceChat 2.1.0です。
目次
opus.dllがみつからないとのエラーが発生する
現象としては以下のエラーが発生します。
DllNotFoundException: opus.dllB.Bu.A (Int32 , Int32 , Int32 , Int32 , Int32 )MonobitEngine.VoiceChat.MonobitStreamingPlayer.SetSamplingRate (Int32 settingSamplingRate)MonobitEngine.VoiceChat.MonobitStreamingPlayer.Start ()
opus.dllが見つからないとのこと。
しかしPlugins以下を確認してみると、opus.dllは確かにあります。
パッケージをAssets直下に展開することで解決する
こちらの現象を解決する方法は、手順通りにパッケージをAssetsの直下に展開することでした。
もっとピンポイントで言うと、PluginsフォルダをAssets/Pluginsに配置すれば解決します。
逆に、手順通りにやっていればよいのにどうして私の環境でこれが発生したかといいますと、Monobitエンジンのパッケージファイルをまとめて管理したくて、Assets/MonobitEngineフォルダを作成してその下に展開していたからですね。
Assets/Pluginsの制約はなくなったはずではなかったか
以前からUnityの仕様として、ネイティブライブラリなどはAssets/Pluginsに配置することとなっていました。
ですけれど最近のUnityでは、Assets直下ではなくてもPluginsは動作するようになっていて、そう変更されたと思っていました。
このあたりの記事だと、Unity5からAssets/Pluginsに縛られないようになるとのことで、公式の特殊フォルダーのドキュメントにもAssets直下のみといった記述はありません。Standard AssetsはAssets直下のみとあるので、同様に制限があれば書いてあるのではと思います。
ただ互換性を維持するために、以前のAssets/Plugins以下の構成によってデフォルトの設定が決まるようにもなっているようです。
しかし使用しているUnityは5.6.1なので、このあたりの制約は取っ払われたはず…と思ってもう少し調べてみると、DLLの呼び出し方によって挙動が変わるみたいなことがわかりました。
「DllImport」で呼び出すDLL名に「.dll」を付けるとAssets直下の制約になる?
DLLにある関数を使うためには、DllImport属性を使用します。
それで例えば、
[DllImport("opus.dll", CallingConvention = CallingConvention.Cdecl)]
と呼び出すと、Assets/Plugins以下になければいけないみたい。
[DllImport("opus", CallingConvention = CallingConvention.Cdecl)]
なら、Assets直下でなくても、Pluginインスペクターで適切な指定がされていればよい。
なんだこの謎動作…互換性維持のため…?
Unityのドキュメントを確認してみると、
なお、PluginName がライブラリのプレフィックス( prefix )やファイル拡張子を含める必要はないことに注意してください
との記述は確かにあります。プラットフォームによってライブラリの拡張子が違う場合があるので、その部分は省略するようにとのこと。
コレに引っかかってるんでしょうか。
DllImportの動作については少し確認してみた程度なので、実際にはこれだけの話ではないのかもしれませんが…
自分でネイティブプラグインを作る機会があれば、呼び出すときの書き方にも気をつけてみるとよいのかもしれません。
使う側としても、ライブラリとかパッケージとかのdllがPluginsに散らばらないと助かりますし…