やりたいこと
〜Collider2Dが付いているオブジェクトに横、また下からは侵入できるけど、上からのみ当たり判定をしたい
どうしたらいい?
PlatformEffector2Dコンポーネントを使おう!公式サイトはこちら
使い方
〜Collider2Dが付いているオブジェクトにPlatformEffector2Dコンポーネントを付けて、更に〜Collider2DコンポーネントのUsed By Effectorのチェックボックスを入れるだけ。その状態でとりあえず下から侵入できるようになります。
更に両サイドからも当たり判定を無くしたい場合はSurface Arcの角度を180°よりも小さくしてみてください。そうすると両サイドからも侵入できるようになるはず!
コメント
こんにちは。
PlatformEffector2Dで検索してたどり着きました。
自分もPlatformEffector2Dで左右や下から侵入できる足場を作ったのですが、木箱に触れている最中は設置判定が常時発生してしまい、木箱と重なった状態でジャンプをすると設置判定が付いたままジャンプをしてしまったりして挙動がなかなか制御しずらく困っています。
トミ様はその問題についてなにか解決法とかご存知だったりしますでしょうか。
こんにちは。
コメントありがとうございます。
>木箱に触れている最中は設置判定が常時発生して・・・といった内容ですが
具体的に何をやりたいかを教えていただけますでしょうか?また設置判定(=接地判定)のことを指しているでしょうか?
はい。
設置判定→接地判定です、失礼いたしました。
記事の内容+木箱の上に乗れるような設定にしたいです。
木箱自体に足場の判定をつけ、左右からは抜けられるが、ジャンプなどで上に乗れるようにした場合、想定通りに動くのですが、木箱と重なった状態でジャンプをすると挙動がおかしくなってしまいます。
その現象の解決法を知っていたら聞かせていただきたいという内容でした。
挙動はどうおかしくなるのかは分からないですが、作りも多分違うので原因の判断はちょっと難しいですが、
私の作りを簡単にお伝えしますと
・キャラ本体のコライダーとは別に接地判定用のコライダー(GroundCheck)を別で用意しています。GroundCheckはisTriggerにしています。
・GroundCheckのスクリプトで接触判定用の関数(OnTriggerEnter2D、OnTriggerStay2D、OnTriggerExit2D)で木箱と接触するとIsOnGround = true, 離れるとIsOnGround = falseのプロパティを用意しています。
・キャラ本体のスクリプトでGroundCheck.IsOnGroundの状態を見て処理をするようにしています。
・IsOnGroundがtrueならジャンプ可能にし、逆にfalseならジャンプ不可にしています。
ありがとうございます。
すみません、図を返信に載せられないので文章ベースでわかりにくくなってしまいますがお許しください。
いただきました各項目ありがとうございます。
自分も同じように作っております。
その上で木箱の話なのですが、
・木箱に木箱と同じ大きさのコライダーを付けております。
・また、PlatformEffector2Dをつけ、「左右からはすり抜けるが上から接触した場合は木箱の上に乗る」という実装をしております。
・木箱には地面用のレイヤーで設定しており、GroundCheckが木箱に接触すると接地判定がONになります。
この状態で現在発生しているのが、木箱と重なったキャラクターが無限ジャンプできてしまう、という問題です。
一例ですが、スケールを100倍にした木箱を置いて、その前にキャラクターを立たせた場合、木箱に触れている限り、無限にジャンプが出来てしまい、意図しない挙動となる、という感じです。
トミ様の方ではこういう状態になったりはしませんでしょうか。
なるほど、現象はよくわかりました。
自分も木箱を100倍にしてやってみました。確かに無限ジャンプ出来てしまいますね。
ということはGroundCheckと木箱が接触していれば、接地判定という条件は不健全だと思いますね。
であれば、条件をちょっと変更するようにしてみたところ、この問題を解決できました。
つまり、条件は「GroundCheckと木箱が接触している 且つ 接触している部分は限りなく木箱の上辺に近いところでないといけない」
・GroundCheckと木箱が接触しているは今まで通りで、割愛しますが
・接触している部分は限りなく木箱の上辺に近いところでないといけない はこのように実現しています。
1.木箱の上辺のワールド座標を取得する(左上でも右上でも、またはその線上のいずれかの座標でも可)
2.GroundCheckを起点に下方向へRayを飛ばしてみる。Rayがあたった座標を取得する(Rayの距離は0.03とか小さい数値で調整)2.GroundCheck自身のpositionを取得する
3.ステップ1とステップ2で取得した座標間のY軸の差分を取得する
4.Y軸の差分が0.01よりも小さい場合であれば、木箱の上辺との距離が限りなく近いと見なす
そうすれば、GroundCheckと木箱がただ接触しているだけでは接地判定しなくなりました。
Rayの飛ばし方はこちらの記事で書きました。
https://tomi-no-tubuyaki.com/game-develop/unity/how_to_use_raycast/
もう1つ方法を思いついたですが、シンプルに木箱に接地判定用の別のコライダーを用意するだけでもいいかもしれないです。そのコライダーを縦に薄くして木箱の上辺に持っていけばいいかなと
ご回答ありがとうございます。
接地判定がONになった瞬間にジャンプモーションがキャンセルさせてしまうなど不具合が出てしまいましたのでもう少し色々やり方を調べてみたいと思います。
色々とテョ右方をご提案いただきありがとうございます、助かりました!