こんにちは。ヤマヤタケシです。
相変わらずUnityを触っています。
C++でゲームを作るときにLuaを組み込みたい!と思う強い動機がコルーチンです。
コルーチンをちゃんと使えるようになろうと動作を確認しました。
コルーチンとは?
コードを上から順番に実行させるものです。
普通じゃん。
否!
伝統的手工業のゲーム開発では上から順番に実行するのが難しいのです。
何故ならば全体構造が1秒間に60回という画面の更新に合わせて設計されているからです。
そのため、フレーム毎に呼ばれる関数は巨大なswitch文になりがちです。
あ、1回の更新を1フレームと呼びます。
例えば、こんな動きを作りたいとします。
60フレーム間右へ移動(x++)して、 60フレーム何もしないで、 60フレーム左へ移動(x--)させる
普通に書くとこうなります。
#pragma strict var state : int = 0; var count : int = 0; var x : float = 0; function Start() { state = 0; count = 60; x = 0; } function Update() { switch( state ){ case 0: //60frame横に移動 count--; x++; if( count <= 0 ){ state = 1; count = 60; } break; case 1: //60frame待つ count--; if( count <= 0 ){ state = 2; count = 60; } break; case 2: //60frame左へ移動 count--; x--; if( count <= 0 ){ state = 3; } break; case 3: //終わり break; } } function OnGUI() { GUILayout.Button( "x " + x ); }
なんと面倒な!
普通に上から流れるように書きたいだけなのにswitch文により大げさになっています。
そこでコルーチンです。
#pragma strict var x : float = 0; function Start() { StartCoroutine( "Sequence" ); } function Sequence() { var count = 0; //60frame横に移動 for( count = 0 ; count < 60 ; ++count ){ x++; yield; } //60frame待つ for( count = 0 ; count < 60 ; ++count ){ yield; } //60frame左へ移動 for( count = 0 ; count < 60 ; ++count ){ x--; yield; } } function Update() { //なにもしない } function OnGUI() { if( GUILayout.Button( "x " + x ) ){ StopCoroutine( "Sequence" ); } }
おぉ、スッキリ。
yieldは中断します。次のフレームは続きから始まります。ローカル変数は維持されているのでforが使えます。
しかも、StartCoroutineしたものはStopCoroutineができるので、途中で止めれます。
あと、Start() の中でもyieldできます。
いたせりつくせりか!
結局、本家の方がわかりやすいかも。
Overview: コルーチンとイールド(Coroutines & Yield)
そんじゃまた。
ピンバック: コルーチンってなんだ。について調べて考えてみた | MtBの日記