前回は2つ目のアイテムを取得した際に「攻撃を強化する」という効果を発動させてみました。
今回は3つ目のアイテムを取得したタイミングで、シールドを発動させ、防御を強化してみます。
行うことは次の2つだけ。
1,シールドの作成(HPを持たせ、出現後10発攻撃を受けたら消滅)
2,Player がアイテムを取得したらシールド発動
では早速作っていきましょう。
1,シールドの作成
まずは素材を用意します。
①取得済みのアセット「2D Space Kit」の「particles(Sprites)」フォルダから「Shield Bubble」を選択し、Hierarchy上にドラッグ&ドロップ。
これは敵のシールドと同じ素材ですね。
取得した素材を選択し、インスペクターで修正していきます。
②まず名前を「Player Shield」などにしておきましょう。
今回はTag、Layer、それぞれ作成済みの「Player]をセットします。
Tag はプログラムからタグ名を識別して、当たり判定を行うため。
Layer は、Unityエディタ側から、オブジェクト同士の当たり判定をコントロールするために必要になります。
③大きさを調整します。
サンプルでは0.8倍ぐらいがちょうどいいので、x、yにそれぞれ0.8を入力。
各自ご自身の素材に合わせて調整しましょう。
④SpriteRendererコンポーネントでは2つのパラメータを調整します。
Color は青色系にしておきましょう。
SortingLayer は作成済みの「Player 」を指定しておきます。
⑤当たり判定を実装するために「Circle Collider2D」をセットします。
これは「IsTrigger」にチェックを入れるだけ。
ではコードを記述していきます。
シールドは、Player の位置と常に同期する必要があるので、まずは「PlayerController」にPlayerの場所を取得するコードを追加します。
「PlayerController.cs」を立ち上げて、以下のコードを追加します。
PlayerControllerに追加するのは次の2つだけ。
❶場所を指定する変数:PlayerPos を宣言。
これはx,y,z、それぞれの値なので、Vector3型ですね。
❷Update関数の中で、常に❶で宣言した変数に自分の場所を更新します。
public Vector3 PlayerPos; //❶プレイヤーの場所
void Update()
{
Move(); //記述済み
restrictions(); //記述済み
Shot(); //記述済み
PlayerPos = transform.position; //❷自分の場所をセット
}
続いて、シールドのスクリプトファイルです。
「PlayerShieldManager」などの名前を付けてスクリプトファイルを作成、以下のコードを記述します。
❸ シールドにはHPを持たせますので、整数型の変数、HP を宣言、初期値に10をセット。
❹ Update関数の中では先に❷で更新しているPlayerPosを取得し、シールドの場所を値に指定しています。
FindObjectOfType<PlayerController>
はPlayerControllerクラスを探してくる関数です。
❺ 敵の弾が侵入したら、まず敵の弾を削除しています。
その後、シールドのHPをデクリメントで減算。
HPが0以下になったら、シールド自体を削除しています。
public int HP = 10; //❸シールドのHPを宣言し、初期値10を代入
void Update()
{
//❹PlayerController を探して、そのPlayerPosをpositionに代入
transform.position = FindObjectOfType<PlayerController>().PlayerPos;
}
private void OnTriggerEnter2D(Collider2D collision) //❺侵入判定
{
if (collision.gameObject.tag == "Enemy")
{
Destroy(collision.gameObject); //弾の削除
HP--; //HPを1ずつ減らす
if (HP <= 0) //もしHPが0より小さくなったら
{
Destroy(gameObject); //シールドの削除
}
}
}
スクリプトファイルをシールドにアタッチして、プレハブ化しておきましょう。
2,PlayerController の改造
続いて、Playerがアイテム3を取得したときに、シールドが発動するように改造します。
「PlayerController.cs」 に以下のコードを追記します。
記述済みのコードが多いので、2重に記述しないように気を付けましょう。
今回作るのは次の2つだけ。
❻ [SerializeField]でGameObject型の変数「Shield」を宣言。
❼ 記述済みの switch文の case "ItemC" に Instantiate(Shield) を追記して❻で宣言、指定したシールドプレハブを生成しています。
[SerializeField] GameObject Shield; //❻シールドプレハブ
void OnTriggerEnter2D(Collider2D collision)
{
if (collision.tag == "Item") //記述済み
{
string name = collision.GetComponent<SpriteRenderer>().sprite.name;//記述済み
switch (name) //記述済み
{
case "ItemA": //記述済み 内部省略
break;
case "ItemB": //記述済み 内部省略
break;
case "ItemC":
Instantiate(Shield); //❼シールド発動
break;
//後続処理、省略
}
}
}
最後はUnityエディタのinspectorから変数に、Shieldプレハブをセットしておきましょう。
今回はこれで完成です。シールドのHPや出現確率(現在20%)は各自調整しておきましょう。
次回はアイテムDの動きを作ってみましょう。
教室では実際に通って頂いての授業の他、ちょっとしたお困りごとに対するオンライン授業やオンラインサポートも行っております。
お困りごとのある方、ご興味がある方は、ぜひお問い合わせください。
お問い合わせは こちら から。
体験授業のお申込みは こちら から。
過去の作品はこちらから。
Vol.20までの作品は、下のVol.21 文末のリンクからどうぞ
Comments