クライアントエンジニアの乾です、今回はUnity5.3でコルーチン周りでの変更点
について書きたいと思います。
1:コルーチン内からのコルーチン呼び出し
5.3以降はコルーチン内の呼び出しはStartCoroutine()が省略する事が可能に
なりました。
これによりMonoBehaviourを継承していないクラスでも扱いやすくなりました。
// 5.3以前の書き方 public IEnumerator Coroutine(MonoBehaviour monoBehaviour){ yield return monoBehaviour.StartCorouitne(Coroutine2()); } // 5.3以降の書き方 public IEnumerator Coroutine(){ yield return Coroutine2() ; }
2:追加クラス(WaitWhile、WaitUntil)
WaitWhile、WaitUntilが追加されました。
これらが追加された事によってコルーチンを書く時に多用していた処理が簡略化されました。
// 5.3以前の書き方 private IEnumerator WaitCoroutine(){ // 条件b1が満たされている間は待機 while (b1) {yield return null;} // 条件b2が満たされるまで待機 while (!b2) {yield return null;} } // 5.3以降の書き方 private IEnumerator WaitCoroutine(){ // 条件b1が満たさている間は待機 yield return new WaitWhile (()=>{return b1;}); // 条件b2が満たされるまで待機 yield return new WaitUntil (()=>{return b2;}); }
3:カスタムコルーチン
Unity 5.3 から追加されたCustomYieldInstructionを継承する事で、独自のコルーチンを楽に定義することが可能になりました。
// 例:対象が非有効化するまで監視するコルーチンクラス。 public class WaitForDisable : CustomYieldInstruction { // 監視対象 public GameObject target{ get; private set;} /// <summary> /// 待機継続条件 /// </summary> /// <value><c>true</c> if keep waiting; otherwise, <c>false</c>.</value> public override bool keepWaiting{ get{ return target.activeSelf; } } public WaitForDisable(GameObject target){ this.target = target; } }
使用例
IEnumerator Coroutine(){ // 対象オブジェクトが非有効化になるまで遅延 yield return new WaitForDisable (target); Debug.Log ("Complete!!"); }
よく使うような遅延条件はクラス化してしまった方が見やすいかもしれません。
以上5.3でのコルーチン周り変更点でした!!