あきごろうTweet簡単なゲームの代名詞である、ブロック崩しゲームを一緒に作っていきましょう。ゲームスタートからゲームクリア、もしくはゲームオーバーまでを一連で作成していくので、「Unityで簡単なゲーム作ってみたい方」は是非お試しください。記事の内容は初心者の方にもわかるように詳しく解説していますが、ゲームを作成し慣れている人であれば2時間程度で終わるような内容ですのでぜひチャレンジしてみてください。まとめ概要これから作るブロック崩しゲームはこんな感じです。(ボールは実際作っていくときはもう少し小さいですが、分かりやすいように大きくしています。)非常にシンプルな内容になっています。これをゴールに作成していきましょう。Projectの新規作成まずProjectを新規作成しましょう。projectをクリックします。シーンを保存するUnityではプロジェクトの下にシーンというものが存在し、プロジェクトを構成します。複数のシーンを遷移することで色々と実現することができますが、詳しい解説は割愛します。ヒエラルキーウィンドウのSampleSceneを右クリックしてSaveSceneAsを選択してください。次にSaveAs欄に「Game」と入力してSaveを選択します。これでシーンの保存が完了しました。シーンやこの後出てくるC#スクリプト、プレハブをできる限りフォルダごと管理するようにしてください。プロジェクトウィンドウのGameをドラッグ&ドロップでScenesフォルダに移動してください。移動先のScenesフォルダのSampleSceneを削除しておきましょう。メインカメラの調整オブジェクトをこれから作っていきますが、Gameシーンでの見た目と同じ形で作成していくと効率が良いので、下のGIFと同じ様にSceneビューをメインカメラの方向と同じ様にします。Emptyをクリックします。空のGameObjectができたら、名前をWallsに変更しておきます。このWallsの中に壁のオブジェクトを作っていきます。Cube)を作成してください。1以上で今回使用する壁が完成しました。次にボールを作成します。Sphereを選択し、名前を「Ball」に変えます。このままだとボールが思ったより小さいので、大きくします。Position:(0,0,0)Scale:(2.2.2)ボールに物理演算を加えるこのままだとただの何もできない球となってしまうので、物理演算を付けて跳ね返ったりするようにします。Rigidbodyを追加します。Gravity」にチェックが入っています。Gravityのチェックを外してください。ボールが動くように初速を与えるさて次はボールに初速を与えて動くようにします。初速を与えるためにC#スクリプトを作成します。整理のためにスクリプトをまとめるフォルダを作ります。Folderを選び、作成されたフォルダを「Scripts」という名前に変更します。今後はスクリプトを全てこのフォルダに保存していきます。ボールに初速を与えるスクリプトを作ります。Scriptを選択します。//初速を入力値として準備します。MonoBehaviour{//初速を入力値として準備します。力を加えるrb.AddForce(force);}}壁にぶつかった後に跳ね返ってほしいのに跳ね返っていませんね。ブロック崩しであればボールは適切に跳ね返らなければなりません。Materialを作成します。Materialを選択します。Physic」と名前を変更し、Inspectorビューで下の画像のように変更します。Material(物理特性マテリアル)についてもう少し知りたい方は、こちらの記事で詳細に説明しているので、参考にしてみてください。設定が終わったらBallとWall1,2,3,4にアタッチします。Physic」をHierarchyビューの「Ball」へドラッグアンドドロップします。ColliderのMaterialに挿入されているのが確認できます。これで跳ね返りを実現できました。(ボールを見やすいように色付けました。次にパドルを作成します。Cubeで作成します。名前は「Bar」に変更して、Position,Rotation,Scaleを以下のようにします。次に動かせるようにBarのスクリプトを作成します。Scriptを選択し、名前を「Bar」にします。スクリプトは以下を使用します。0f);}}}このスクリプトをBarにアタッチすると、自分でパドルを動かせるようになります。Physic」をBarにアタッチしてあげます。(衝突でのエネルギー減少を失くすため)すると以下のようによりブロック崩しっぽくなります。このままでは壁からパドルが出てしまいますね。壁から出ないようにパドルの移動範囲に制限を加えましょう。//Barの座標を取ります。//Barの座標が20以下(壁より内側)である場合には移動を実施します。//Barの座標が-20以上(壁より内側)である場合には移動を実施します。Update(){//Barの座標を取ります。(Input.GetKey(KeyCode.RightArrow)){//Barの座標が20以下(壁より内側)である場合には移動を実施します。(Input.GetKey(KeyCode.LeftArrow)){//Barの座標が-20以上(壁より内側)である場合には移動を実施します。0f);}}}}スクリプトによってパドルの座標を制限することで、壁内でしか動かないようにしています。これで壁からはみ出さなくなりました。ブロック(Block)の作成さて、次にブロックを作成します。沢山のブロックを大量に作成する場合にはPrefab(プレハブ)を使用する方が効率的なので、今回はPrefabを使用します。Cubeを選び、名前を「Block」とします。Position、Rotation、Scaleについて下の画像のように設定してください。次に、ボールがぶつかった時に消滅するようにします。Scriptを選択し、名前を「Block」にします。スクリプトは以下を使用します。OnCollisionEnterは衝突を判定する関数であり、衝突が発生したらDestroy関数を使ってBlockを消滅させます。collision){Destroy(gameObject);}}このスクリプトをHierarchyビューの「Block」へドラッグアンドドロップでアタッチします。以下のようになれば問題ありません。Physic」をBarにアタッチしてあげます。(衝突でのエネルギー減少を失くすため)これでBlockの設定が完了したので、次は複製します。Prefabについて詳細に説明している記事があるので、興味ある方は良かったらご一読ください。方法Prefab化およびオブジェクトの複製は以下の手順で実施します。HierarchyビューのBlockをProjectビューにドラッグアンドドロップをして、Prefab化する。Prefab化されたProjectビューのBlockをHierarchyビューにドラッグアンドドロップする。すると、Block(1)が作成される。2を繰り返し、Block(14)まで作成する。各オブジェクトを以下の画像の座標(Position)に変更する。以上で、Blockの準備が完了しました。Blockの色は好みで変更してください。色の設定方法やグラデーションの付け方など、色々と解説している記事があるので、是非ご参考ください。【Unity】オブジェクトの色(Color)実装の基礎から応用までを徹底解説!さて、これで見た目はほぼブロック崩しになりました。このままだとゲームクリアとゲームオーバーの判定が出来ていません。ゲームクリアの判定Hierarchyビューの整理も兼ねて、まず、Block~Block(14)を1つの空のゲームオブジェクトの配下にまとめます。Emptyを選択し、作成されたGameObjectの名前を「Blocks」にします。Block(14)までを選択し、Blocksにドラッグアンドドロップします。CLEAR!」という文字を用意します。Textを選択し、名前を「ClearUI」に変更します。続いて、ClearUIオブジェクトの内容を設定します。InspectorビューでRectTransformの値を以下の画像と同じ値に設定します。これで、クリアの文字の準備はできました。次にクリアの条件を設定します。今回のクリアの条件は、全てのBlockが消滅することなので、Blocksの中のオブジェクトが無くなったらクリアとします。この条件をスクリプトで作成します。Scriptを選択し、名前を「GameController」とします。スクリプトは以下を使用します。このスクリプトは、「Block」というタグが付いているオブジェクトが0になった時に、ClearUIがアクティブになるというものです。オブジェクトをアクティブにするClearUI.SetActive(true);}}}次にHierarchyビューで「GameController」というオブジェクトを作成します。Emptyを選択し、名前を「GameController」とします。作成したGameControllerオブジェクトにGameControllerスクリプトをアタッチします。InspectorビューでClearUIをScriptのClearUIに設定します(参照できるようにします。)今のままだとスタート時からClearUIが表示されている状態になっているので、非表示に変更します。(Inspectorビューから変更できます)最後に、ClearUIがアクティブになる条件である、「Block」のタグを各Blockに設定します。ここでPrefabを使用していることのメリットが生かされます。以下の手順で行います。ProjectビューでBlockプレハブをダブルクリックします。するとプレハブの設定がInspectorビューに表示されるので、TagのUntaggedをクリックします。Blockというタグはデフォルトでは存在しないので、自分で作成する必要があります。Tag...」をクリックします。すると以下の画面が開かれるので、+をクリックします。Nameを「Block」とし、Saveをクリックします。Hierarchyビューに表示されているBlockのプレハブをクリックして、InspectorビューをBlockに戻します。先程作成したBlockというタグを設定します。TagのUntaggedをクリックし、Blockを選択します。最後に設定を保存するために、Hierarchyビューの<をクリックして、開かれたダイアログのSaveを選んで保存します。以上で、Tagの設定も完了し、ゲームクリアの設定が完了しました。ゲームオーバーの判定ゲームクリアが設定できたので、ゲームオーバーの設定も行います。今回ゲームオーバーの条件は、下の壁に接触してしまうこととします。OVERと表示されるようにします。下の壁に接触した時にPlayerの球が消滅するようにします。Scriptを作成します。スクリプトは以下を使います。collision){Destroy(collision.gameObject);}}このスクリプトを下の壁(Wall4)にアタッチします。すると以下のように確かにボールが消えるようになりました。OVER」を作成します。Textを選択します。名前を「GameOverUI」とし、諸々設定します。GameControllerスクリプトの内容を以下に変更します。仕組みはクリアと全く同じです。0){//GameOverUIをアクティブにするGameOverUI.SetActive(true);}}}HierarchyビューのGameControllerオブジェクトをクリックし、InspectorビューでGameOverUIの部分に「GameOverUI」をアタッチします。HierarchyビューのGameOverUIをクリックし、InspectorビューでTagを「Player」とし、チェックを外します。(非アクティブ化)最後に、Ballが消えた時にGameOverとなってほしいので、Ballにタグを設定します。InspectorビューでBallのTagを「Player」に変更します。以上でGameOverの設定も完了しました。実はこのままでは、ゲームクリア後もボールは残ったままで、下の壁についた瞬間にゲームオーバーの文字も表示されてしまうという問題が残っています。そこで、GameControllerスクリプトを変更することで上記現象が発生しないようにします。最後は自分の好みで各オブジェクトの色を変更して、完成です!まとめいかがでしたでしょうか。ゲーム作りの登竜門である、ブロック崩しゲームをご紹介してきました。長くなってしまいましたが、これをきっかけにUnityをもっと開発できるようになれば幸いです。このブロック崩しゲームはまだまだ改善の余地があるので、改善版も後日アップロードしようと思います。以下のような改善余地(課題)があるので、もし余裕がある方は実装してみてはいかがでしょうか。gardenお問い合わせはこちらから※「XR-Hub」商標出願中CloseTwitterでAR/VRの最新情報を受け取る。