こんにちは。ヤマヤタケシです。
相変わらず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の日記