TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

Unityで将棋アプリの開発 その2(AIと対局)

先日から作り始めた将棋アプリをAIと対局できるようにした。
f:id:TadaoYamaoka:20220225005750p:plain

とりあえず指せるようにしただけで、形勢グラフなどはできていない。

Unity Barracuda使えなかった

事前に調査したUnity Barracudaだったが、メインスレッドでしか使えないという致命的な欠点があった。

CSharpBurst(CPU)だと、

UnityException: get_isDebugBuild can only be called from the main thread.

というエラーになり、Compute(GPU)だと、

UnityException: SupportsComputeShaders can only be called from the main thread.

というエラーになる。


UIを止めないために、探索はどうしても別スレッドで行う必要がある。
推論をメインスレッドで行うとスレッド間で通信して同期して処理が必要になるが、遅くなるのでそんなことはしたくない。

しかたないので、Unity BarracudaはあきらめてOnnxRuntimeを使うことにした。
OnnxRuntimeは、最近Androidにも対応したのでAndroidでも動くはずだが、実機ではまだ試していない。
また調査事項が増えてしまったorz

とりあえずWindowsで、UnityからOnnxRuntimeを使えるようにした。

こちらの情報を参考に、NuGetForUnityで、

をインストールした。

System.Memory 4.5.3がないというエラーがでるので、NuGetForUnityでインストールしようとしたが、検索結果に4.5.4しか表示されない。
そのため、直接NuGetのサイトからパッケージをダウンロードして、Pluginsフォルダに解凍したlib\netstandard2.0\にあるdllをコピーした。
NuGet Gallery | System.Memory 4.5.3
他にも、System.Runtime.CompilerServices.UnsafeとSystem.Buffersも必要なため、同様にインストールした。
NuGet Gallery | System.Runtime.CompilerServices.Unsafe 4.7.0
NuGet Gallery | System.Buffers 4.5.0

また、UnSafeのプロジェクト設定変更が必要である。
参考:【Unity】Unity 2018.1でunsafeなコードを使う - テラシュールブログ

.onnxは、StreamingAssetsに配置して、C#のコードからは、

Path.Combine(Application.streamingAssetsPath, modelFileName);

のようにしてパスを取得する。
参考:ストリーミングアセット - Unity マニュアル

これで、UnityからOnnxRuntimeで推論が行えるようになった。

Androidの場合は、OnnxRuntimeの別のバージョンが必要になるので、導入方法を調査しないといけない。

まとめ

とりあえず固定ノード数で探索ありのAIと対局できるようになった。
マルチスレッドで使えないことが判明したため、Unity Barracudaの使用はあきらめた。
代わりOnnxRuntimeで推論を行えるようにした。

完成までまだ先は長い・・・