PIero
1
プレイヤーに追従する子オブジェクトと敵に追従する子オブジェクトの接触判定をぶつけたいのですがレイヤーやマスクをどう設定してもすり抜けてしまいます。
追従設定の子オブジェクト同士はぶつかることができないのでしょうか?
また子オブジェクトは離れず追従する設定の場合タイルに干渉することもできないのでしょうか?
アクションゲームメーカーの壁判定は非常に脆弱で壁際でオブジェクトに押し込まれたり高速でぶつかると簡単に壁か地面に埋まってしまいます。
アクツクMVに比べても非常に脆弱です。普通にゆっくり壁際に押し込んだだけで押し込まれたオブジェクトは壁を貫通します。壁に向かって吹っ飛んだ敵オブジェクトも落下時にひっかかりお落ちてきません。
なので大きめの壁判定を持つ子オブジェクトをクッション代わりにできればと考えましたがやはり不可能でしょうか?
親が埋まってしまった場合脱出の方法が非常に限られます。特に操作キャラクターでないオブジェクトの場合非常にコントロールが難しいです。
容易く壁に埋まらない設定や代案などもあれば教えていただけますと幸いです。よろしくお願いいたします。
Baz
2
子オブジェクトのChildSettingsで、「Near」フォロータイプオプションを使用してみましたか?
PIero様
アクションゲームメーカーの壁判定は非常に脆弱で壁際でオブジェクトに押し込まれたり高速でぶつかると簡単に壁か地面に埋まってしまいます。
アクツクMVに比べても非常に脆弱です。普通にゆっくり壁際に押し込んだだけで押し込まれたオブジェクトは壁を貫通します。壁に向かって吹っ飛んだ敵オブジェクトも落下時にひっかかりお落ちてきません。
こちらの部分がまず解決したいことだとおもわれますので、こちらについて確認をさせてください。
ACTION GAME MAKERの壁判定システムは、かなり堅牢なGodot Engineの衝突システムをそのまま利用しており、ご指摘いただいたような事象が起きることは通常考えづらい状態です。
何らかの我々の見落としていた問題、あるいはアクツクMVをご利用いただいていたとのことですので、positionを直接ずらすなど、Godotの壁判定システムを貫通してしまうような移動方法を指定いただいているのかもしれないと考えています。
もしよろしければ、問題の起きているプロジェクトを共有いただくことは可能でしょうか?
PIero
4
お返事ありがとうございます。親を常に追従する設定にしているのですがタイルと接触しない子オブジェクに別のオブジェクトが壁に押し込まれると埋まってしまうようです。設定を変えることで解決できたと思います。ありがとうございます。
PIero
5
お返事ありがとうございます。
敵オブジェクトがタイルにだけ干渉する親オブジェクトにプレイヤーにだけ干渉する接触判定を持つ子オブジェクトを持つ構成になっていまして、プレイヤーが複数の敵に壁際で押し込まれると貫通してしまうようです。
今のところ壁際に大きな接触判定を持つオブジェクトを置くことでこの問題の対策をしています。
あとこれは別スレッドで書くべきことかもしれませんが、
なんらかの拍子にアニメーションに設定したAttack Collisionのdisabledをオンにしたものがオフになってるのか本来攻撃判定のないアニメーションで攻撃判定が出てしまう時があります。
デバッグのコリジョンでは表示されませんし攻撃以外のアニメーションにはdisabledをオンにしていますが一度それが発生すると敵に向かって歩くだけでダメージを与え続けます。
私のプロジェクトではダメージを受けた時によく発生します。なんらかの見落としがあるのかもしれませんがバグの可能性もある為こちらも軽くご確認いただけますと幸いです。
あと攻撃がヒットした敵からヒットマークを弾として発射していますが非常に重たいです。
複数の敵からヒットマークが出ると私のPCでは1秒近く止まってしまいます。
アクションゲームメーカーが1フレームに同時にオブジェクトを出すのが苦手なのは知っていますが、
現状作れるゲームの幅が大変狭まってしまいますのでこちらも将来的にはなんとかしていただけますと幸いです。
プロジェクトデータはどのようにお送りすればよろしいでしょうか?
ご報告ありがとうございます。
GUILDにはDM送信機能がありますので、私のアイコンをクリックいただきメッセージを送信からお送りください。
プロジェクトファイルはサイズが大きいとおもいますので、
お手数ですが、gigafile便等のファイル共有サービスを使ってお送りいただければと思います。
プロジェクトデータありがとうございます!
調査を進めるにあたっての確認なのですが、敵の壁判定を親オブジェクトと子オブジェクトの2種類に分けている意図はなんでしょうか?
親オブジェクトの壁判定単体ではできないことがありそれを解決するために行われているとおもうのですが、よろしくお願いします。
PIero
8
普段はプレイヤーと敵の子の壁判定は接触しますがダッシュでのすり抜けや敵の落下時等には接触させたくないのでその時だけ子の壁判定だけが消えるようにしています。(まだ作り始めで設定しきれていない所もありますが)
敵の親の壁判定はタイルのみと接触します。親のHPが0になると子も消滅します。
逆に敵ではなくプレイヤー側の子に壁判定を持たせた場合壁貫通の頻度はかなり減りましたが、
敵個別のタイミングで壁判定の有無をコントロールできないので制作の幅が狭まります。
コリジョンのレイヤーマスクを変数などで切り替えることが出来れば、子を使わなくてもある程度解決できそうですがそれが可能なのかどうかも分からないので現状この方法を取っています。
まず、埋まる件についてですが、コリジョンレイヤー/マスクが問題の可能性が高そうです。
基本的に、Godotの衝突システムでは、一方が動かないといったケースを除けば双方向に衝突するようにレイヤー/マスクは合わせることが推奨されています。
プロジェクトでは以下のように設定されていました。
タイル:レイヤー1,2,3,9,12 マスク9
敵(本体):レイヤーなし マスク3
敵(子オブジェクト):レイヤー1,9,12 マスク9,12
プレイヤー:レイヤー1 マスク9
敵が壁に埋まる件は、敵→タイルはマスク3、レイヤー3で衝突が発生しますが、タイル→敵は敵にレイヤーが存在しないので接触が発生しません。そのため、タイルから敵を押し返す力が発生しないためすり抜けるといったことが起きるのではないかと思われます。
敵に挟まれるとプレイヤーがめりこむ件は子オブジェクト化していることと、上記が関係しそうです。
敵本体からプレイヤーは見えないので、プレイヤーにはあたらず、すりぬけようとします。しかし、敵の子オブジェクトがプレイヤーに当たるため、すり抜けている敵本体に追従しようとしてプレイヤーを押す力を発生させます。しかし、タイルはマスク9しか設定されていないため、押し返す力が発生しません。
結果的に、子オブジェクトとのめりこみを解決するために押し返されたプレイヤーが壁にうまる、ということが発生するのだと思われます。
解決策としては、「敵本体」と「タイル」、「プレイヤー」と「タイル」が相互にぶつかるようにレイヤー/マスクを設定いただくことかと思います。
また、
Attack Collisionのdisabledをオンにしたものがオフになってるのか本来攻撃判定のないアニメーションで攻撃判定が出てしまう
確認したところ、InvincibleSettingsで「無敵中に当たり判定を攻撃判定に変更」プロパティがオンになっていました、おそらくこのためかと思われます。
・・・これが初期値でオンなのはよろしくないですね、初期値をオフにするように開発に報告をしておきます。
よろしくお願いいたします。
PIero
10
お返事ありがとうございます。
無敵中の攻撃判定にはついては理解しました。教えていただきありがとうございます。
壁判定についてですが敵オブジェクト同士は常に接触しない設定にしたい為、以下の様に設定しましたが結果は変わりませんでした。
タイル:レイヤー1,2,3 マスク1,2,3
敵(本体):レイヤー2 マスク3
敵(子オブジェクト):レイヤー1 マスク1
プレイヤー:レイヤー1 マスク1
何か私の設定がおかしいのでしょうか、
それともやはりレイヤーの違う親に追従する子オブジェクトレイヤーに押された場合埋まると考えた方がいいのでしょうか?
それともやはりレイヤーの違う親に追従する子オブジェクトレイヤーに押された場合埋まると考えた方がいいのでしょうか?
こちらは詳しく実装を見たわけではありませんが、おそらく埋まると考えた方が良いです。
というのも、離れず追従の実装としては、本体の位置に毎フレームテレポートするような実装になっているはずです。
その場合、通常は接触はお互い押し出されて終わりですが、押し出された瞬間に子オブジェクトは再び埋まる位置にテレポートします、そうなると再びプレイヤーは押し出されますのでプレイヤーだけが一方的に押されていくことになります。
以下のように、プレイヤー→敵(子オブジェクト)をマスクで接触しないようにして子オブジェクトに押されないようにすれば問題は起きなくなります。
タイル:レイヤー1マスク1,2,3
敵(本体):レイヤー3 マスク1
敵(子オブジェクト):レイヤー3 マスク2
プレイヤー:レイヤー2 マスク1
ただ、敵にプレイヤーが押される、を実装したいのであれば子オブジェクトを使わない形で壁判定を実装する必要はありそうです。
壁判定を親と子オブジェクトに分けることで何を実現したいのか?によってアドバイスできることがあるかもしれませんのでよろしければお教えいただけないでしょうか?
PIero
12
すみません、やってみましたが私の勘違いでなければ
この設定だとプレイヤーと敵がまったく接触しないので子オブジェクトを付ける理由が無いです。
最初の方でも少し書きましたが
敵とプレイヤーは基本接触判定があり、
ダッシュ等特定のアクション中にのみ接触せずにすり抜けたい。(その瞬間だけ敵の子オブジェクトだけ壁なしにしています)
すり抜け中も含め、敵にはタイルとの接触判定は常にある。
つまり
・プレイヤーに接触する壁判定、
・タイルにだけ接触する壁判定
の2種類用意してそれぞれ壁判定の有り無しのタイミングを別で設定したいのです。
近接格闘アクションなので接触判定が無ければ大きく前進する攻撃やコンボで敵をすり抜けてしまいます。
本体の壁判定を無くす方法だとタイルを突き抜けたり画面外への落下の危険があります。
一般的なジャンプアクションでは無く格闘ゲームの様なシステムです。
なぜそんな変なシステムにするのか?ジャンプで飛び越えればいいのでは?
近接ではなく弾を撃てばいいのでは?と思われるかもしれませんが、そういうゲームが作りたいからとしか言えません。
子オブジェクトを使わなくとも一つのオブジェクトに2種類の壁判定を付けてレイヤーとマスクを別々に設定出来れば同じことが出来ますが、そういった方法はあるでしょうか?
無さそうでしたら現状プレイヤー側に壁をつけてタイルに埋まると定位置へワープする仕組みなどを設けて対策していこうと思います。
長々と申し訳ありません。
なるほど、
「プレイヤーの特定のアクション中のみ敵をすり抜けるようにする。」が目的ということですね。
それであれば、
該当のアクション中は「プロパティを変更」「オブジェクトのプロパティ」で自分自身のGameObjectノードを指定して、一時的にCollisionMaskを変更してタイル以外にはあたらないようにする形はどうでしょうか?
通常時、
タイル:レイヤー1 マスク1,2,3,4
プレイヤー: レイヤー2,4 マスク1,3
エネミー: レイヤー3 マスク1,2
すり抜け実行時
プレイヤー: レイヤー4 マスク1
のようにすればエネミー同士はあたらず、エネミーとプレイヤーは普段接触するがすり抜け実行時は当たらない、とできるのではないかと
PIero
14
教えていただいた方法で上手くいきそうです!ありがとうございます。
とても作りこまれているのが見て取れたので、無事解決してよかったです!
ACTION GAME MAKERはアクツクMVと比較してできることも多いのですが、勝手が大きく違い情報も少ない部分もありますので・・・・困った部分などがあればこのRPG MAKER GUILDやDISCORD等でぜひ聞いてみてください。
「いいね!」 1