土鍋で雑多煮

UnityでXR・ゲーム開発をしています。学んだことや備忘録、趣味の記録などを書いていきます。

UniTaskのマルチスレッド処理でGraphics device is null.のエラーが出たときの解決法

どうも、土鍋です。

ハッカソンの作品制作内でマルチスレッドで受信待ちの処理を作ったのですが、その中で「Graphics device is null.」というエラーが出てアプリが落ちるというケースに遭遇したので、その解消法について書きます。

UniTaskのRunOnThreadPoolでマルチスレッド処理

NetworkManagerというクラス内でUniTask.RunOnThreadPoolを使用して別スレッドで受信処理を記述していました。

// 非同期で受信するスレッドを開始
await UniTask.RunOnThreadPool(ReciveData, cancellationToken: token);

その受信処理内で以下のようにSubjectをOnNextしていました。

subject.OnNext(true);

Subjectは以下のようにIObservableとして外部に公開しました。

public IObservable<bool> testObservable => subject;
private Subject<bool> subject = new Subject<bool>();

別のクラスからそのIObservableを参照し、以下のようにSubscribeしていました。

networkManager.testObservable.Subscribe(x =>
{
    Activate(x);
}).AddTo(this);

と、このように書いていたのですが、ここで「Graphics device is null.」というエラーが出てしまいました。
このエラー、特にエラーがどこで出ているかが特定できないエラーの出方をするので原因を突き止めるのに若干苦労しました。

解決法

ObserveOnMainThread()をくっつけてあげることで解決しました。

これを挟むことでそれ以降のオペレーターをメインスレッドで実行してくれます。

networkManager.testObservable.ObserveOnMainThread().Subscribe(x =>
{
    Activate(x);
}).AddTo(this);

参考文献

qiita.com