こないだブロックくずしのゲームを1時間ほどで作ってみましたので、今回ブロック崩しの作り方を説明して行きたいと思います。
ちなみに作ったのはコチラのゲームです。
http://a-field-of.kokage.cc/flash/Kinen/index.php
今回作るものは↓です。
マウスでバーを動かします。ゲームオーバーやゲームクリアの処理は追加していません。
プロジェクトの作成と準備
とりあえず空のプロジェクトを作りましょう。
画面がきっと暗いのであらかじめ
「GameObject -> CreateOther -> DirectionalLight」
を選択しライトを配置しておきましょう。
崩されるブロックを作る
「GameObject -> CreateOther -> Cube」
からキューブを作成します。
・名前は「Block」に変更しておきましょう。
・拡大縮小ツールで良い感じのサイズに変更しましょう。
また、後々ややこしくなるのでBlockのZ座標は0に設定しておきましょう。
(X,Y座標は0でなくても大丈夫です。)

ここまでの作業で↑の様に出来ましたでしょうか。
次に、カメラを移動しブロックがいい感じに映る位置に動かしましょう。
こんな感じ

ボールを作る
次にブロックを崩す側となるボールを作って行きましょう。
「GameObject -> CreateOther -> Sphere」
から球を作りましょう。
・Z座標がブロックと同じでないとぶつかりませんので0に設定しておきましょう。
・名前はBallに変更しておきましょう。
こんな感じ

次にボールに対して物理計算ができるようRigidBodyを追加し、設定して行きましょう。
Ballを選択したまま「Component -> Physics -> Rigidbody」を選択しRigidbodyを追加します。
このブロックくずしではボールに対して重力を発生させる必要は無いので
「Use Gravity」のチェックを外しておきましょう。
またZ座標の移動は必要ありませんので、
「Constraints」の「Freeze Position」のZにチェックを入れておきましょう。
このチェックを入れることでボールのZ座標の移動を制限することができます。

ボールのスクリプトを作る
Ballの動きを制御するスクリプトを作成しましょう。
Projectパネルを右クリック
「Create -> JavaScript」でスクリプトを作成し名前を「Ball」に変更しましょう。

BallスクリプトをHierarchyのBallにドラッグドロップして適用させましょう

スクリプトをダブルクリックして以下の様に編集しましょう。
#pragma strict
var FirstForce:Vector3 = Vector3(300, 300, 0);
function Start () {
rigidbody.AddForce(FirstForce);
}
function Update () {
}
FirstForce変数を用意しておきStart()の中でBallのrigidbodyに初速として追加しています。
では再生してみましょう。
ゲームを再生するとボールが右上方向に飛んで行ったらOKです!
でもブロックに当たってもボールが跳ね返りませんね…これではブロック崩しになりません

ボールに反発係数を設定する
ボールがブロックにぶつかった時に跳ね返るように設定して行きましょう。
Projectパネルを右クリックし「Create -> Physic Material」を作成しBallPhysicMaterialという名前に設定しましょう。
作成したBallPhysicMaterialを選択しInspectorパネルで反発係数を設定します。
反発係数はBounciness項目です。ここを1にしましょう。
また、BounceCombine項目をMaximumに設定しましょう。
BounceCombineは反発係数の評価方法です。Maximumに設定することでぶつかり合ったモノ同士で反発係数の大きい値の反発係数が適用されます。
つまりどのオブジェクトにぶつかっても反発係数が1で跳ね返ってくるというわけです。

次に作成したBallPhysicMaterialをBallオブジェクトに適用します。
HierarchyのBallを選択し、SphyereColliderのMaterial項目に先ほど作成したBallPhycisMaterialをドラッグドロップしましょう。

ゲームを再生してみてボールがブロックに当たって跳ね返ってくればOKです!
ボールが当たったブロックを消す
ボールがブロックにあたった時にブロックが消える様にしていきましょう。
ブロックにタグをつける
ボールが何に当たったのかを判定するため。ブロックにタグをつけます。
他のゲームを作成する場合でもここで説明するタグを付けることで、GameObjectが敵だとか弾だとかを判定するのに利用することができます。
HierarchyパネルのBlockを選択しインスペクター画面の一番上のTagのUntaggedという項目を選択し「Add Tag...」を選択しましょう。

すると画像の様にTagManagerが開きますので、Tagsの項目を三角の部分をクリックして開きElement0番目に「Block」というタグを定義しましょう。

タグを定義したらもう一度HierarchyパネルのBlockを選択しInspectorパネルのTag項目を「Block」に変更しましょう。

Ballスクリプトの編集
Ballスクリプトに以下の関数を追加してください。
場所は関数の外であればどこでも大丈夫です。
function OnCollisionEnter(col : Collision)
{
if (col.gameObject.tag == "Block")
{
Destroy(col.gameObject);
}
}
GameObjectが他のオブジェクトに衝突した時に以下のOnCollisionEnter関数が実行されます。
引数のCollisionには衝突の速度や座標が格納されています。
function OnCollisionEnter(col : Collision)
ここでは衝突の情報であるCollisionから衝突相手のGameObjectを取得し、そのGameObjectのタグが先ほど設定した「Block」であるかどうかを判定しています。
if (col.gameObject.tag == "Block")
判定の結果、衝突相手がBlockであった場合に衝突相手を以下の命令で削除します。
Destroy(col.gameObject);
ではゲームを再生してみてください。

ボールがぶつかった時にブロックが消えるようになっていればOKです。
ステージを作る
次に実際のステージを作成して行きましょう。
Blockをプレハブにする
ステージを作成する際にはブロックを複製する必要がありますので、Blockをプレハブにしましょう。
HierarchyパネルのBlockをProjectパネルにドラッグドロップしましょう。

