More Related Content
Similar to コルーチンを使おう (20)
More from amusementcreators
More from amusementcreators (20)
コルーチンを使おう
- 2. WHO AM I?
• ナムアニクラウドと申します
• 主にC#でゲームなどのプログラミングをしてます
• Twitter: @NumAniCloud
Twitterアイコン→
- 4. 実行のイメージ
// 定義 // 呼び出し
IEnumerator Fiber(){ void Main(){
Shot(); var x = Fiber();
yield return 0; x.MoveNext();
Shot(); Hoge();
Shot(); x.MoveNext();
yield return 0; x.MoveNext();
yield return 0; x.MoveNext();
} }
- 5. 実行のイメージ
// 定義 // 呼び出し
IEnumerator Fiber(){ void Main(){
Shot(); var x = Fiber();
yield return 0; x.MoveNext();
Shot(); Hoge();
Shot(); x.MoveNext();
yield return 0; x.MoveNext();
yield return 0; x.MoveNext();
} }
- 6. 実行のイメージ
// 定義 // 呼び出し
IEnumerator Fiber(){ void Main(){
Shot(); var x = Fiber();
yield return 0; x.MoveNext();
Shot(); Hoge();
Shot(); x.MoveNext();
yield return 0; x.MoveNext();
yield return 0; x.MoveNext();
} }
- 7. 実行のイメージ
// 定義 // 呼び出し
IEnumerator Fiber(){ void Main(){
Shot(); var x = Fiber();
yield return 0; x.MoveNext();
Shot(); Hoge();
Shot(); x.MoveNext();
yield return 0; x.MoveNext();
yield return 0; x.MoveNext();
} }
- 8. 実行のイメージ
// 定義 // 呼び出し
IEnumerator Fiber(){ void Main(){
Shot(); var x = Fiber();
yield return 0; x.MoveNext();
Shot(); Hoge();
Shot(); x.MoveNext();
yield return 0; x.MoveNext();
yield return 0; x.MoveNext();
} }
- 10. 例(C#)
ゲームで敵キャラクターの制御をしたい
• 下へ移動
void Update(){
• 2秒待つ 下へ移動;
• 5回繰り返す 2秒待つ;
• 弾を撃つ 5回繰り返す
{
• 1秒待つ 弾を撃つ;
ここで処理を止めたいけど、 1秒待つ;
この関数を抜けないと他の関数の処理ができず }
ゲーム全体が止まってしまう! } 理想
現実
- 11. 例(C#)
そこでコルーチン ここでは1秒 = 60フレーム
IEnumerator Update(){
下へ移動;
for( int i = 0; i < 120; ++i ) void 2秒待つ
// Update(){
yield return 0; 下へ移動;
for( int i = 0; i < 5; ++i ){ 2秒待つ;
弾を撃つ; 5回繰り返す
for( int j = 0; j < 60; ++j ) // 1秒待つ{
yield return 0; 弾を撃つ;
} 1秒待つ;
} }
}
- 12. コルーチンなしだと
毎フレーム呼び出してもらうしかない ここでは1秒 = 60フレーム
int t = 0; カウンターが必要
void Update(){
if( t == 0 ){
下へ移動; for文も使えないので、変な条件式を書く
}
if( t >= 120 && ( t – 120 ) % 60 == 0 && t < 120 + 60 * 5 ){
弾を撃つ;
}
++t; 時間を絶対的に指定
}
- 13. 使い道
• RPGの戦闘シーンなど
• プレイヤーの作戦が決まるまで戦闘の進行を止める
• エフェクトの表示が終わるまで戦闘の進行を止める
• 状態のシーケンスの管理
• 敵が歩いて登場する状態 → 攻撃する状態 → 攻撃が終わって退場する状態
• 遅延評価
• 呼び出しが達するまで計算しないことで無駄を省く
• 無限の量の計算を途中で打ち切る
• ジェネレータ(値を列挙する)
- 14. 使い道:遅延評価
IEnumerator Fiber(){ void Main(){
Func(); var x = Fiber();
yield return 0; x.MoveNext();
Func(); x.MoveNext();
yield return 0; }
HeavyFunc(); // 実行されない
yield return 0;
}
- 15. 使い道:ジェネレータ
IEnumerator Fiber(){ void Main(){
yield return 3; var x = Fiber();
yield return 1; x.MoveNext();
yield return 4; x.Current; // 3
x.MoveNext();
yield return 1;
x.Current; // 1
yield return 5;
x.MoveNext();
}
x.Current; // 4
}