Unity(C#)初心者・入門者向けチュートリアル ひよこのたまご

AndroidやiOS向けアプリを簡単に作れるゲーム開発環境Unity(ユニティ)の使い方を、チュートリアル方式で一緒に学びましょう!

【Unity2】ブロックを消そう!AddForce, OnCollisionEnter, Physics Material【ブロック崩し2】

Unityバージョン:5.0.0f4 Personal (2015年4月)

f:id:hiyotama:20150423102016p:plain

 

前回の続きを書いていきたいと思います〜

今回は、ボールに動きを加えるのと、ボールがブロックに当たった時にブロックを消したいと思います〜

【目標】ボールをぶつけて、ブロックを消す!

【課題1】ボールを動かす

まずは前回作成したボールに、RigidBodyコンポーネントをくっつけて下さい〜

そして、RigidBody>Constraintsを開いて、FreezePositionのZ、FreezeRotationのX,Y,Zにチェックを入れて下さい〜こうすることによって、ボールはZ軸方向(つまり画面の奥)へは進みませんし、回転も全くかからなくなります〜

次に空気抵抗を表すDragを0、UseGravityのチェックを外して無重力状態にして下さい〜

質量を表すMassは1にしても1000にしても無重力なので変わらないです〜回転の空気抵抗を表すAngularDragも、回転を制限しているため値を変えても問題ないです〜

最後にCollisionDetectionをContinuousに変更しましょう〜こうすると連続的に衝突判定をしてくれます〜今回のボールは結構早く動くので、Discrete(個別判定)のままだとすり抜けてしまいます〜

f:id:hiyotama:20150423134725p:plain

こんな感じに設定しました

 

さて続いて、Ballオブジェクトに以下のC#scriptを付けます〜

AddForceを使って、ボールに右上への力を加えています〜

【※※※Unity5におけるルール変更※※※】

AddForceのような重力関係の処理を行う時、RigidBodyというコンポーネントを必要としますが、Unity4までは「rigidBody(頭文字が小文字)」と書けば使うことができました〜これはUnityが暗黙的に「GetComponent<RigidBody>()」という処理をやってくれていたのですが、Unity5からは明示的に書かないといけなくなりました〜

上のコードのようにStartメソッドで一度GetComponentを「rb」に入れておけば、あとはこのscript内で「rb」と書くだけで何度でも使い回すことができます〜(これをキャッシュすると言います〜)

 

AddForceの一番後ろについているForceMode.VelocityChangeは、ブロック崩しの時は決まり文句だということです。「その質量を無視して、rigidBodyに瞬時に速度変化を追加します。」だそうです〜

これでとりあえずボールが動くようになりました〜

f:id:hiyotama:20150423135129p:plain

 

【課題2】ブロックとの衝突判定

ボールがブロックに当たった時、ボールが消えるようにしたいと思います〜

非常にシンプルなscriptをブロックに付けることで、ボールとブロックが衝突した時にブロックを消すことができます!

ブロックに当っても跳ね返ることなく、触れる物全てを消し去る悪魔のようなボールが完成しました

f:id:hiyotama:20150423153454p:plain

跳ね返らない・・・

これではゲームとしてあまり面白くないので、ブロックにぶつかった時ボールが跳ね返るようにしましょう!

Project>Create>Physics Materialを選択し、「bounce」と名前をつけて保存しておきましょう〜

Inspectorから設定していきます〜

DynamicFrictionは移動中の摩擦による減速を定義します〜0に設定して動き続けるようにしましょう!

StaticFrictionは何かに接している時の摩擦を定義します〜0に設定して綺麗に反射するようにしましょう〜(氷の上をすべるアクションを作る際にも、StaticFrictionを0にするといいんですかね〜)

跳ね返し度合いを定義するBouncinessは1にします〜こうすることによって力を失わず跳ね返ってくれます〜

FrictionCombineは、2つの衝突するオブジェクトの摩擦を定義します〜Averageは摩擦が平均化され、Minimumで2つのうち小さい方の摩擦値が使われ、Maximumは逆に大きい値が使われ、Multyplyは2つの摩擦値が乗算されます〜今回はMinimumに設定します〜

BounceCombineは、FrictionCombineの摩擦値が跳ね返し度合いに変わったものです〜こちらはMaximumに設定します〜

f:id:hiyotama:20150424102334p:plain

PhysicsMaterialをボールにつけます〜SphereColliderコンポーネントのMaterialにつけると・・・

f:id:hiyotama:20150423155223p:plain

 

ブロックが消え、ボールもしっかりと跳ね返ってくれます!

f:id:hiyotama:20150423155338p:plain

 

今回はここまで、次回はプレイヤーを動かして、ゲームが続くようにしたいと思います〜

ありがとうございました〜

 

【Unity開発2】下準備【ブロック崩し1/5】

【Unity開発2】ボールをぶつけて、ブロックを消したい!【ブロック崩し:2/5】

【Unity開発2】プレイヤーを動かしてゲームを継続させたい!【ブロック崩し:3/5】

【Unity開発2】ゲームオーバー・ゲームクリアを出したい!(前編)【ブロック崩し:4/5】

【Unity開発2】ゲームオーバー・ゲームクリアを出したい!(後編)【ブロック崩し:5/5(Fin)】