「Unity」地面との当たり判定は、
「ContactFilter2D」派の大和局長です。
悩みがちな地面との判定です。
当たり判定用のオブジェクトを使ったりもしましたが、
予想外の挙動をして苦しんでたなー(  ̄- ̄)トオイメ
ContactFilter2Dを使えばいいんじゃないかな?
そして、いろいろ使ってみた結果、
私は「
ContactFilter2D」にたどり着きました~
Unityは当たり判定とか用意してくれてるんだから、
用意しといてくれよ!
…と、思ったらありました。
ふつーに存在してました。
気づかなかっただけでした。
これなら「Raycast」 を使わずに、
簡単に地面との判定をとれるみたい。
しかも、左右の壁や天井とは判定を取らないとのこと、便利!
左右に飛び跳ねるプログラムで使ってみた!
地面と接地しているときに、
マウスクリックで左右に動くプログラムで試しました!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | [SerializeField] private ContactFilter2D filter2d = default ;
private Rigidbody2D rb2d;
private float jumpPower = 300;
void Start()
{
rb2d = GetComponent <rigidbody2d>();
}
void Update()
{
bool ground = rb2d.IsTouching(filter2d);
if (ground)
{
if (Input.GetMouseButtonDown(1))
{
rb2d.velocity = new Vector3();
rb2d.AddForce( new Vector3(0.5f, 1) * jumpPower);
}
if (Input.GetMouseButtonDown(0))
{
rb2d.velocity = new Vector3();
rb2d.AddForce( new Vector3(-0.5f, 1) * jumpPower);
}
}
}
|
地面と接しているときのみ、ジャンプできるので、
空中でジャンプはできません。
使い方は、
まずはこれを宣言します。
1 | [SerializeField] private ContactFilter2D filter2d = default ;
|
Update()の↓で判定が取れます
1 | bool ground = rb2d.IsTouching(filter2d);
|
Rigidbody2Dを使うので取得しておかないといけないので注意!
Start()の時に取得しておきました↓
1 2 3 4 | void Start()
{
rb2d = GetComponent <rigidbody2d>();
}
|
あとは、
rb2d.AddForce(new Vector3(-0.5f, 1) * jumpPower);
で飛ばしています(これは左へ)
これだけでも私は問題なかったんですが、
角度を指定しておいた方がよさそうです。
・ UseNormal Angleにチェックを入れる
・ Min Normal AngeltとMax Normal Angleを
まとめ
わざわざ判定用のオブジェクトを用意することも、
Rayを飛ばす必要もなく、簡単に判定を取ることができました!
プログラムも短くて済むので、
初心者の私でも簡単に使うことができます。
ちなみにこれは2D用です。
※ 参考にしたサイト