0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Distance Joint 2Dの解説

Last updated at Posted at 2020-08-05

今回はphysics2Dの中にあるDistance Joint 2Dについて解説していこうと思います。

#Distance Joint 2Dとは
Distance Joint 2Dは、2つのオブジェクト間の距離を保たせるための機能です。
近づきもせず、離れもせず。そんな感じの機能です。
jointというのは「関節」や「付け根」などの意味を持っているそうです。

#Distance Joint 2Dの各パラメータ
distanceJoint2d_param.png
所々パラメータの名前が見切れていてすみません。
パラメータが多いですが頑張って1つずつ見ていきましょう。

###・Enable Collision
このパラメータは、アタッチしたオブジェクトと当たり判定をするかどうかというのを決める為のものです。
これのチェックボックスにチェックをすると衝突するようになります。
チェックを外すと、衝突判定をせずにアタッチしたオブジェクトをすり抜けられるようになります。
下のConnected Rigid BodyがNoneの状態でここのチェックを外すと、Rigid Body2Dがないオブジェクトとの衝突判定をしなくなります。

###・Connected Rigid Body
ここにオブジェクトをアタッチすると、そのオブジェクトとつながった状態になります。
ここにオブジェクトをアタッチしない場合、ワールド空間とつながった状態になります。

###・Auto Configure Connected Anchor
2つ下の「Connected Anchor」を自動的に決めるためのものです。
あまりこれを使うのはオススメしません。これを使うとオブジェクトが変な挙動をする可能性があるからです。

###・Anchor
このオブジェクト側の基準点を決めるところです。
ワールド座標ではなく、このオブジェクトのローカル座標になっているので注意してください。
私はX、Yともに0にすることをオススメします。

###・Connected Anchor
アタッチしたオブジェクト側の基準点を決めるところです。
ここで使われている座標はアタッチしたオブジェクトのローカル座標です。
こちらもX、Yともに0にすることをオススメします。

###・Auto Configure Distance
ここのチェックボックスにチェックを入れると二つのアンカーの距離が下のDistanceに入力されます。
注意点として、このチェックボックスにチェックを入れたままプロジェクトを実行して、どちらかのオブジェクトの座標を直接いじると、Distanceの値が変わってしまいます。もしかしたら他にもDistanceの値が変わってしまうやり方があるかもしれないので、チェックは1回付けたら外しておきましょう

###・Distance
ここでは、2つのアンカーの距離を決めます。
2つのオブジェクトの距離がここで決められた距離よりも離れていた場合、両方のオブジェクトが決められた距離まで近づいていきます。

###・Max Distance Only
ここのチェックボックスにチェックを入れると、2つのオブジェクトはDistanceで決められた距離よりも近づくことができるようになります。
ロープで繋がっているようなイメージです。

###・Break Force
二つのオブジェクトのつながりを断ち切り、Distance Joint 2Dを削除するために必要な力を決めます。
infinityだと絶対に切れることはありません。
また、infinityに戻したいときは「inf」と入力してください。

#スクリプトの一例

private void OnCollisionEnter2D(Collision2D collision)
{
this.GetComponent().enableCollision = true;
this.GetComponent().connectedBody = collision.rigidbody;
this.GetComponent().anchor = new Vector2(0, 0);
this.GetComponent().connectedAnchor = new Vector2(0, 0);
this.GetComponent().distance = 2;
this.GetComponent().maxDistanceOnly = true;
this.GetComponent().breakForce = Mathf.Infinity;
}

これはぶつかってきたオブジェクトを捕まえる的なプログラムです。
あらかじめこのオブジェクトのBody Type(Rigid Body2dのパラメータ)をkinematicにして床とかに触れないようにするか、if文を使って捕まえられるオブジェクトを限定する必要があります。

#おわりに
今回は前回よりもパラメータが多いうえにややこしいのも結構あって大変でした。
Joint系は恐らく全部こんな感じだと思いますが、あと8個あるのでそれは全部記事にしていこうと思います。
私もまだまだ理解できていないところが多いので、記事も書きながら勉強していく所存です。なので、この記事を読んでくださった皆様のなかで間違いなどを見つけたら、ご指摘いただけるとこちらとしても嬉しいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?