HierachyパネルのBlockの名前の文字が青くなればプレハブ化は成功です。
今後ブロックを増やしたい場合はProjectパネルのプレハブをHierarchyパネルへドラッグするか。既にHierarchyパネルにあるBlockを複製しましょう。
ステージを配置する
ステージとなる部分を作って行きましょう。
Blockを複製してブロックを配置します。
「GameObject -> CreateOther -> Cube」から立方体を作り、拡大縮小で伸ばして外枠を作りましょう。

こんな感じにつくりました。
Hierarchyパネルを整理する
さて、Hierarchyパネルを見てください。ブロックやCubeが沢山あって非常に見づらいです…
なんとかしたいですね。

そこで空のゲームオブジェクトを作成し親子関係を指定しブロックをまとめてしまいましょう。
「GameObject -> CreateEmpty」で空のGameObjectを作成し名前を「Blocks」という名前に設定しましょう。
次に、「Block」を全て選択し、「Blocks」にドラッグドロップしましょう。
「Blocks」の左に三角のボタンが表示され、「Blocks」と「Block」の間に親子関係が設定されたらOKです。

同じ方法で囲いとして作ったCubeもまとめておきましょう。

Ballのスピードを維持する
さてゲームを再生してみてください。ボールが画面内で跳ねまわってブロックを崩してくれるようになりましたでしょうか。
ボールが跳ね返っている内にだんだん減速してしまい、最後には止まってしまったのではないでしょうか…

ボールが壁やブロックにあたった時にもう一度スピードを設定してあげればよさそうです。
BallスクリプトのOnCollisionEnterを以下の様に変更してください。
function OnCollisionEnter(col : Collision)
{
if (col.gameObject.tag == "Block")
{
Destroy(col.gameObject);
}
// 追加
rigidbody.velocity = rigidbody.velocity.normalized * 10;
}
以下が追加した部分です。
rigidbody.velocity = rigidbody.velocity.normalized * 10;
衝突時にRigidbodyのvelocity(速度)にrigidbody.velocity.normalized * 10;を代入することで正しいスピードを再設定しています。normalized項目はベクトルを正規化した値が入っています。(説明が長くなるので割愛します…)
Ballが垂直や水平に跳ね返るのを防ぐ
さて再生してみてください。
今度はボールが跳ね返っているうちに縦方向にのみ動くようになってしまいました…縦方向にだけ動くのであればこれから作るバーで跳ね返せばなんとかなりそうですが。真横にのみ跳ね返るようになってしまった場合にどうしようもなくなってしまいます…

そこで、今度は真横と真縦のみにボールが動いてしまうのを抑制しましょう。
再びBallスクリプトのOnCollisionEnterを編集します。
function OnCollisionEnter(col : Collision)
{
if (col.gameObject.tag == "Block")
{
Destroy(col.gameObject);
}
rigidbody.velocity = rigidbody.velocity.normalized * 10;
// 追加
if (Mathf.Abs(rigidbody.velocity.y) < 3) {
rigidbody.velocity.y = rigidbody.velocity.y * 3;
}
if (Mathf.Abs(rigidbody.velocity.x) < 3) {
rigidbody.velocity.x = rigidbody.velocity.x * 3;
}
}
追加したのは以下の部分です。
if (Mathf.Abs(rigidbody.velocity.y) < 3) {
rigidbody.velocity.y = rigidbody.velocity.y * 3;
}
if (Mathf.Abs(rigidbody.velocity.x) < 3) {
rigidbody.velocity.x = rigidbody.velocity.x * 3;
}
Mathf.Abs()は数値の絶対値になります。ボールの加速度が3以下になった場合に3を代入しています。こうすることで、真横や真縦にボールが跳ね返るのを防ぐことができます。
再生してみて真横や真縦にボールが跳ね返らなければOKです。
バーを追加する
さていよいよボールを跳ね返すためのバーを作って行きましょう。
「GameObject -> CreateOther -> Cube」から立方体を作り拡大縮小で横に伸ばしましょう。
Z座標を0にするのを忘れないでくださいね。
Rigidbodyを追加しUseGravity項目のチェックを外し、
IsKinematic項目のチェックを入れましょう。IsKinematic項目のチェックを入れることでスクリプトで座標を制御するRigidbodyとして扱うことができます。

Barスクリプトを作成する
Projectパネルを右クリックし「Create -> JavaScript」でスクリプトを作成し名前を「Bar」としてください。
Barスクリプトの内容は以下の通り作成してください。
#pragma strict
function Update () {
// マウス座標を取得
var tmpInput:Vector3 = Input.mousePosition;
// 座標変換のためカメラのZ座標を引く
tmpInput.z = -Camera.mainCamera.transform.position.z;
// スクリーン座標をゲーム上の座標に変換
var tmpPos = Camera.mainCamera.ScreenToWorldPoint(tmpInput);
// バーを動かす
transform.position.x = tmpPos.x;
}
プログラムの説明はコメントの通りです。
完成
さて再生してみてブロックくずしになっていますでしょうか。
説明は以上となりますが、あとは自分で画面下にぶつかってしまったらゲームオーバーになる処理を追加したり。壊せるブロックの数を計算してクリアの判定を追加してみたりしてください。
今回は以上です。
<<他の記事を読む
[スポンサードリンク]
【シンプルゲーム作成講座の最新記事】
すごく勉強になっています!
感謝です。
次のステップにすぐにでも進めそうです。