【GDevelop】「オブジェクトを生成する」アクションだけが持つ唯一の例外について
「オブジェクトを生成する」アクションには、他のアクションには無い、次のような特徴があります。
それは、「オブジェクトを生成する」アクションは、生成するオブジェクトが同じイベント内で既に参照されていたかどうかで、生成後の絞り込みが変化する。です!
は?🤔
はい、文字だけだと意味不明ですよね。
分かりやすい例を用意したので、それで説明します。
↓次のイベントでは、1秒毎に Tank_A と Tank_B を生成しています。
ただし、Tank_A と Tank_B は、生成する前に参照されたかされていないかの違いがあります。
具体的には赤線の箇所で、Tank_A の方はその数を調べるために Count() で Tank_A を参照しています。
対して Tank_B の方は参照していません。
それ以外の、対象を移動させるアクションなどは同じです。(出現位置は違いますが……)
一見すると、Tank_A と Tank_B は同じように生成されて移動する結果になると思われがちですが、実際には違います。
このイベントの結果が、これです↓
明らかに、Tank_A と Tank_B の進み方に違いがあります。
Tank_A の方は加速しているのに対して、Tank_B は等速で移動しています。
この謎を解く鍵は、表示されている After の値です。
この After の値は、イベントで対象となっているオブジェクト(インスタンス)の数です。
Tank_A は After の値が 5 なのに対し、Tank_B は 1 です。
つまり、Tank_A のイベントでは生成済みの Tank_A もアクションの対象となっているのに対し、Tank_B では生成したばかりの Tank_B ひとつだけが対象となっていることが分かります。
そのため Tank_A は移動させるアクションが生成済みの Tank_A に対しても実行され、どんどん加速していく結果になります。
対して Tank_B は、それが生成された時だけ、移動させるアクションの対象となるため、ずっと同じ速度で移動しています。
このように「オブジェクトを生成する」アクションは、生成するオブジェクトが同じイベント内で既に参照されていたかどうかで、生成後の絞り込みが変化する。という、ちょっと意味不明な特徴があります。
通常、絞り込みは条件やアクションで変化させるものなのに、式に登場させただけで絞り込みが変化するというこの処理はかなり異質です。
「オブジェクトを生成する」アクションを使用する際は、この点に充分注意しましょう。
どう絞り込みが変化するのか
具体的には以下のように絞り込みが変化します。
※ ここで言う同じイベントとは親イベント(直系尊属)も含みます。
※ 式だけでなく条件やアクションで参照されても同様です。
- 生成するオブジェクトが同じイベント内で既に参照されている場合は、対象の絞り込みに生成されたオブジェクトが追加されます。
- 生成するオブジェクトが同じイベント内でまだ参照されていない場合は、対象の絞り込みは生成したオブジェクトだけになります。
異質ではあるものの、生成したオブジェクトだけになる後者の処理は、オブジェクト生成後の初期設定をおこなう際に便利なので、公式のチュートリアルでもよく利用されています。
もし、前者のみであった場合は、毎回次のような処理を検討しなくてはなりません。
生成したオブジェクトひとつだけに絞り込みたい時は?
上記の例であれば Tank_A のイベントを次のように修正することで、生成直後のオブジェクトだけに絞り込むことができます。
オブジェクト生成後に、オブジェクト変数(この例では"初期設定済み")が初期値のままのオブジェクトだけ、つまり生成直後のオブジェクトだけに条件で絞り込み、その上で移動とオブジェクト変数の変更をおこなっています。
これにより Tank_A も Tank_B と同じように、等速で移動する結果になります。
変数を用意したり、サブイベントを組む手間は発生しますが、今のところこの方法が最も手軽かと思います。
この特徴は将来変更されるの?
便利な一面はあるものの、個人的には意味不明で初心者殺しすぎるこの処理は変更したほうが良いと思っているのですが、開発チーム的には「バグではなく仕様である」という認識のようです。
既に何度か議論はされていて、いくつかの対策案は出ているのですが、それが実行される気配は今のところありません。
早めに何らかの対応がおこなわれることに期待です😥
せめて Wiki に書いておくとかすればいいのに……
コメント
コメントを投稿