ブロック崩しを作る


今回はシンプルなブロック崩しを作って行きたいと思います。
こないだブロックくずしのゲームを1時間ほどで作ってみましたので、今回ブロック崩しの作り方を説明して行きたいと思います。

ちなみに作ったのはコチラのゲームです。
http://a-field-of.kokage.cc/flash/Kinen/index.php


今回作るものは↓です。

マウスでバーを動かします。ゲームオーバーやゲームクリアの処理は追加していません。


プロジェクトの作成と準備


とりあえず空のプロジェクトを作りましょう。

画面がきっと暗いのであらかじめ
「GameObject -> CreateOther -> DirectionalLight」
を選択しライトを配置しておきましょう。


崩されるブロックを作る



「GameObject -> CreateOther -> Cube」
からキューブを作成します。

・名前は「Block」に変更しておきましょう。
・拡大縮小ツールで良い感じのサイズに変更しましょう。

また、後々ややこしくなるのでBlockのZ座標は0に設定しておきましょう。
(X,Y座標は0でなくても大丈夫です。)

BreakBlock1.jpg
ここまでの作業で↑の様に出来ましたでしょうか。

次に、カメラを移動しブロックがいい感じに映る位置に動かしましょう。

こんな感じ
BreakBlock2.jpg


ボールを作る


次にブロックを崩す側となるボールを作って行きましょう。

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

こんな感じ
BreakBlock3.jpg

次にボールに対して物理計算ができるようRigidBodyを追加し、設定して行きましょう。
Ballを選択したまま「Component -> Physics -> Rigidbody」を選択しRigidbodyを追加します。

このブロックくずしではボールに対して重力を発生させる必要は無いので
「Use Gravity」のチェックを外しておきましょう。

またZ座標の移動は必要ありませんので、
「Constraints」の「Freeze Position」のZにチェックを入れておきましょう。
このチェックを入れることでボールのZ座標の移動を制限することができます。

BreakBlock5.jpg


ボールのスクリプトを作る


Ballの動きを制御するスクリプトを作成しましょう。

Projectパネルを右クリック
「Create -> JavaScript」でスクリプトを作成し名前を「Ball」に変更しましょう。

BreakBlock4.jpg

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


スクリプトをダブルクリックして以下の様に編集しましょう。
#pragma strict

var FirstForce:Vector3 = Vector3(300, 300, 0);

function Start () {
rigidbody.AddForce(FirstForce);
}

function Update () {

}


FirstForce変数を用意しておきStart()の中でBallのrigidbodyに初速として追加しています。


では再生してみましょう。
ゲームを再生するとボールが右上方向に飛んで行ったらOKです!


でもブロックに当たってもボールが跳ね返りませんね…これではブロック崩しになりません
BreakBlock7.jpg


ボールに反発係数を設定する


ボールがブロックにぶつかった時に跳ね返るように設定して行きましょう。

Projectパネルを右クリックし「Create -> Physic Material」を作成しBallPhysicMaterialという名前に設定しましょう。

作成したBallPhysicMaterialを選択しInspectorパネルで反発係数を設定します。
反発係数はBounciness項目です。ここを1にしましょう。

また、BounceCombine項目をMaximumに設定しましょう。
BounceCombineは反発係数の評価方法です。Maximumに設定することでぶつかり合ったモノ同士で反発係数の大きい値の反発係数が適用されます。

つまりどのオブジェクトにぶつかっても反発係数が1で跳ね返ってくるというわけです。

BreakBlock8.jpg

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

BreakBlock9.jpg

ゲームを再生してみてボールがブロックに当たって跳ね返ってくればOKです!

ボールが当たったブロックを消す


ボールがブロックにあたった時にブロックが消える様にしていきましょう。

ブロックにタグをつける


ボールが何に当たったのかを判定するため。ブロックにタグをつけます。

他のゲームを作成する場合でもここで説明するタグを付けることで、GameObjectが敵だとか弾だとかを判定するのに利用することができます。

HierarchyパネルのBlockを選択しインスペクター画面の一番上のTagのUntaggedという項目を選択し「Add Tag...」を選択しましょう。

BreakBlock10.jpg

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

BreakBlock11.jpg

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

BreakBlock12.jpg


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);


ではゲームを再生してみてください。

BreakBlock13.jpg
ボールがぶつかった時にブロックが消えるようになっていればOKです。


ステージを作る


次に実際のステージを作成して行きましょう。

Blockをプレハブにする


ステージを作成する際にはブロックを複製する必要がありますので、Blockをプレハブにしましょう。
HierarchyパネルのBlockをProjectパネルにドラッグドロップしましょう。

BreakBlock14.jpg
HierachyパネルのBlockの名前の文字が青くなればプレハブ化は成功です。
今後ブロックを増やしたい場合はProjectパネルのプレハブをHierarchyパネルへドラッグするか。既にHierarchyパネルにあるBlockを複製しましょう。

ステージを配置する


ステージとなる部分を作って行きましょう。

Blockを複製してブロックを配置します。
「GameObject -> CreateOther -> Cube」から立方体を作り、拡大縮小で伸ばして外枠を作りましょう。


BreakBlock15.jpg
こんな感じにつくりました。

Hierarchyパネルを整理する


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

BreakBlock16.jpg

そこで空のゲームオブジェクトを作成し親子関係を指定しブロックをまとめてしまいましょう。

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

BreakBlock17.jpg


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

BreakBlock18.jpg

Ballのスピードを維持する


さてゲームを再生してみてください。ボールが画面内で跳ねまわってブロックを崩してくれるようになりましたでしょうか。

ボールが跳ね返っている内にだんだん減速してしまい、最後には止まってしまったのではないでしょうか…
BreakBlock19.jpg


ボールが壁やブロックにあたった時にもう一度スピードを設定してあげればよさそうです。

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が垂直や水平に跳ね返るのを防ぐ


さて再生してみてください。
今度はボールが跳ね返っているうちに縦方向にのみ動くようになってしまいました…縦方向にだけ動くのであればこれから作るバーで跳ね返せばなんとかなりそうですが。真横にのみ跳ね返るようになってしまった場合にどうしようもなくなってしまいます…
BreakBlock20.jpg

そこで、今度は真横と真縦のみにボールが動いてしまうのを抑制しましょう。
再び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として扱うことができます。
BreakBlock21.jpg


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;
}



プログラムの説明はコメントの通りです。


完成


さて再生してみてブロックくずしになっていますでしょうか。

説明は以上となりますが、あとは自分で画面下にぶつかってしまったらゲームオーバーになる処理を追加したり。壊せるブロックの数を計算してクリアの判定を追加してみたりしてください。

今回は以上です。


<<他の記事を読む

[スポンサードリンク]


このエントリーをはてなブックマークに追加
posted by Unity3d at 2013年06月09日17:38 | Comment(3) | シンプルゲーム作成講座 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
優しい説明ありがとうございます!
すごく勉強になっています!
Posted by ピヨヒコ at 2013年07月23日 16:55
解説がすごく分かりやすくて、初心者の自分でも無事にブロック崩しまで作製できました。
感謝です。
Posted by ビギナー at 2014年02月02日 12:40
すごく分かりやすい丁寧な説明ありがとうございました。

次のステップにすぐにでも進めそうです。
Posted by 乱舞 at 2014年02月13日 22:05
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

×

この広告は90日以上新しい記事の投稿がないブログに表示されております。