衝突後に両方のオブジェクトを止めたい【UUJ】

■質問

球が箱にあたったとき、両方とも全く動かないようにするにはどうすればいいでしょうか?
両方にRigidbody2Dをつけて、球のほうのスクリプトに、

1.findで箱オブジェクトをとる。
2.箱のpositionを記憶しておく。

3.衝突したときに、記憶した座標を入れる。

という処理を書いていますが上手くいきません。

■回答

ぶつかったときに両方の Rigidbody2Dの isKinematic を true にしてやれば良いと思います。


void OnCollisionEnter2D(Collision2D col)
{
col.gameObject.transform.rigidbody2D.isKinematic = true;
}

で良いのでしょうか?

※注釈
無駄にtransform(=GetComponent<Transform>)が走っているのでよろしくないかもです。

ぶつかった瞬間微妙に動いてしまいます。
後、両方のKinematic を true にしてしまうとすり抜けてしまうのでtrue にするのは片方だけでいいですか?


物理的に、2つの物体がぶつかって両方全く動かないというのは奇妙な現象ですね。
多くの物理エンジンは基本的な物理シミュレーションを行うように作られていますので、
もしも非物理的な挙動を実装したいなら自分でプログラミングした方が望んだ演出が出来るかも知れません。


ぶつかる前に箱が動いていないのなら箱のisKinematicをtrue にしておけば箱は動きませんし、
玉にphysicsmaterial を付けて反発係数を0にしておけば玉は跳ね返りません。


箱のisKinematicをtrueにすると動かなくなりました。
しかし、何度もぶつけると箱をすり抜けたりおかしな方向に飛んでいったりしてしまいます。


箱が動かないならコライダー付けるだけでよかったのではないですか?
Rigidbodyは物理運動させたいもの、今回なら玉だけに付ければ良かったのではないでしょうか?

玉がすり抜けたり、おかしな方向に行くのは玉の速度が速すぎるのが原因かも知れません。
速度を調整したり、コライダーの大きさを変えたりして調整してください。


すり抜け以外は治りました!


すり抜けに関しては、

・Rigidbody の Collision DetectionをContinuousに設定
・Edit>Project Settings>Time の Fixed Timestepをより細かい値にする

などで改善することがあります。
Fixed Timestepを細かい値にしすぎると動作も重くなりますので、注意しながら値を小さくするようにしましょう。


※注釈

僕がすり抜けに困ったときは全体の大きさを10倍にして、見た目が変わらないようにカメラから見た大きさを10分の1にして回避しました。

Comments

comments

スポンサーリンク
336*280px
336*280px

フォローする

スポンサーリンク
336*280px