【Ubuntu】コルーチンについて

目次

コルーチンとは

コルーチンとは、実行を停止して Unity へ制御を戻し、その次のフレームで停止したところから続行することができる関数です。

Unityのコルーチンの使い道

  • 処理を指定した時間後に呼び出したい
  • 少しずつ処理を実行したい
  • Update(毎フレーム)更新する必要がないが定期的に処理したい

基本構文

メソッドの定義

コルーチンメソッドはIEnumeratorと付けることで作成できます。

yield return nullを呼び出した行で処理が停止して、次のフレームで停止したところから続行することができます。

1
2
3
4
5
6
7
8
IEnumerator メソッド名(){
// 処理

// 1フレーム待つ
yield return null;

// 処理
}

実行

StartCorutine関数でコルーチンをメソッドを呼び出すことで実行されます。

StartCorutineの引数には、以下の2種類の方法があります。

  • IEnumeratorを定義したメソッドを渡す
  • IEnumeratorを定義したメソッドのメソッド名を渡す

どちらの方法も実行される内容は同じです。

1
2
3
4
5
void Start()
{
StartCoroutine(TestCoroutine());
StartCoroutine("TestCoroutine");
}

引数がある場合の実行

1
2
3
4
5
6
7
8
9
10
11
void Start()
{
StartCoroutine(TestCoroutine(1,"a"));
StartCoroutine("TestCoroutine",1,"a");
}

IEnumerator TestCoroutine(int no,string name){
// 処理
yield return null;
// 処理
}

停止

内部から停止させる

yield break;を停止させたい行に記述します。

このbreakはネストされたループ用のbreakとは違い、一番深いネストでyield break;を呼んだ場合、すべての処理が停止します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private IEnumerator TestCoroutine()
{
int count = 0;
for (; ; )
{
for (; ; )
{
Debug.Log(count);

if (count == 3)
{
// countが3になったら処理が終了
count = 0;
yield break;
}

count++;
yield return new WaitForSeconds(1f);
}
}
}

外部から停止させる

StopCoroutine関数を使用します。開始させた方法によって停止のさせ方も変わります。

  • IEnumeratorを定義したメソッドを渡した場合は、StopCoroutineの引数にStartCoroutineで渡したメソッドと同じ参照のメソッドを渡す
  • IEnumeratorを定義したメソッドのメソッド名を渡した場合は、StopCoroutineの引数に””メソッド名をで指定する

また特徴として、メソッド名を指定して停止させた場合、その時動いているメソッド名と一致するコルーチンすべてが停止します。メソッドの参照を指定している場合は、指定したメソッドのみが停止します。

メソッドを指定した場合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//  メソッドの参照を保持しておく
private IEnumerator _testCoroutine;

void Start()
{
_testCoroutine = TestCoroutine();
StartCoroutine(_testCoroutine);
}

private void Update()
{
if (Input.GetKeyDown(KeyCode.F))
{
StopCoroutine(_testCoroutine);
}
}

メソッド名を指定した場合

1
2
3
4
5
6
7
8
9
10
11
12
13
void Start()
{
StartCoroutine("TestCoroutine");
}

private void Update()
{
if (Input.GetKeyDown(KeyCode.F))
{
// メソッド名を指定した場合
StopCoroutine("TestCoroutine");
}
}
Author

Daiki Iijima

Posted on

2021-10-31

Updated on

2024-04-17

Licensed under