ももんの日常

アニメとマンガとプログラミングと

【Unity】衝突判定2D メモ

衝突判定についてのメモです。

2D用になります。

 

プレイヤーを他のオブジェクトに触れている間だけ移動させたい。(空中では停止させたい)

 

まず、移動させるオブジェクトを作成しましょう!

HierarchyパネルのCreate → 3D Object → Cube

f:id:toho_moko_keine_114:20160505030344p:plain

CubeのInspectorからRotationの値を全て0に変更します。

そして、Box Colliderのところで右クリックをし、Remove Componentを選択し、削除します。

f:id:toho_moko_keine_114:20160505030618p:plain

その後に、下の方にある

Add ComponentのボタンからPhysics 2D → Box Collider2Dを選択します。

もうひとつ!

Add ComponentのボタンからPhysics 2D → Rigidbody 2Dを選択します。

f:id:toho_moko_keine_114:20160505031100p:plain

※Box Collider 2DのIs Triggerのチェックは外してください!(つけていると地面をすり抜けてしまいます)

 

これでオブジェクトの設定は完了です!

 

次に、コードを書いていきます。

Projectパネルで右クリック → Create →C# Scriptで作成します。

Script名はplayerっと...。あっ、Script名は自由に決めてくださいね?

f:id:toho_moko_keine_114:20160505025125p:plain

ここからコードの内容について説明していきます。

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のチェックがある場合の衝突判定に用いられます。

 

 

そろそろ終盤です!

f:id:toho_moko_keine_114:20160505032544p:plain

 作成したScriptを移動させたいオブジェクトにドラッグ&ドロップ

すると...

f:id:toho_moko_keine_114:20160505032741p:plain

下の方に先ほど作成したScriptが!!

ちゃんとつけられていますね。うんうん。

publicを使用すると、

ここでSpeedの速さを変えることができます。

つまり、コードに直接書かなくとも変更出来るということです!

便利ですね... 

 

それでは、実行してみましょう...

f:id:toho_moko_keine_114:20160505035247p:plain

お?

f:id:toho_moko_keine_114:20160505035414p:plain

おお!ちゃんと移動していますね!

(床にはBoxCollider2Dだけをつけ、Rigidbody2Dはつけなくていいです)

 

これで物体に触れている間だけ移動することが可能になりました。

衝突判定はいろんな場面でも使用できそうですね。

 

今回はここまでにします!お付き合いありがとうございました!

 

P.S.

こういうメモをブログに残すと勉強にもなりますし、便利ですね。

ただ、時間が...