2021年5月18日4 分

Unityで「シューティングゲーム」をつくろう!Vol.28

最終更新: 2021年5月19日

前回はアイテムを1つ作成し、「Enemy1」を倒したときに 1/2 の確率でアイテムを出現させる動き、さらにそのアイテムを取得した際に、HPが1だけ回復する動きを作成することができました。

今回はその動きを改良していきます。今回行うことは次の2つ。

1,アイテムの追加プログラム

2,効果の振り分けとアイテムA(HP回復)を取得したときのスクリプト文の改修

それでは早速作っていきましょう。


1、アイテムの追加

この作品では6種類のアイテムと、その効果を作っていきます。

さらにそれぞれのアイテムの出現確率も仮設定しておきます。

A、HP回復 = 30%

B、武器強化 = 20%

C、防御(シールド発生) = 20%

D、スピードアップ  = 15%

E、全回復+10秒間無敵 = 10%

F、ザコキャラの一斉破壊 = 5%

「ItemManager.cs」を立ち上げて、以下のコードを追記していきます。

❶ SpriteRendererコンポーネントを使うための変数を宣言します。

❷ アイテムの画像は配列で指定します。画像を入れるための配列を宣言します。この画像は後にInspectorから指定するので、アクセス修飾子を「public」にしておきましょう。

❸ ❶で宣言した変数にSpriteRendererコンポーネントからデータを取得し代入

❹ 出現させるアイテムを抽選番号を0~99までの乱数で取得します。

  出現確率がわかりやすいように100通りの数字を用意しています。

❺ ❹で指定したアイテムが30未満、つまり 30/100 の確率ということになります。

❻ ❷で指定した配列の0番目の画像を、SpriteRendererコンポーネントの「sprite」、つまり見た目の画像として指定します。

あとは❺❻の繰り返しですので、省略します。

SpriteRenderer itemRenderer; //❶SpriteRenderer型の変数を宣言
 
public Sprite[] sprites; //❷アイテム画像を入れる配列を宣言
 

 

 
void Start()
 
{
 
itemRd2d = GetComponent<Rigidbody2D>(); //記述済み
 
itemRenderer = GetComponent<SpriteRenderer>(); //❸変数データを取得
 
int item = Random.Range(0, 100); //❹Itemを乱数で決定
 
if (item < 30) //❺乱数が30未満なら
 
{
 
itemRenderer.sprite = sprites[0]; //❻0番目の画像を指定
 
}
 
else if (item < 50)
 
{
 
itemRenderer.sprite = sprites[1];
 
}
 
else if (item < 70)
 
{
 
itemRenderer.sprite = sprites[2];
 
}
 
else if (item < 85)
 
{
 
itemRenderer.sprite = sprites[3];
 
}
 
else if (item < 95)
 
{
 
itemRenderer.sprite = sprites[4];
 
}
 
else
 
{
 
itemRenderer.sprite = sprites[5];
 
}
 
}

続いてUnityエディタ側から画像をセットしていきましょう。

①前回取得した画像から、アイテムの効果(A~F)に合う素材を選び、名前を「ItemA」~「ItemF」に変更します。

変更しなくても進めることはできますが、プログラムで名前をキーにしてアイテムを判定するので、わかりやすいように名前を指定しています。

②Itemプレハブのインスペクターから、ItemManagerを選択して、スクリプト文の変数で宣言した配列「Sprites」のSize に 6 を入力します。

すると、6つのスペースが現れるので、上から順に①で名前をつけた「ItemA」~「ItemF」をセットします。

1、効果の振り分けとHP回復コードの修正

続いて、プレイヤーに作成したアイテムを振り分ける仕組みを作っていきます。

PlayerController.cs」を立ち上げて、以下のコードを追記しましょう。

すでに記述済みの侵入判定のイベント関数 

OnTriggerEnter2D() の、

if (collision.tag == "Item")

つまり、アイテムを取得したら、の部分を修正します。

前回は以下のコードを記述しましたが、Destroy()関数以外は一旦削除します。

hp++; //削除
 
HPText.text = "HP:" + hp.ToString(); //削除
 
Destroy(collision.gameObject); //記述済み

❼侵入した相手からSpriteRendererコンポーネントを取得して、sprite パラメータの name、つまりスプライトの名前を取得、いったんstring型(文字列型)の変数、name に代入します。

❽ここから「swich文」を作っていきます。

「swich文」は定型文、「if文」と並んで、条件分岐ではよく使われるものなので、覚えておくと便利です。

今回は ❼で取得した変数「name」をキーに振り分けをします。

❾name が "ItemA" のときということですね。

➓ SubHP()関数はもともとHPを減らすために作成していました。

 引数にマイナスの値を渡すことで、HPを増やすこともできます。

 わかりやすく、マイナスとプラス、逆にしておけばよかったですね。

⓫ 確認のためにConsoleに表示させます。後で消します

⓬「swich文」の定型文です。最後は「break」が必要になります。

void OnTriggerEnter2D(Collider2D collision)
 
{
 
if (collision.tag == "Enemy") //記述済み
 
{
 
SubHP(1);
 
}
 
if (collision.tag == "Item") //"Item"タグを持っていたら
 
{
 
string name = collision.GetComponent<SpriteRenderer>().sprite.name; //❼Itemの名前を取得
 
switch (name) //❽ ❼で取得したnameをキーに振り分け
 
{
 
case "ItemA": //❾name がItemA の場合
 
SubHP(-1); //❿HP減関数を発動
 
Debug.Log("HP 1UP"); //⓫デバッグで確認
 
break; //⓬定型文
 
case "ItemB":
 
Debug.Log("パワーショット");
 
break;
 
case "ItemC":
 
Debug.Log("シールド");
 
break;
 
case "ItemD":
 
Debug.Log("スピードアップ");
 
break;
 
case "ItemE":
 
Debug.Log("全回復");
 
break;
 
case "ItemF":
 
Debug.Log("ザコ一掃");
 
break;
 
}
 
//hp++; 削除
 
//HPText.text = "HP:" + hp.ToString(); 削除
 
Destroy(collision.gameObject); //記述済み
 

 
}
 
}

これで、振り分けは完成。

後はそれぞれの動きを1つずつ、追加してあげればよさそうですね。

今回はここまでにしておきます。

教室では実際に通って頂いての授業の他、ちょっとしたお困りごとに対するオンライン授業やオンラインサポートも行っております。

お困りごとのある方、ご興味がある方は、ぜひお問い合わせください。

お問い合わせは こちら から。

体験授業のお申込みは こちら から。

過去の作品はこちらから。

Vol.20までの作品は、下のVol.21 文末のリンクからどうぞ

Unityで「シューティングゲーム」をつくろう!Vol.21

Unityで「シューティングゲーム」をつくろう!Vol.22

Unityで「シューティングゲーム」をつくろう!Vol.23

Unityで「シューティングゲーム」をつくろう!Vol.24

Unityで「シューティングゲーム」をつくろう!Vol.25

Unityで「シューティングゲーム」をつくろう!Vol.26

Unityで「シューティングゲーム」をつくろう!Vol.27

    6