ああ、とうとう出会ってしまいました。たぶんちょっとゲームに詳しい人ならば「myugaruはいつこれに気付くのだろう?」とか思っていたのではないでしょうか?
かれこれ3ヶ月くらいかかってやっと出会いました。
コ ル ー チ ン
今かなり笑われてる気がするけど気にせず感動に浸っておきます。
なんて素敵なコルーチン。
おかげで私が考えていた「ややこしいタスクシステム構想」はほとんど0に帰しましたw
じゃあこっから真面目にコルーチンについて語ります。
コルーチン - Wikipedia
この構造をゲーム関連の情報集めをしている際に見つけた。
なるほどこれは確かにすごい発想だと思う。
そしてC#のyieldは正にこの機能を実現するためにあると思った。
色々やってみると2つの利点が見えた。
第1の利点.ゲームでのタスクシステムに利用できる
もちろん一番はっきりとした利点はこれである。
簡単に説明すると例えば並列動作する2つのゲームタスクを考える。
タスクAは3つの状態を繰り返しタスクBは2つの状態を繰り返すと仮定する。
実際には足踏みをするキャラだったり煙突から上がる煙だったりするかも知れない。
コルーチンによる驚異的明瞭コードはこうなる。
using System;
using System.Collections;
namespace CoRoutine
{
static class Program
{
static int stateA, stateB;
[STAThread]
static void Main(string[] args)
{
var a = TaskA();
var b = TaskB();
for (int i = 0; i < 10; i++) {
a.MoveNext();
b.MoveNext();
Console.WriteLine("A{0} B{1}", stateA, stateB);
}
Console.ReadLine();
}
static IEnumerator TaskA()
{
while (true) {
for (stateA = 1; stateA <= 3; stateA++) {
yield return 0;
}
}
}
static IEnumerator TaskB()
{
while (true) {
for (stateB = 1; stateB <= 2; stateB++) {
yield return 0;
}
}
}
}
}
第2の利点.リバースエンジニアリングを阻止できる
先日リバースエンジニアリングの話題を出した。
http://blogs.wankuma.com/myugaru/archive/2008/03/06/126503.aspx
内容は私が他人のプログラムを解析する話になっていたが、
これが逆に私のプログラムを誰かに解析されるって事になると、
ずいぶんと勝手な言い分だけどあまり嬉しくはない。
だがここで朗報はyieldによるコルーチンは少なくとも現バージョンのReflectorでは元のソースに復元が出来ないのだ。
更に好都合なのはコルーチンにこそゲームの核となるビジネスロジックの大半が記述されるのである。
試しに上のソースをReflectorにかけてみた。結果は上のたったあれだけのソースがgotoの応酬でとんでもない事になっている。(応酬ってほど多くは無かったね^^;;)興味のある方はリンク先をご覧いただきたい。
上のソースのReflectorの出力結果→http://myugaru.wankuma.com/20080310CoRoutine.txt
?P.S.もしyield returnに対応したリバースエンジニアツールをご存知ならご一報くださいね^^;;;