ゲームを作っている上では非常に便利なコルーチン
ゲームはシーケンシャルなフローが多いので時間同期などもやや多い。
演出処理の途中追加なんかも結構多いのだけどこれを演出の追加ごとにステートを作ると非常に面倒である。
ゲームステートをUpdate内でswitchして処理を書いていたのだけれど、後々の仕様変更や要望に応えていくにつれ
各ステートをコルーチンなどのように並列に動くような仕組みにすればよかったとやや後悔しています。
各処理をコルーチンにしてしまうことによるメリットは演出の終了同期から次のステートへの遷移に至るまでの処理を1本道で書けるという点。
イメージでいうと
処理開始!
↓
演出再生します
↓
演出おわるまでyieldするよ!
↓
さてさて、次の処理は~フレーム毎にyieldしながらこんな処理を行おうか
↓
じゃあすべての処理が終わったからこの関数終了!
次のステートのコルーチン回すよ~
という風になる。
ゲームループ内だとフレームカウンタなどを仕込んで似たようなことを実現していたものの、フローが増えると管理が難しくなる
しかし逆に考えると
行う必要のない処理は行う必要がない
↓
なにも一つのフローとしてステートを見る必要はない
↓
呼ぶべき処理は呼ぶ必要がある場合に呼べばいい。しかも投げっぱなしであとは各ステートがよろしくやってくれる感じ
という風にもなるので、
必要な処理は必要なときだけ走らせるってのが手軽で何より複雑なフローに対応できる作りになるのかなと
そういった結論に至りました。
以前に「ステートそのものをタスクにする」という話があったのだけどその話に近いかもしれないし、
外部スクリプトから制御するならもっと手軽にかつビルド時間の短縮にもつながる。
というわけでスクリプトエンジンを作る案件が仕事でやってくるかもしれないことも考慮して
インタプリタの勉強を再開の予定
(決して私が作りたいからではなく、あくまで仕事としてやらなければいけない可能性があるため仕方なく勉強するわけなので
やれ車輪の再発名だの既存のインタプリタ使えだの言わないように)
目標としては
・C言語と同じ文法で書くことが可能
・コルーチンが付いている
・現在走らせているタスクの制御ができる
・静的変数は1ファイルにつき最大64個までの制約付きだがauto領域に関しては特に指定なし。
みたいな感じのスクリプトを目指します。
さぁ、今の面倒くさい仕事を終わらせて早く勉強したいですぞ~
ではでは
コルーチンがマイブーム
コルーチンがマイブーム
最後に編集したユーザー せんちゃ on 2013年10月26日(土) 10:20 [ 編集 1 回目 ]
Re: コルーチンがマイブーム
例えばソフトウェアリセットを実装するとき、コルーチンのコンテキストをまとめて初期化する必要があると思うのですが、簡単に安全に行う手段ってあるんでしょうか。
そうじゃないとソフトウェアリセットが実質的にただの再起動になってしまいますよね。
コルーチンって一本道を最後まで順当に実行することを前提にするので、時間軸の変更に弱いと感じます。
そうじゃないとソフトウェアリセットが実質的にただの再起動になってしまいますよね。
コルーチンって一本道を最後まで順当に実行することを前提にするので、時間軸の変更に弱いと感じます。
最後に編集したユーザー ISLe on 2013年10月26日(土) 18:08 [ 編集 2 回目 ]