壁判定が別の場所に残ってしまう現象

ツクールモード、トップビューゲーム作成での話です。

以下のリンク先の延長線上の話なのですが

https://guild.rpgmakerofficial.com/t/topic/3485?u=m_u

オブジェクトA(ObjectMountTargetあり)、オブジェクトB、オブジェクトC、オブジェクトD(マップ上に配置)が有り(プレイヤーとD以外はArea2DGameObjectです)

・メニューシーンを作りオブジェクトAを配置

・キーを押してメニューを表示するとオブジェクトAのObjectMountTargetにオブジェクトBを生成

・オブジェクトB生成後にオブジェクトAのObjectMountTargetにオブジェクトCをBの接続点に生成しBの子に

・プレイヤーオブジェクトを動かしオブジェクトDに接触する事でオブジェクトDを消滅後、オブジェクトAのObjectMountTargetにオブジェクトDを再生成しオブジェクトCの子に

した時、見た目上はその通りになるのですが何故かオブジェクトDの壁判定だけ原点付近に残ってしまいます。

もしかしたらBやCの壁もあるのかもしれませんが軽量オブジェクトなのでプレイヤーと干渉してないだけかもしれません。デバッグのコリジョン形状を表示にチェックを入れていますが、原点付近にあるはずのオブジェクトDの壁も見えないので・・・

movie_002

これはGodot自体が原因かもしれません。メニューはUIレイヤー(CanvasLayer)に描画されますが、CanvasLayerには独自の物理ワールドがないため、メニュー内のすべての衝突はマップと同じ物理ワールドに存在します。

衝突判定では、アイテムのメニュー内の位置がマップ上の位置として扱われます。そのため、Dの壁はマップの原点付近にあり、画面上の左上からアイテムがどれだけ離れているかというオフセット分だけずれた位置に配置されます。これが、アニメーションGIFでアイテムを上にドラッグした際にプレイヤーが押し上げられる理由かもしれません。目に見える衝突形状(Visible Collision Shapes)が表示されていないのは、Dの形状がメニュー内のアイテムとともに描画されているためであり、原点付近に何も見えないことと一致します。

BとCもおそらく原点に位置していますが、Area2DGameObjectとして実装されているため、プレイヤーの移動を妨げません。

BやCと同じように、メニュー専用用にDのArea2DGameObject版を作成し、Dが選択された際にそれを生成するようにしてはいかがでしょうか。通常のDとその壁はマップ上にそのまま残しておくことができます。

ご回答ありがとうございます!

ご説明頂いた内容は

1.実際の壁は原点付近にありメニュー内には壁の形状のみ描画されている

2.原点付近とメニュー内両方に壁判定が作成されている

どちらでしょうか?それともどちらでもないでしょうか?

少し混乱しております :sweat_smile:

1だとするとメニュー内のアイコンをドラッグする際、条件として壁の上にマウスカーソルがある事を条件としているためドラッグできないような気がします。

2だとするとドラッグする際、壁判定を無効にするよう設定しているのですが、その条件を無効にしてからプレイヤーの所にドラッグした時プレイヤーに接触が発生しませんでした。

それについても説明頂いた内容で理解可能でしょうか?

#1 の方が近いですね。壁は1つだけで、その座標はメニュー内のアイコンの座標と同じになっています。

マウスとプレイヤーでは、これらの座標の解釈が異なります。調べたところ、Godotはメニュー内のオブジェクトに対して、メニュー自体の画面座標を使ってマウスの位置を確認しているため、カーソルはアイコンと位置が一致し、ドラッグ操作が正常に動作します。一方、プレイヤーはマップ上に存在するため、同じ座標をマップ上の位置として読み取り、結果として壁が原点付近に配置されてしまいます。

これは2番目のテストについても説明できる可能性があります。画面上でプレイヤーの上にアイコンをドラッグすると、実際の壁は原点付近で移動しているだけなので、プレイヤーに触れることはありません。

「いいね!」 1

この奇妙な現象はGodotの仕様によるものだと言う事ですか・・・

そうなると、メニューシーン上にある物をベースレイヤーの任意の場所に

任意の数生成すると言ったような場合、座標が異なっていて難しい気がするのですが

そもそも、メニューシーンはそういうことをする前提として設計されてない

と言う事でしょうか?

とは言え、ベースエンジンのGodotの仕様では仕方ないですね・・・

いろいろ調べて頂き、ありがとうございました!