【Unity】衝突判定2D メモ
衝突判定についてのメモです。
2D用になります。
プレイヤーを他のオブジェクトに触れている間だけ移動させたい。(空中では停止させたい)
まず、移動させるオブジェクトを作成しましょう!
HierarchyパネルのCreate → 3D Object → Cube
CubeのInspectorからRotationの値を全て0に変更します。
そして、Box Colliderのところで右クリックをし、Remove Componentを選択し、削除します。
その後に、下の方にある
Add ComponentのボタンからPhysics 2D → Box Collider2Dを選択します。
もうひとつ!
Add ComponentのボタンからPhysics 2D → Rigidbody 2Dを選択します。
※Box Collider 2DのIs Triggerのチェックは外してください!(つけていると地面をすり抜けてしまいます)
これでオブジェクトの設定は完了です!
次に、コードを書いていきます。
Projectパネルで右クリック → Create →C# Scriptで作成します。
Script名はplayerっと...。あっ、Script名は自由に決めてくださいね?
ここからコードの内容について説明していきます。
Rigidbody2D user;
これでGameObjectが物理特性を持ちます。
transformを使用しても移動できますが、物理特性がないのでtransformは利用しません。(すり抜けます)
void Start (){}
これは実行時に一度だけ呼ばれるメソッドです。
user = GetComponent<Rigidbody2D>();
中身ですが、これはGetComponent処理をキャッシュしてます。
つまり、動作を軽くするということですね。
時々、JavaScriptからC#にアクセスしようとすると取得できない場合があるそうです。
その場合、文字列を使用して取得するといいそうです。↓
Unity - スクリプトリファレンス: Component.GetComponent
void FixedUpdate () {}
次に、このメソッドは毎フレームごとに呼ばれるメソッドです。
Rigidbodyを扱う場合はUpdateの代わりにこちらを使用します。
今回は使用していません。
衝突判定関係なく常時移動させたい場合は、ここに移動させるイベントを書きましょう。
void OnCollisionStay2D(Collision2D collision){}
さあ、ここで移動させましょう。
OnCollisionStay()は他のColliderやRigidbodyオブジェクトに触れている間、呼び出されるメソッドになります。
今回は、2Dで作成しています。なので、OnCollisionStayの後に2Dを忘れないように注意してください!(私はここで2時間くらい悩んでました...)
javascriptの場合はvoidではなく、functionぽいです。
user.velocity = new Vector2(speed, user.velocity.y);
user(Rigidbody).velocityとは、
Rigidbodyの速度ベクトルを表しています。(加速度)
これで移動方向等を決めることができます!
今回は、X軸方向のみに移動させたいので
触れている間、X軸方向にspeed分だけ移動します!(画像ではspeedは0になってますが、自由に変更してください!後で変更もできます!)
停止させたい場合、Rigidbody.velocity = Vector2.zero;でできます。
Y軸方向は特に移動などもしなくて良いので、
user.velocityで取得した値をそのまま入れます。
これで完成です!
ちなみに、rigidbody.angularVelocityというものもあります。
こちらは回転加速度です。
他の衝突判定のイベントです。
OnCollisionEnter:別のオブジェクトに触れた時、発生。
OnCollisionStay:別のオブジェクトに触れている間、発生。
OnCollisionExit:接触しているオブジェクトが離れた時、発生。
場合によって使い分けてくださいね。
似たもので、OnTriggerEnterなどのイベントもあります。
違いとして簡単に説明すると、
OnCollision:オブシェクトのColliderにisTriggerのチェックがない場合の衝突判定に用いられます。
OnTrigger:オブシェクトのColliderにisTriggerのチェックがある場合の衝突判定に用いられます。
そろそろ終盤です!
作成したScriptを移動させたいオブジェクトにドラッグ&ドロップ!
すると...
下の方に先ほど作成したScriptが!!
ちゃんとつけられていますね。うんうん。
publicを使用すると、
ここでSpeedの速さを変えることができます。
つまり、コードに直接書かなくとも変更出来るということです!
便利ですね...
それでは、実行してみましょう...
お?
おお!ちゃんと移動していますね!
(床にはBoxCollider2Dだけをつけ、Rigidbody2Dはつけなくていいです)
これで物体に触れている間だけ移動することが可能になりました。
衝突判定はいろんな場面でも使用できそうですね。
今回はここまでにします!お付き合いありがとうございました!
P.S.
こういうメモをブログに残すと勉強にもなりますし、便利ですね。
ただ、時間が...