【Unity】 別スレッド内でMonoBehaviourインスタンスのNULLチェックは出来ない

小ネタ。と言いつつ割と深刻。

ちょっと前にスレッド内の処理で困った事に遭遇したのでメモ。

表題の通り、別スレッド内でMonoBehaviourインスタンスの比較処理(==や!=)を行うと
以下のエラーが出る。

CompareBaseObjectsInternal can only be called from the main thread.
Constructors and field initializers will be executed from the loading thread when loading a scene.
Don't use this function in the constructor or field initializers, instead move initialization code to the Awake or Start function.


まぁ、Unity APIはメインスレッドでしか呼べないやつがここにも、という感じ。
==や!=演算子がオーバーライドされて内部でこのCompareなんたらが呼ばれてるのだろう。

ちなみに参照自体は入れられるので問題ない。


自分はシングルトンのメソッドを呼び出す時に、インスタンスを拾ってきてそれ経由で呼び出すのだが、
実行中にスクリプト編集した時の再コンパイルでstatic変数がnullになる対処をその拾ってくるメソッドに入れている。

それを行っている場合に、インスタンスのnullチェックが入っているので
これを別スレッドから行うとそこでこのエラーが出てしまうのだ。

つまり別スレッドからシングルトンの機能を使えなくなるという状態に陥った。


とは言え、解決方法は簡単だった。

この対処自体が元々再コンパイルによる弊害という通常あり得ないケースなので
そもそもそんな対処を入れなければいいのだ。

というわけで自分はその対処を入れていないただシングルトンインスタンスを返すだけのメソッドを
別に用意して、別スレッドからシングルトンを扱う場合はそれ経由にした。


スレッドを扱う場面は再コンパイルするような事はほぼ100%無いだろうし。

[ 2013年12月07日 11:16:23 : Unity ]

カレンダー

プルダウン 降順 昇順 年別

06月 | 2020年07月 | 08月
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -


全記事表示リンク

全ての記事を表示する

検索フォーム

リンク