書き物

技術とか作った物の話とか愚痴文句感想など

タスクシステム~タスク追加による実行の不平等の話~

タスクシステムはタスクをリストに優先度順に登録し、登録されたタスクを1つずつ実行していくものですが、このタスクの登録によってタスクの実行が不平等になる現象があります。タスクシステムを調べる段階でこの現象の存在は知っていたのですが、特に気にしていませんでした。

しかしこの現象、ちょっと複雑なゲームを作ってみると困ることになります。今回はその例を1つ。

格闘ゲームのようなフレームごとに当たり判定が存在するゲームを作る場合、この実行の不平等で困ることがあります。

まずは状況です。タスクリストに、「当たり判定システム」、「プレイヤー」、「敵」というタスクが登録されているとします。

タスクリスト
├ 当たり判定システム
├ プレイヤー
└ 敵

この状況で、「敵」が攻撃として「爆発」を起こすとします。この「爆発」自体もタスクなので、「敵」の処理関数が実行されたときに「爆発」タスクをリストに追加することになります。この「爆発」タスクは、複数のフレームから成り、アニメーションします。攻撃判定はフレーム1にのみあり、「当たり判定システム」を実行することによって「爆発」のフレーム1が表示中に「プレイヤー」が触れていると、「プレイヤー」にダメージがあるという仕様です。

実際に「爆発」タスクを追加してみます。タスクはそれぞれ優先度を設定できるので、それを調節することによってリストの好きな位置にタスクを登録できます。今回重要なのは「敵」の前に登録するか、後に登録するかなので、

パターン1
タスクリスト
├ 当たり判定システム
├ プレイヤー
├ 爆発 ←追加
└ 敵 ←実行位置

パターン2
タスクリスト
├ 当たり判定システム
├ プレイヤー
├ 敵 ←実行位置
└ 爆発 ←追加

のパターンで考えます。この2つのパターンは、「爆発」の実行に差があります。次はその差を見てみます。

まずはパターン1を実行してみます。「爆発」追加後の状況です。

タスクリスト
├ 当たり判定システム
├ プレイヤー
├ 爆発 ←追加後はフレーム1表示中
└ 敵 ←実行位置

「敵」の実行が終了して、リストを一通り回ったのでまた「当たり判定システム」の実行に戻ります。ここで「プレイヤー」と「爆発」のフレーム1の当たり判定を判定し、ダメージの有無を正常に判定できます。

次にパターン2を実行してみます。同様に「爆発」追加後の状況です。

タスクリスト
├ 当たり判定システム
├ プレイヤー
├ 敵 ←実行位置
└ 爆発 ←追加後はフレーム1表示中

「敵」の実行が終了して、次に「爆発」を実行します。その状況は以下。

タスクリスト
├ 当たり判定システム
├ プレイヤー
├ 敵
└ 爆発 ←実行するとアニメーションしてフレームは2に。

「爆発」が実行され、1コマアニメーションしてフレーム2が表示されます。「爆発」の実行が終わり、パターン1と同様「当たり判定システム」が実行されます。しかし「爆発」のフレームは2なので「プレイヤー」との当たり判定は問答無用に無いことになります。(この時実際のゲーム画面では、「爆発」は追加後即行実行されているので、フレーム1はまったく表示されない。)

パターン1とパターン2の違いが分かったと思いますが、問題は追加の仕方によって動作が異なり、システムが不安定な動作をするところにあります。