Unityってコルーチンがあるのがものすごい良い!

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

そんじゃまた。

軽い気持ちで有名になりたいのでクリックをお願いします!

Unityってコルーチンがあるのがものすごい良い!” への1件のコメント

  1. ピンバック: コルーチンってなんだ。について調べて考えてみた | MtBの日記

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です