Unity開発時のC++DLL作成の際の注意点
あまりに暑くてプログラムを組む気力がごりごり減ってるはせぽんです。
かといって何もしないのもどうかなと思ったのでブログを書こうかなと…
今回の話は
Unity(C#)からdll(VS C++)の関数呼び出しについて
のお話。
まず基本的な情報に関しては凹みさんの
tips.hecomi.com
を見れば解決すると思います。
じゃあなんで記事書いたの?ってなるのですがマーシャリングやら文字列やらで詰まったのでそれについて少し書こうかなと
そもそもマーシャリングって何?
ってなると思うのですがC#とC++間の橋渡しのようなもの、だと個人的に思っています(違う可能性もあります)。
確かに冷静に考えれば言語が違うのに通じるわけはないので何かしらする必要がある(英語から日本語へ通訳みたいな)とは思いましたが。
マーシャリングの壁?
一応色々あったにはあったのですが今回は特に思い出深い内容を
こちらは対応表になっているのですがdll側はunicodeで作っていたので、[文字列を 2 バイトの Unicode 文字列 LPWStrでマーシャリング ]という例に習って作ったのですが、まぁ、これがとても面倒だったんですよね。
それが
ワイド文字 - Wikipedia ここの内部表現に書いてあるのですが。
しかし、Windowsでは16ビット (UTF-16)、LinuxやmacOSでは32ビット (UTF-32) であるため、その他の環境でもUnicodeを用いた符号化形式であると誤解されて、あるいは仮定してプログラムが作られることがある。
えぇ…('ω' )
これが大体の元凶です、こういう事が初めてだった私にとって「何言ってるんだ?」って感じでした。
一応解決へ・・・
このことをtwitterでつぶやいたところ
twitter.com さんから様々な情報が、色々あるのですが大まかには
などの話をしました、ここでさらに
twitter.com
さんの参戦により解決は加速します
その答えは
UnmanagedType.LPWStrでStringBuilderをMarshalすると、AndroidでもWindowsと同じく16bit幅になる。Androidでのwchar_tは32bitなのに。char16_tを使うのが、Unityネイティブプラグイン開発では正解っぽい
— H.Yoshitaka (@TyounanMOTI) June 26, 2018
という事でした
難しいね!プラグイン作成!
(ここまで話はしましたけどひとまず私はwchar_t使ってます、ちゃんと直さなきゃ)