スイカゲーム風「ベジタブルゲーム」の作り方、11回目の今回は野菜が鍋に落下した際に発生する跳ね返りの水しぶきを作成します。
ユニティルーム サンプルの投稿ゲーム
11,水しぶき演出
11.1 水しぶきの作成
取得済みのSprite「しずく」をHierarchyにドラッグ&ドロップでします。 「しずく」の画像は事前に Pixels Par Unit を 1100 程度にしているので、ちょうどよい大きさになっているはずです。
取得した素材をInspectorから以下のように修正します。
❶ 名前 : Drop に変更 ❷ SpriteRendererコンポーネント Color : 若干薄い水色にします(水の色と区別をつける) ❸ Rigidbody2Dコンポーネント 追加 Gravity Scale : 0.5程度にします。 ❹ CapsulColliderコンポーネント 追加 Edit Collider で当たり判定の大きさを下の図の様に調整 IsTrigger : チェックを入れて侵入判定状態に指定
続いて水しぶきのプログラムを作成します。 [02_Scripts]フォルダに新たなスクリプトファイル「Drop」を作成、このスクリプトファイルを先のフェーズで作成した「Drop」のオブジェクトにアタッチします。
このDropクラスで使用する変数は以下の通りです。
変数名 | 型 | アクセス | 説明 |
d | int | private | 左右どちらに水しぶきが飛び散るかを乱数で取得し管理 |
power | float | private | 水しぶきの飛び散る速度 |
range | float | private | 水しぶきの飛び散る角度 |
Drop.cs を立ち上げて変数の宣言と初期値の指定を行います。
Drop.cs
int d; //左右どちら側に出現するか
float power; //水しぶきの飛び散る力
float range; //水しぶきの飛び散る角度
void Start()
{
power = Random.Range(50f, 120f); //poworを乱数で指定
range = Random.Range(20f, 70f); //rangeを乱数で指定
d = Random.Range(0, 2) < 1 ? -1 : 1; //三項演算子で乱数が0なら-1、1なら1に振分け
//変数rangeとdを使って、最初の向きを決定
transform.rotation = Quaternion.Euler(0, 0, 180 - range * d);
//大きさを乱数を使って指定
transform.localScale= Vector3.one*Random.Range(0.5f,1.2f);
//Rigidbodyで水しぶきに力を加える
GetComponent<Rigidbody2D>().AddForce(-transform.up*power);
}
三項演算子
「?」及び「:」を使用して、条件に応じた値を振り分ける条件分岐文です。条件 ? 真の場合の値 : 偽の場合の値
使用例:speed が 5 より大きければ「速い」、小さければ「遅い」という string s = speed > 5 ? "速い" : "遅い"
Debug.Log(s);
続いて FixedUpdate()関数 で飛び散った水しぶきが回転する動きを作成、さらに OnTriggerEnter2D()関数 で、飛び散った水しぶきが水面に付いたら削除される動きを作ります。
また、鍋から飛び出てしまったときも削除されるように、Y座標が0より小さくなった時にも削除するプログラムを追加しておきます。
Drop.cs
void FixedUpdate()
{
transform.Rotate(0, 0, -2 * d); //水しぶきを回転させる
if (transform.position.y < 0) { Destroy(gameObject); }
}
void OnTriggerEnter2D(Collider2D collision)
{
if (collision.name == "WaterImage") //水に付いたら
{
Destroy(gameObject); //オブジェクトを削除
}
}
完成したら Hierarchy上の Dropオブジェクトを [03_Prefabs]フォルダにドラッグ&ドロップでプレハブ化しておきます。
11.2 水しぶき生成プログラム
続いて作成した水しぶきを生成するプログラムを GameManagerクラス に作成します。 ここで新たに使用する変数は以下の通りです。
変数名 | 型 | アクセス | 説明 |
dropPrefab | GameObject | [SerializeField] | 水しぶきのプレハブ |
source | AudioSource | private | AudioSourceコンポーネントにアクセスするための変数 |
さらに音の素材を管理するための配列を用意しておきます。現段階では1つの音しか使いませんが、この後複数の音を使用するため、配列にしておきます。
配列名 | 型 | アクセス | 説明 |
crips | AudioClip | [SerializeField] | 音源を管理する配列 |
「GameManager.cs」 を立ち上げてください。変数の宣言と初期値の設定を行います。
GameManager.cs
[SerializeField] AudioClip[] crips; //音源を管理する配列
[SerializeField] GameObject dropPrefab; //水しぶきのプレハブ
AudioSource source; //AudioSource型の変数
void Start()
{
//記載済みコード省略
source = GetComponent<AudioSource>(); //AudioSourceコンポーネントを取得
}
GamaManager オブジェクトのInspectorから以下の部分を修正します。
❶ GameManagerクラスで宣言した配列、及び変数に以下のものを指定します。 Crips:要素数に 1 を指定、Element0 に 取得済みの音源「水滴3」を指定 DropPrefab:際のフェーズで作成した Drop のプレハブを指定 ❷ AudioSourceコンポーネント 追加 Play On Awake のチェックを外す
続いて水しぶきを10個生成する関数を作成します。
GameManager.cs
public void CreateDrop(Vector3 pos) //生成する座標を引数とする関数
{
source.PlayOneShot(crips[0]); //crips[]の1番目の音を鳴らす
for (int i = 0; i < 10; i++) //10回繰り返す
{
//水しぶきを指定された座標を生成する
Instantiate(dropPrefab, pos, Quaternion.identity);
}
}
この関数を呼び出すのは、落下途中の野菜になります。
VegetableManager.cs を立ち上げて以下のコードを記述します。
VegetableManager.cs
void OnTriggerEnter2D(Collider2D collision) //侵入判定
{
if (collision.name == "WaterImage") //当たった相手の名前が「WaterImage」なら
{
//野菜の座標から、座標の半径分下から0.2上の場所から水しぶきを生成
gm.CreateDrop(transform.position + transform.up * (-transform.localScale.y / 2 + 0.2f));
}
}
これで野菜が落下し、水面に達したときに水しぶきが発生するのを確認することが出来たと思います。
「VegetablGameの作り方」その他の記事はこちらから
ファイブボックスでは、Unityの個別指導のオンラインレッスンを行っています。
ご興味のある方は当サイト、オンラインレッスンから、無料体験授業へお問い合わせ下さい。
Comments