前回は、スペースキーを押すたびにロケットから弾が発射されるようにPrefabを作り、スクリプトを修正しました。
第3回目の今回は時間経過にともなって画面上部から隕石が降ってくるようにしましょう。
第1回 ロケットを動かそう
第2回 弾を発射しよう
第3回 隕石を落下させよう
第4回 当たり判定をしよう
第5回 ゲームオーバを判定しよう
第6回 お化粧をしよう
テクスチャからスプライトをスライスする
ここまでに出てきたロケットや弾のテクスチャは、1枚のテクスチャに1つの画像が描かれていました。
一方、隕石の画像は1枚のテクスチャに8つのスプライトが描かれています。このようなテクスチャをテクスチャアトラスとよび、テクスチャアトラスを使うことで実行時の計算効率が良くなります。
テクスチャアトラスからスプライトを切り出す方法は次のとおりです。
まずプロジェクトビューで「Rock」を選択し、インスペクタの「Sprite Mode」を「Multiple」に設定し、「Sprite Editor 」ボタンを押して下さい。
「Sprite Editor」が起動するので、画面左上の「Slice」ボタンをクリックし、「Type」が「Automatic」になっていることを確認してから、「Slice」ボタンを押して下さい。
スプライトの周辺にうっすらとスライスのための枠線が表示されています。問題なければ画面中央の「Apply」ボタンを押して下さい。
スライスの範囲を修正したい場合には、修正したいスプライトを選択し、スライス領域を指定します。
隕石を表示しよう
スプライトを個別に切り出すことが出来たので、正しくスライス出来たか確認しましょう。
プロジェクトビューで「Rock」の「▶」ボタンをクリックすると、スライスされたスプライトが表示されます。
スライスされた隕石から1つを選択してシーンビューに配置します。
配置する座標はのちほどスクリプトから決めるのでここでは適当で大丈夫です。
隕石を落下させよう
隕石が落下してくるようにスクリプトを作成しましょう。
プロジェクトビューで右クリックから「Create」→「C# Script」を選択し、出来たファイルの名前を「RockController」に変更します。ファイルを開いて次のスクリプトを入力して下さい。
using UnityEngine; using System.Collections; public class RockController : MonoBehaviour { float fallSpeed; float rotSpeed; void Start () { this.fallSpeed = 0.01f + 0.1f * Random.value; this.rotSpeed = 5f + 3f * Random.value; } void Update () { transform.Translate( 0, -fallSpeed, 0, Space.World); transform.Rotate(0, 0, rotSpeed ); if (transform.position.y < -5.5f) { Destroy (gameObject); } } }
隕石が回転しながら落下するようにTranslate関数とRotate関数を使っています。
また、Randomメソッドを使って落下速度が隕石ごとに変わるようにしています。
隕石が画面下端を超えた場合は、Destroyメソッドで自分自身のオブジェクトを破棄しています。
スクリプトが作成できたら、隕石オブジェクトにアタッチしましょう。
プロジェクトビューから「RockController.cs」を選択し、ヒエラルキービューの「rock_0」にドラッグ&ドロップして下さい。
実行してみて、隕石が回転しながら落下してくるのを確認しましょう。
隕石を時間とともに生成する
ゲーム中で生成されるオブジェクトは、Prefab化してスクリプトで生成するのが定石です。
流れとしては弾を作ったときと同様、次のようなステップです。
- 生成したいオブジェクトをPrefab化する
- スクリプトでPrefabからインスタンスを作る
- Prefabの実体とスクリプト内の変数を関連付ける
この方法は「Unityの教科書」で詳しく紹介しているので、参考にして下さい。
まずは隕石のPrefabを作成しましょう。ヒエラルキービューから「rock_0」を選択し、プロジェクトビューにドラッグ&ドロップします。
作成したPrefabの名前を「RockPrefab」に変更します。
Prefabができたら画面上の隕石は不要なので消しておきます。
ヒエラルキービューの「RockPrefab」を右クリックし「Delete」を選択して下さい。
弾はスペースキーが押されたタイミングでインスタンスを生成していました。
今回は、一定時間たつと自動的に隕石のインスタンスを生成するようにしましょう。
プロジェクトビューで右クリックして「Create」→「C# Script」を選択し、出来たファイルの名前を「RockGenerator」に変更します。
ファイルを開いて次のスクリプトを入力して下さい。
using UnityEngine; using System.Collections; public class RockGenerator : MonoBehaviour { public GameObject rockPrefab; void Start () { InvokeRepeating ("GenRock", 1, 1); } void GenRock () { Instantiate (rockPrefab, new Vector3 (-2.5f + 5 * Random.value, 6, 0), Quaternion.identity); } }
隕石を1秒に1回生成するために、InvokeRepeating関数を使っています。InvokeRepeating関数は第一引数の関数を第二引数の秒数ごとに実行してくれる結構便利な関数です。
ここではGenRock関数を呼び出し、その中でランダムな位置に隕石を生成しています。
ファイルが生成できたところでゲームオブジェクトにRockGeneratorスクリプトをアタッチします。
アタッチする適切なオブジェクトが無いので、ヒエラルキービューの「Create」→「Create Empty」で空のオブジェクトを生成します。
作成したオブジェクトにスクリプトをアタッチします。ヒエラルキービューの「GameObject」にプロジェクトビューの「RockGenerator」をドラッグ&ドロップして下さい。
最後にスクリプト内で宣言したRockPrefab変数に、Prefabの実体を代入します。ヒエラルキービューで「GameObject」を選択して、インスペクタに表示される「Rock Prefab」の欄にプロジェクトビューの「RockPrefab」をドラッグ&ドロップします。
ゲームを実行してみて隕石が次々と落ちてくることを確認しましょう。
今回はここまでです。今回作成したプロジェクトファイルを置いておきます。
次回は、弾と隕石の当たり判定をつけていきます。Phsyicsを使って当たり判定をする方法を紹介します。