アズマ
183 views
タグを編集する

C#非同期処理お勉強

非同期処理とは

非同期処理とは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.isDoneTrueになります。

while文の中身

  while (!async.isDone)
  {
    //ここに同期してる時にしたい処理を記載する

    //処理が実行されたらnullを返す
    yield return null;
  }

これは、async.isDoneFlaseであれば、nullを返す処理。

この時、{}の中に記載する処理が、ロードしている間に行ってくれる処理となります。(例)ロード画面、結果の計算など

yield return null を記載してNULLを返している理由は、async.isDonetrueであると認識されないようにするためである。

yield return nullについて

yield return nullは、処理を1フレーム停止させ、次のフレームから再開させることができます。

これは1フレームだけでなく、
yield return new WaitForSeconds(止めたい秒数);
のような記載方法で、止めたい時間を指定することもできます

この記事はどうでしたか?
👍&ツイートをお願いします!

コメント

コメントにはログインが必要です

アズマ
35 投稿

冒険者ギルド物語2

ゲーム紹介
前作

データ

アイテム
モンスター
スキル
種族
魔造生物
職業
個性

セクレタリについて

セクレタリとは
記事構文一覧

最新の5件

メニュー
読み込み中