コルーチンで非同期処理を制御、Thread Ninja
今だとAsync/Awaitを使用したほうが良いです。
以前に紹介したとおり、UnityのAPIはスレッドセーフではないのでスレッド上で使用することは出来ない(スレッドセーフはスレッド同期コストが上がるので、普通はやらない)
なので、基本的にUnityのAPIを呼び出したければ、タスクシステムのような形のシステムに処理を移譲して呼び出してやる必要がある。それを手軽に行える[Unity3D]Unityでスレッドを使いつつUnityAPIを使う Spicy Pixel Concurrency Kitのようなアセットがあるが、先日見かけたThread Ninjaが使いやすくて惚れたので紹介しておこうと思う。
このThread Ninjaはコルーチンを非同期で呼び出し、特定のブロックではメインスレッドに同期する事の出来るアセットだ。要するに、単一コルーチン内で同期・非同期を行うことが出来る。
使い方は簡単で、コルーチンをStartCoroutineAsyncで呼ぶと非同期コルーチンになる。例えばBlocking(起動時に5秒止まるコルーチン処理)を呼び出す場合、下のように記述すれば停止せず呼び出す事が出来る。
void Start(){
this.StartCoroutineAsync(Blocking())
}IEnumerator Blocking()
{
// 非同期で実行
Thread.Sleep(5000);
yield return null;
}
もし非同期コルーチン内でUnityのAPIを呼び出したい場合、下のように記述する。要するにJumpToUnityとJumpBackで囲った中が同期処理になる。
void Start(){
this.StartCoroutineAsync(Blocking())
}IEnumerator Blocking()
{
// 非同期で実行
yield return Ninja.JumpToUnity;
// 何かUnityのAPIを利用した処理(同期で実行)
yield return Ninja.JumpBack;
// 非同期で実行
}