Unityで作った落ちゲーの作り方解説 その1
前回は初めてGoogle Playに公開した自作アプリの紹介をした
そのアプリはこちら
で、今回はこのゲームの作り方解説のその1として、ブロックの落とし方の制御方法等を中心に解説する
〇概要
・ゲーム中はブロックの生成⇒落下⇒着地⇒条件がそろえば消去⇒ブロックの生成を繰り返すので、ブロックはある程度の機能を持たせたプレファブ化をしている
1 ブロックのプレファブを作成方法
ア まず、ブロックについては、下記のような画像を用意
Unityにインポートしたら、このファイルを選択し、InspectorにてTexture TypeをSprite(2D and UI)に設定
その後、Sprite Editorボタンを押す
Sprite Editorにて、ブロックごとにスライスする
スライスすると、元画像の下の階層に分割された画像が生成される
イ 次に、スライスしたブロックの画像のどれか一つをScene Viewにドラック&ドロップ
Hierarchy上に作成されたブロックのオブジェクトを選択
スクリプトファイルを作成してアタッチ
下記のような機能をブロック自体に実装する
◇ブロックに持たせた機能
①ブロックの生成時のナンバーの設定、ナンバーに合わせた画像の選択
②ブロックの落下
➂ブロックを消去するときのエフェクト発生、消去
◆ それぞれの機能の実現方法 スクリプト
①ブロックの生成時のナンバーの設定、ナンバーに合わせた画像の選択
まずは、public 変数として、数字の書いた画像をアタッチするスプライトの配列を定義
public Sprite sprites;
Inspectorにて割り当てる
手順は、Projectフォルダの中からドラック&ドロップ
どの数字のスプライトを割り当てるかは、ブロックの生成後にSetup関数にて番号を指定して設定するようにしており、同時に何番が設定されているかのデータも記憶しておくようにしている
スプライトの設定については、SpriteRendererコンポーネントを取得して、先ほど作成したスプライトの配列から指定された番号で割り付けるようにしている
SpriteRenderer sr = GetComponent<SpriteRenderer>();
sr.sprite = sprites[number];
②ブロックの落下
これについては、下記の関数にて、指定された位置に移動させているのみ
ゲーム進行中は、進行を管理するスクリプトから、一定の時間ごとにこの関数が呼び出されて、落下が実現される
なお、ブロック単位で移動のため、移動するピッチ(BlockStep)は、1個のブロックのサイズ分となるように補正している
public void MovePosition(Vector2Int pos)
{
if (MoveEnable)
{
Position.x = pos.x;
Position.y = pos.y;
transform.position = new Vector3(HomePosition.x + Position.x * BlockStep,
HomePosition.y + Position.y * BlockStep, 0);
}
}
➂ブロックを消去するときのエフェクト発生、消去
エフェクトについては、アセットストアから無料のエフェクトをダウンロード
ブロックの消去に合わせて、エフェクトのプレファブを生成し、エフェクトの消えるタイミングと合わせてブロックも消去している
ゲームの進行を管理するスクリプトにて消去の条件が成立した時に、下記が呼び出される
void DestroyExplosion()
{
Destroy(Instantiate(Explosion, transform.position, transform.rotation), 0.5f);
Destroy(gameObject);
}
最後にブロックのプレファブの主なコードは下記の通り
public class NumberCtrl : MonoBehaviour
{
public Sprite sprites;
int Number;
Vector2Int Position;
[SerializeField] Vector2 HomePosition=new Vector2(-2.77f,-3.35f); //左下の原点位置
[SerializeField] float BlockStep = 0.8f;//ブロックの移動距離
bool MoveEnable = false;
public GameObject Explosion;
//プレハブの生成後の初期化/////////////////////////////////////////////////////
public void Setup(int number,Vector2Int pos)
{
MoveEnable = true;
MovePosition(pos);
SpriteRenderer sr = GetComponent<SpriteRenderer>();
sr.sprite = sprites[number];
Number = number+1;
}
//ブロックの移動/////////////////////////////////////////////////////
public void MovePosition(Vector2Int pos)
{
if (MoveEnable)
{
Position.x = pos.x;
Position.y = pos.y;
transform.position = new Vector3(HomePosition.x + Position.x * BlockStep, HomePosition.y + Position.y * BlockStep, 0);
}
}
//消去時のエフェクト発生/////////////////////////////////////////////////////
void DestroyExplosion()
{
Destroy(Instantiate(Explosion, transform.position, transform.rotation), 0.5f);
Destroy(gameObject);
}
//番号の設定/////////////////////////////////////////////////////
public void SetNumber(int number)
{
SpriteRenderer sr = GetComponent<SpriteRenderer>();
sr.sprite = sprites[number];
Number = number + 1;
}
今日のところはここまで