【Unity2】ブロックを消そう!AddForce, OnCollisionEnter, Physics Material【ブロック崩し2】
Unityバージョン:5.0.0f4 Personal (2015年4月)
前回の続きを書いていきたいと思います〜
今回は、ボールに動きを加えるのと、ボールがブロックに当たった時にブロックを消したいと思います〜
【目標】ボールをぶつけて、ブロックを消す!
【課題1】ボールを動かす
まずは前回作成したボールに、RigidBodyコンポーネントをくっつけて下さい〜
そして、RigidBody>Constraintsを開いて、FreezePositionのZ、FreezeRotationのX,Y,Zにチェックを入れて下さい〜こうすることによって、ボールはZ軸方向(つまり画面の奥)へは進みませんし、回転も全くかからなくなります〜
次に空気抵抗を表すDragを0、UseGravityのチェックを外して無重力状態にして下さい〜
質量を表すMassは1にしても1000にしても無重力なので変わらないです〜回転の空気抵抗を表すAngularDragも、回転を制限しているため値を変えても問題ないです〜
最後にCollisionDetectionをContinuousに変更しましょう〜こうすると連続的に衝突判定をしてくれます〜今回のボールは結構早く動くので、Discrete(個別判定)のままだとすり抜けてしまいます〜
こんな感じに設定しました
さて続いて、Ballオブジェクトに以下のC#scriptを付けます〜
AddForceを使って、ボールに右上への力を加えています〜
【※※※Unity5におけるルール変更※※※】
AddForceのような重力関係の処理を行う時、RigidBodyというコンポーネントを必要としますが、Unity4までは「rigidBody(頭文字が小文字)」と書けば使うことができました〜これはUnityが暗黙的に「GetComponent<RigidBody>()」という処理をやってくれていたのですが、Unity5からは明示的に書かないといけなくなりました〜
上のコードのようにStartメソッドで一度GetComponentを「rb」に入れておけば、あとはこのscript内で「rb」と書くだけで何度でも使い回すことができます〜(これをキャッシュすると言います〜)
AddForceの一番後ろについているForceMode.VelocityChangeは、ブロック崩しの時は決まり文句だということです。「その質量を無視して、rigidBodyに瞬時に速度変化を追加します。」だそうです〜
これでとりあえずボールが動くようになりました〜
【課題2】ブロックとの衝突判定
ボールがブロックに当たった時、ボールが消えるようにしたいと思います〜
非常にシンプルなscriptをブロックに付けることで、ボールとブロックが衝突した時にブロックを消すことができます!
ブロックに当っても跳ね返ることなく、触れる物全てを消し去る悪魔のようなボールが完成しました
跳ね返らない・・・
これではゲームとしてあまり面白くないので、ブロックにぶつかった時ボールが跳ね返るようにしましょう!
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に設定します〜
PhysicsMaterialをボールにつけます〜SphereColliderコンポーネントのMaterialにつけると・・・
ブロックが消え、ボールもしっかりと跳ね返ってくれます!
今回はここまで、次回はプレイヤーを動かして、ゲームが続くようにしたいと思います〜
ありがとうございました〜
【Unity開発2】ボールをぶつけて、ブロックを消したい!【ブロック崩し:2/5】
【Unity開発2】プレイヤーを動かしてゲームを継続させたい!【ブロック崩し:3/5】