強火で進め

このブログではプログラム関連の記事を中心に書いてます。

「第30回代々木Unity勉強会」に行って来ました

募集ページ

【増員100名!】【#TechBuzz】第30回代々木Unity勉強会【テーマ:イテレータとコルーチン 〜Unity ゲームにおける非同期処理〜 / 次世代のプログラミング技術をUnityで!〜UniRx〜】 : ATND
https://atnd.org/events/62313

イテレータとコルーチン 〜Unity ゲームにおける非同期処理〜

【スライド】
https://onedrive.live.com/view.aspx?resid=23A2E4BDDF571935!48128&ithint=file%2cpptx&app=PowerPoint&authkey=!AN2ci-Ql1IoghK8

  • 赤坂玲音(あかさか れおん)
  • エンジニアのためのUnity実践リファレンス
(4月10日発売予定)

並列と並行は異なる

同期処理

非同期処理

最新C#の非同期プログラミング

  • Task, Task クラス
  • async メソッド

Unity では Task も async メソッドも使えない

  • .NET Framework 3.5 相当までの機能しか使えない
  • Task が導入されたのは 4.0 から
  • async メソッドが導入されたのは 5.0 から

Unity の並列・並行プログラミング

  • Unity API はスレッドセーフではない。別のスレッドから呼ぶとエラーとなる

IEnumerable と IEnumerator

IEnumerator の挙動

  • 最初の e.MoveNext() が呼ばれるまではコルーチン内の処理は実行されない
  • 初期状態では Current は未定義
  • MoveNext() を呼ぶ毎に Current が +1 される( 0 から開始)
  • Current が末尾を指している時に MoveNext() を呼んだら false を返す

yield 文

  • yield return は Update() 1回分に相当
  • yield return: 次の要素を返す
  • yield break: 反復子を終了する

(筆者注: yield return の使い方はこんな感じ)

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Test : MonoBehaviour {

	class TestData {
		public IEnumerator<int> GetEnumerator()
		{
			yield return 1;
			yield return 2;
			yield return 3;
		}
	}

	void Start () {
		foreach (int i in new TestData())
		{
			Debug.Log(i);
		}
	}
}

(筆者注: yield break の使い方はこんな感じ)

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Test : MonoBehaviour {

	class TestData {
		public IEnumerator<int> GetEnumerator()
		{
			yield return 1;
			yield break; // 実際には何かの条件に当てはまった時に yield break を実行
			yield return 3;
		}
	}

	void Start () {
		foreach (int i in new TestData())
		{
			Debug.Log(i);
		}
	}
}

コルーチンの動作

(筆者注:実際のプログラムにするとこんな感じかな?)

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Test : MonoBehaviour {

	public IEnumerator<int> GetEnumerator()
	{
		yield return 1;
		yield return 2;
		yield return 3;
	}

	void Start () {
		var e = GetEnumerator();
		Debug.Log (e.MoveNext());
		Debug.Log (e.Current);
		Debug.Log ("-----");
		Debug.Log (e.MoveNext());
		Debug.Log (e.Current);
		Debug.Log ("-----");
		Debug.Log (e.MoveNext());
		Debug.Log (e.Current);
		Debug.Log ("-----");
		Debug.Log (e.MoveNext());
		Debug.Log (e.Current);
	}
}
  • コルーチンだけでは多くの人数で開発する大規模な開発には向かない

世代のプログラミング技術をUnityで! 〜UniRx〜