非同期処理とは
非同期処理とは2種類の処理が存在し、片方の処理を行っている間に、別の処理をおこなうことができる処理方法である。
今回はUnityで用いられる AsyncOperation型 を用いた処理の解説である。
(情報源は私の学友二人から教えてもらった。本当にありがとう。)
AsyncOperation型について
AsyncOperation型は非同期処理に必要な情報を複数個所持している型である。
所持しているのは以下の3つである
・isDone
動作が終了したか確認する(読み取り専用)
・priority
非同期で読み込む際の優先順位を設定する。
・progress
進捗状況を表示する(読み取り専用)
基本的には一番最初に記載されている「isDone」を使用すればよいだろう。
例文
今回はシーンの切り替えに用いてみる
public class LoadScene :MonoBehaviour
{
//AsyncOperation型を宣言
private AsyncOperation async
void main()
{
LoadScene();
}
void LoadScene()
{
//指定のコルーチンを開始する
StartCoroutine("LoadColtin")
}
IEnumerator LoadColtin()
{
//シーンの読み込みをする(処理が完了するとisDone1がtrueになる)
async = SceneManager.LoadSceneAsync("シーンの名前");
//asyncのisDoneがtrueになっていなければnullを返す。
while (!async.isDone)
{
//ここに同期してる時にしたい処理を記載する
//処理が実行されたらnullを返す
yield return null;
}
}
}
解説
まず始めにmainに記載さえているLoadSceneが呼び出される。
今回は書いていないが、キーによって一度のみ処理する形になっていると思っていてくれると助かります。
次にLoadScene()の内部処理により StartCoroutine("LoadColtin") が実行されます。
StartCoroutineは引数を実行処理します。(今回は LoadColtin)
コルーチンとは簡単に言うと、中断できる処理のまとまりのことである。
数秒後に何か処理を行いたいときや非同期のような処理を作成するときなどに使います。
IEnumeratorについて
取得したコレクションの要素を一つづつ参照する操作をまとめたインターフェースのことである
LoadColtin()**の中身
async = SceneManager.LoadSceneAsync("シーンの名前");
これは SceneManagerに登録されている引数に記載された、シーンの情報を受け取り、そのシーンに切り替わっているかどうかを確認するものである。
ここでシーンが変わっていれば、asyncにはTrueが返されて、async.isDoneがTrueになります。
while文の中身
while (!async.isDone)
{
//ここに同期してる時にしたい処理を記載する
//処理が実行されたらnullを返す
yield return null;
}
これは、async.isDoneがFlaseであれば、nullを返す処理。
この時、{}の中に記載する処理が、ロードしている間に行ってくれる処理となります。(例)ロード画面、結果の計算など
yield return null を記載してNULLを返している理由は、async.isDoneがtrueであると認識されないようにするためである。
yield return nullについて
yield return nullは、処理を1フレーム停止させ、次のフレームから再開させることができます。
これは1フレームだけでなく、
yield return new WaitForSeconds(止めたい秒数);
のような記載方法で、止めたい時間を指定することもできます
コメント
コメントにはログインが必要です