特にプログラミング経験者がおちいりやすい罠なのですが、GDevelop の「イベント」は「if 文」ではありません。
このことは公式 Wiki でもサラッとしか説明されていないため、誤解したままイベントを if 文と同じように利用してしまうと、その独特な挙動に悩まされることになります。
参考ページ:ゲーム作りの基本コンセプト:GDevelop を使うために知っておきたいこと の「イベントとそれがいかにしてオブジェクトを選択するか」
確かにイベントは if 文と同じ役割を果たす面もありますが、イベントの役割はそれだけではなく、対象のオブジェクト(インスタンス)を絞り込み、その上で絞り込まれたインスタンスに対し一括でアクションを実行する事ができる、という特徴があります。
例えば、次の画像のようなシーンで、ミサイルが当たっている戦車のみ削除したい場合は……
次の画像のようなイベントを設定するだけで、ミサイルが当たっている戦車のみ削除することができます。
これは、イベントの条件で「ミサイルに衝突している戦車」のみにインスタンスが絞られたため、そのイベントのアクションで戦車を削除すると、ミサイルと衝突している戦車だけが削除されるという仕組みです。
このような特徴により、わざわざ次の画像のようなイベントの組み方をする必要はありません。
(希望通りの動作はしますが、イベントの仕組みを正しく理解していない組み方です)
さらに、この絞り込まれたインスタンスは、サブイベントにも引き継がれます。
例えば次の画像のように、それぞれの戦車にインスタンス変数を持たせて、異なる番号を割り当てたシーンならば……
次の画像のようなイベントにすることで、ミサイルとの衝突時に戦車を ID ごとに異なるアニメーションに変化させることができます。
これは、最初のイベントでミサイルと衝突している戦車のみに絞り込み、更にサブイベントで ID が一致する戦車のみに絞り込むことで、それぞれ異なるアクションが実行される仕組みです。
なお、条件に該当するオブジェクトがない場合は、そのイベントのアクションは実行されません。
では、今までの例とは異なり「戦車のどれか1輌にでもミサイルが当たったら、3輌全て消す」には、どうしたら良いかというと……
上の画像のように「すべてのインスタンスを選択する」アクションを、削除するアクションより先に追加することで、戦車すべてがアクションの対象となり、3輌全てを削除することができます。
このように多少独特ではありますが、対象の絞り込みとアクションを一括でおこなえる、というイベントの特徴はゲーム制作において非常に強力です。
正しく理解すれば、シンプルかつスピーディーにゲームを作ることができるようになることでしょう😉
※ この記事は「GDevelop 無料ゲーム制作ツールを使い倒す Blog」からの移植&改訂版です。