実は奥(闇)が深い「真のあいだ一度だけ実行(一度だけ実行する)」条件を使いこなそう【GDevelop】

便利すぎてついついお世話になってしまう「真のあいだ一度だけ実行」条件ですが、使い込んでいくと「あれ?この場合どうなるの?」という状態におちいりやすい条件でもあります。

そこで、このページでは「真のあいだ一度だけ実行」条件が、実際にはどのように機能しているのか、例をまじえて解説します。

※ 執筆時点の GDevelop バージョンは 5.4.213 です。
※ 以降「真のあいだ一度だけ実行」だと長いので「一度だけ実行する」と表記します。

よくある勘違い「インスタンスごとにチェックしてる」

例えばこのようなイベントを組んだとき↓

各戦車が一度だけX方向に100px動く

X座標は0で配置されている戦車はプレビューすると……

3両全て一度だけ100px移動します。

このことから「一度だけ実行する」条件はインスタンスごとにチェックしてる、と思ってはいけません!
偶然それっぽく機能しているだけです。

では、今度はこのようなイベントを試してみます↓

3回、Y座標が100の戦車を一度だけX方向に100px動かす

3回&一度だけ、というちょっと意味不明なイベントですが、プレビューした結果はこのようになります↓

「一度だけ実行する」条件が設定されているにも関わらず、Y座標が100の戦車(つまり一番上のみ)が、3回100px移動しています。

もしインスタンスごとにチェックしているのであれば、一度しか移動しないはずですが、そうはなりませんでした。

ちょっと何が言いたいのか分からないから早く結論(仕組み)を言え!

はいごめんなさいw😅

「一度だけ実行する」条件は、インスタンス単位ではなくイベント単位でチェックされています。
このことは公式ドキュメント(英語)にも記載されています。

いやいやちょっと待て!イベント単位ならさっきの例の結果はおかしいだろ!

確かに上記の例は、どちらもイベント単位でチェックしているとは思えない結果になっていますが、これは繰り返しを利用しているからそのような印象になるだけです。
繰り返しを個々のイベントに分解してみると分かりやすくなります。

まず最初の例は、以下のように分解することができます↓

各インスタンスの判別にはY座標を利用

これなら3両全てが一度だけ移動したことにも、納得がいくかと思います。

続いて2つ目の例も分解してみましょう↓

まったく同じイベントが3つ並びますが、「一度だけ実行する」条件はイベント単位でチェックされますから、それぞれ別々に一度だけ実行され、結果「一度だけ実行する」条件が付いているにも関わらず3回移動します。

このように、1つの繰り返しイベントでもGDevelopの内部処理的には繰り返しのたびに、異なるイベントとして扱われることを理解しておけば、「一度だけ実行する」条件を正しく扱うことができるようになるでしょう。😉👍

ところで見出しにある「闇」ってなんのこと?

実は意外と処理が重たいようです。

このようなイベントを組んで、それぞれの処理にかかった時間をプロファイルで確認してみました↓

グリッド生成はただのおまけです😅

600フレームで収集した結果がこちら↓

  • 「シーンが始まった×10000回」 ⇒ 0.02ms
  • 「一度だけ実行する×10000回」 ⇒ 2.35ms
  • 「シーン変数チェック×10000回」 ⇒ 0.08ms
  • 「オブジェクト変数チェック×10000回」 ⇒ 3.59ms

さすがに絞り込み処理などもおこなわれるオブジェクト変数よりかは低いようですが、シーン変数などと比べるとちょっと高めなのは否めません。

入れ子になった繰り返しなどでは10000回もありえない数ではないと思うので、ちょっと注意しておきたい点かと思います。

まぁそれでも衝突判定とかに比べれば全然軽いですがw(参考値:衝突判定×10000回 ⇒ 21.68ms)

コメント

このブログの人気の投稿

GDevelop 5.3 がリリース!なので、ここ最近(2023年1月~2023年11月)の GDevelop バージョンアップまとめ

GDevelop の「イベント」を正しく理解しよう

GDevelop 5.0.138 がリリースされました。