S.C
1
壁をオープン/クローズできるスイッチを作成し、別のオブジェクトがレバーで移動できるようになりました。
壁をオープン/クローズできる位置で移動中のオブジェクトを停止させ、その後壁を開くと、衝突判定によってオブジェクトがランダムな位置に押しつぶされてしまいます。

この問題を効果的かつ合理的に解決する方法をご教示いただけますでしょうか?
当初、移動中のオブジェクトに対して「壁の中に埋もれた場合、X軸方向に50ピクセル移動する」という判定を追加しました。
しかし、設定しても全く効果がなく、依然として押しつぶされて弾き飛ばされてしまいます。どこでエラーが起きているのか見当がつかないため、フォーラムで質問させていただきます!
「移動とジャンプ」の設定にある「コーナー補正を有効にする」オプションは、全く使用していませんか?
S.C
3
申し訳ないですが、この機能が何なのか全く分かりません 
今すぐ有効化してテストしてみましたが、依然として押しつぶされて弾き飛ばされることはなく、有効化する前と何の変化もありません。
Baz
4
試せるよう、小さなカスタムアクションを作成しました。
BazEjectOverlapAction.gd (26.8 KB)
このアクションには「Who Moves(誰を動かすか)」という最初のオプションで選択できる、2つの動作モードがあります。
-
Push Others(他者を押し出す):壁に設定します。壁の衝突判定が有効になるステートの直前に実行されるステートに配置してください。このステートが実行されると、壁の衝突形状と重なっているオブジェクトがチェックされ、同じフレーム内で押し除けられます。これにより、物理エンジンがオブジェクトを押し付ける機会を失います。この方法が最も信頼性が高いため、あなたの環境ではこれを最初に試すことをお勧めします。
-
Push Self(自身を押し出す):動くオブジェクト側に設定します。引っかかる可能性があるあらゆるステートで、毎フレーム自身が含まれているかどうかをチェックし(壁、タイル、または他の固体オブジェクト)、自身を押し出します。ただし、これはエンジンの押し付け動作と競合するため、オブジェクトが最初に跳ね上がってから落ち着く現象がまだ発生する場合は、代わりに壁に対して「Push Others(他者を押し出す)」を使用してください。
「Push Direction(押し出す方向)」は、オブジェクトがどの方向に移動するかを選択します。「Nearest(最寄)」を選択すると最短の経路で押し出されますが、左、右、上、下を強制的に指定することもできます。
「Push Padding(押し出しパディング)」は、移動後のオブジェクトと壁の端の間に残されるギャップのサイズであり、移動距離そのものではありません。通常、2または3程度で十分です。
壁を使ってテストするには:
- 壁オブジェクトにおいて、開いている状態と閉じている状態の間に新しいステートを追加します。このステートは、1フレーム後、または経過時間が0秒になった時点で閉じている状態へ遷移するように設定してください。
- その新しいステートに「Baz Eject Overlap」を追加し、「Who Moves」を「Push Others(他者を押し出す)」に、「Push Direction(押し出す方向)」を壁に合わせて適切な方向(例えば、右から閉じる壁なら「Push Left(左に押し出す)」)に設定します。
- レバーを使ってオブジェクトを壁の位置に移動させ、その後壁を閉じます。オブジェクトは毎回、選択した側の壁の外側に着地するはずです。
- 壁が、開いている状態から閉じている状態へのアニメーションと同じステート内で衝突判定を有効にする場合、そのために追加したステートが必要となります。衝突が存在する前に押し出し処理が行われる必要があるためです。
「いいね!」 1
S.C
5
本当にBazさん、ありがとうございます!実際に試してみましたが、失敗したのは操作に誤りがあったのかもしれません。
ターゲットグループの選択では、自分のグループを選択できませんでした。ただ、これは問題ないと思い、デフォルトの「すべて」を選択しました。壁を出現させるアニメーションでは、最初の数フレームは当たり判定が無効で、最後のフレームだけ有効になるようです。
このアクションに Push Others(他者を押し返す) を追加しましたが、テストしても押しつぶされて弾き飛ばされてしまいます。
そこで、おっしゃっていたように出現の途中に検出専用のアクションを追加してみましたが、結果は同じで押しつぶされて弾き飛ばされてしまいました 
S.C
6
Push Others というアクションは、他の当たり判定をどのように検出しているのでしょうか?例えば、壁がレイヤー1の当たり判定を持っていて、移動対象がレイヤー1の当たり判定を持っていない場合、これは機能するのでしょうか?実際に試してみましたが、反応がありませんでした。bazさん、ご指導お願いします。
また、Push Self も試してみましたが、効果は発生しました。ただし、壁を開くたびに壁が勝手に移動します。壁オブジェクトとして空中に引っかかっていないにもかかわらず、閉じて開くたびに一定距離移動してしまいます。
Baz
7
急な質問ですが、マスクが一致していない場合、壁はオブジェクトを押し続けましたか?また、「他者を押す」はどこに設定しましたか(どのステートで、壁のボックスはそのステートのアニメーションの最終フレームに存在しますか)?
Baz
8
S.Cさん、ご迷惑をおかけしました。両方とも私の側の問題でした。あなたがテストしたバージョンは、壁ボックスが既にオンになっている場合のみ壁ボックスを確認しており、AGMアニメーションエディタは最後のフレームまで壁ボックスをオフにしていたため、プッシュするものが何も検出されませんでした。これを修正し、タイミングも変更しました。現在は壁自体のアニメーションを読み取り、状態が始まる瞬間ではなく、ボックスがオンになる直前にプッシュします。更新されたファイルを添付しましたので、custom_actions内のファイルを置き換えてください。
BazEjectOverlapAction.gd (37.0 KB)
「Push Others」については、閉じるアニメーションを再生する同じステートに配置してください。追加のステートは必要ありません。必要なものは、そのアニメーションの最初のフレームで壁ボックスがオフになっていることだけで、それはすでに持っている設定です。「Push Self」は、代わりに詰まってしまうオブジェクトに配置し、任意のステートで構いません。また、閉じようとしている壁だけでなく、すでに固体であるタイルなども回避して移動します。
マスクについては、同じレイヤーを使用し、衝突自体が使用するマスクを利用します。レイヤー1の要件はありません。どちら側のマスクも相手のレイヤーを検出しない場合、そもそも衝突しないため、プッシュする対象がありません。もしマスクの不整合で押し付けられた場合はお知らせください。それは別の問題です。
壁のドリフトは「Push Self」のバグでした。マスクが0の場合、すべてを固体として扱ってしまいます。これも修正済みですが、「Push Self」は壁ではなく移動するオブジェクト向けに設計されています。グループのドロップダウンメニューには現在デフォルトのグループのみが表示されています。「All Group」は正常に動作します。カスタムグループについては次回確認します。
結果をお知らせください!
S.C
9
bazさん、新版に置き換えた後も同じく押しつぶされて弾き飛ばされます。オブジェクトのX軸方向の移動が成功していません。
こちらの壁のアニメーションをご確認ください。衝突判定の最初のフレームは有効、その後のフレームは無効にしています。
私のアクションは、有効時と無効時の両方でこのアニメーションを使用しており、壁ブロックは無効時はそのまま再生、有効時はアニメーションを逆再生しています。
貴殿のアクションは、有効時の逆再生アクション内に配置されていますが、失敗しています。つまり、最後のフレームで衝突判定が有効になっているアニメーションです。
壁ブロック
移動オブジェクト
何度かテストを重ね、両者の衝突レイヤーとマスクを有効にしてみましたが、依然としてうまくいきませんでした。
Baz
10
スクリーンショットをありがとう。それが欠けていたピースだったよ。私が送ったバージョンは、壁のアニメーションが順方向に再生されることしか理解していなかった。君の閉じる状態(closing state)はそれを逆方向に再生するので、ボックスが現れることを認識できず、何も起こらなかったんだ。
君の設定をここで再構築した。ボックスは最初のフレームでON、それ以降はOFFで逆再生。新しいファイルでは、ボックスがONになる直前にオブジェクトを押し出すようにした。壁もその場に留まる。
もし動くオブジェクト側に配置したいなら、Push Self にも同じ修正を適用できる。
レイヤーとマスクは今のままで問題ないよ。壁のレイヤー2と、動くオブジェクトのマスク2の組み合わせは、まさにスクリプトが検出しようとしているペアリングだから、そこを変更する必要はない。
更新されたファイルを添付する。custom_actions 内の既存のファイルと入れ替えて、アクションは enable ステートの中にある元の場所にそのまま置いておいてくれ。それでも押し出されてしまう場合は、壁オブジェクトのシーンファイルを送ってもらえるか?直接実行して確認したいんだ。
BazEjectOverlapAction.gd (38.1 KB)
S.C
11
bazさん、お世話になっております。
報告です。ブロックの壁に設置した「他者を押す」アクションは、依然として失敗しました。
移動体にアクションを設置し、自身を「押す」(Push Self) 動作を試みたところ、1回だけ成功しました。しかし、これはランダムなものであり、その後の多くの試行では失敗し、依然として押しつぶされて弾き飛ばされてしまいます。位置によって判定が異なる可能性がありますか?
ブロックの壁と移動体のtscn+vsファイルを提供します。これらは2つのスイッチによって形態を切り替えています。
空のシーンでテストすれば大丈夫です!(新規作成したシーンでグローバルスイッチを再設定していただく必要があるかもしれません)
Moving Object.zip (4.7 KB)
switch_brick.zip (4.0 KB)
ふと、もしbazさんが私が以前メールで送ったシーンを残しておいていれば、そこで直接テストできることに気づきました。
S.C
12
ブロックの壁や移動オブジェクトにあるスイッチは、キー操作でオン/オフを切り替えるようにした方がシンプルになります。プレイヤーの処理も省略できますよ 
Baz
13
これを聞くのは申し訳ないのですが、この状況を再現した新しいプロジェクトをpgmmv-support@gotchagotcha.jpに送っていただけないでしょうか?そうすれば、あなたの状況に最も適した対応策を調査し、アクションを適切に編集する最も簡単な方法になります。現在非常に多忙なので、これなら作業が大幅に効率化できます。
S.C
14
返信がないことから、おおよその意図は理解しています。ミニ版で再現してみました。
中のブロックや壁は、Zキーで開閉できます。また、あなたのプラグインも読み込んでいます。
キャラクターをブロックの位置に移動させて開けば、テストできます。
Push Others_demo.rar (4.3 MB)
フォーラムの容量制限のため、この圧縮ファイルは二重圧縮されています。
「いいね!」 1
Baz
15
ありがとうございます。こちらをお試しください:
BazEjectOverlapAction.gd (40.2 KB)
また、ユースケースとしては、特定のグループと「水平方向で最も近い」ノードを使用することをお勧めします:
「いいね!」 1
S.C
16
ご協力いただき、誠にありがとうございました。押しつぶされないような平行移動の効果が実現できました!
なぜ斜め上方向に押しつぶされるのか考えていたのですが、ブロックの壁が複数の小さな正方形の当たり框で構成されているため、移動するオブジェクトが嵌め込まれた際、複数の正方形の当たり框がすべて「それをどかす必要がある」と認識し、結果としてオブジェクトが移動される位置が不安定になっているのでしょうか?もしこれを単一の縦長の当たり框に変更すれば、ランダムに弾き飛ばされる現象が改善されるでしょうか?(実際にテストしてみます)
バズ氏のご支援に改めて感謝申し上げます。
Baz
17
素晴らしい!
そしてはい、まさにそういうことでした。最初は壁が1つのオブジェクトだと思っていました。
S.C
18
私の問題でした。十分な詳細な情報を提供していませんでした。
先ほどテストしたところ、単一の衝突ボックスの場合、bazのプラグインを使わなくても、ランダムな押し潰れや弾き飛びは発生しないことがわかりました。
AGMの衝突による押し出しは直感的で、エッジに近づいた側へスライドして押し出されます。
なるほど、オブジェクトが複数の衝突ボックス内にあった場合にのみ、押し潰れやランダムな弾き飛びが発生するのですね。これを安定させるためには、貴方のプラグインが必要のようです。現在のプラグインのグループはプロジェクトに対応していないようですが、実際のグループに対応できればさらに良いですね。