「第30回代々木Unity勉強会」に行って来ました
募集ページ
【増員100名!】【#TechBuzz】第30回代々木Unity勉強会【テーマ:イテレータとコルーチン 〜Unity ゲームにおける非同期処理〜 / 次世代のプログラミング技術をUnityで!〜UniRx〜】 : ATND
https://atnd.org/events/62313
イテレータとコルーチン 〜Unity ゲームにおける非同期処理〜
- 赤坂玲音(あかさか れおん)
- 技術者・テクニカルライター
- エンジニアのためのUnity実践リファレンス (4月10日発売予定)
エンジニアのためのUnity実践リファレンス ? ゲーム開発にすぐに役立つスクリプト入門
- 作者: 赤坂玲音
- 出版社/メーカー: 技術評論社
- 発売日: 2015/04/10
- メディア: 大型本
- この商品を含むブログ (1件) を見る
- Microsoft MVP - Visual C++(2005〜)
- 専門学校講師
- 主にC#とUnit
- スマートフォン向けゲーム開発
- エディタやフロントエンドのライブラリ開発が中心
最新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); } }
- コルーチンだけでは多くの人数で開発する大規模な開発には向かない