前回はゲームスタートからゲームオーバーまでの一連の流れを作成しましたこのようにSceneを使えば、ステージ2、ステージ3,隠しステージなどゲームのバリエーションをどんどん増やすことができそうです。
今回から「アイテム」の出現について学習していきます。いろいろなアイテムを出現させることで、ヒットポイントを増やしたり、武器を強化したり、シールドを張ったり、スピードを上げたり、などいろいろな効果を追加することができます。
今回はまずは1つアイテムを出現させ、それを取得したらプレイヤーの hp を1ずつ増やす、という処理を実現します。
行うことは次の3つ
①アイテムの準備
②アイテム生成(敵が一定確率でアイテムを落とす)
③アイテム取得時の処理
では早速作っていきます。
1,アイテムの準備
まずはアイテムを準備します。
アセットストアから好きなアイテムを取得しましょう。
①サンプルでは「Free Game Items」という素材を借りてきました。このアセットには同じ図柄の3つの大きさの素材がありますが、一番小さな素材(96dpi)だけで充分です。
各自好き素材を取得しましょう。
②取得した素材から、hp を増やすものを連想させるスプライトを選びます。サンプルでは「pill」というカプセル剤の絵を使います。
選択したら、Hierarchyにドラッグ&ドロップで画面上に表示させておきましょう。
③Hierarchyの「pill」の素材を選択して、Inspectorで名前を「Item」に変更します。
Tag には「Item」を新たに作成し、指定しておきます。
④Sprite Rendererコンポーネントの「SortingLayer」に既存の Player を指定して、背景の前面に表示させておきます。
⑤ Capsule Collider 2Dコンポーネントを追加します。
EditColliderで大きさを調整しておきましょう。
ここは各自選択した画像によって、BoxCollider2DでもCircleCollider2Dでも結構です。
「IsTrigger」にチェックを入れ、侵入判定にしておきます。
⑥ Rigidbody2Dコンポーネントを追加します。
重力の影響を受けなように、Gravity Scale を0にしておきましょう。
大きさ的にはこんな感じでしょうか。
続いて、Itemを管理するプログラムを作成します。
「ItemManager.cs」という名前のスクリプトファイルを作成して、Itemにアタッチしておきます。
作成した「ItemManager.cs」を立ち上げて、以下のコードを記述します。
Rigidbody2D itemRd2d; //リジッドボディ型の変数を宣言
void Start()
{
itemRd2d = GetComponent<Rigidbody2D>(); //コンポーネントを取得
}
void Update()
{
itemRd2d.velocity = transform.up * -2f; //❶下向きに移動
if (transform.position.y < -15f) //x座標が-15を下回ったら
{
Destroy(gameObject); //Item を削除
}
}
これは下方向にゆっくり移動するだけの簡単なプログラムです。
❶ Update() 関数 の中で Rigidbod2D の velocity つまりは速度に、下向きの力を与え続けている、というだけです。
他は特に解説が必要ないですよね?
では実際に起動させてみましょう。
スタートと同時に、ゆっくりと下向きに動き出すと思います。
この「item」はいったん完成なので、プレハブ化しておきます。
Hierarchy上の「Item」を「03_Prefab」フォルダにドラッグ&ドロップでプレハブ化、Hierarchy上のオブジェクトは削除しておきましょう。
2,アイテムの出現
Itemは敵が倒されたタイミングで、一定の確率で生成されるようにします。
まずは「Enemy1」に作ってみます。
「Enemy1Controller.cs」を立ち上げて、以下のコードを追記します。
すでに記述済みの、イベント関数 OnTriggerEnter2D() の中の、敵の 変数:hp が0 になった時の部分に追記します。
❷ まずは [SerializeField] を指定して、出現させるアイテムを 変数:item で指定しています。
❸ Random.Range(0, 2) は「0以上、2未満の整数を取得する」つまり0か1、いずれかを取得するということです。
それが1より小さい、つまり0ならばという意味です。
Random.Range(0, 2) == 0 でもいいですよ。
確率でいうと、1/2、つまり 50% ということですね。
今回は検証しやすいように、確率を50%にしていますが、実際はちょっと変更します。
❹ Instantiate関数でアイテムを、敵の場所に生成させています。
[SerializeField] GameObject item; //❷アイテムプレハブ
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.tag == "Projectile" && IsMove) //記述済み
{
Destroy(collision.gameObject); //記述済み
hp--; //記述済み
if (hp == 0) //記述済み
{
GameObject effect = Instantiate(explosion, transform.position, transform.rotation);
Destroy(effect, 1.5f); //記述済み
Destroy(gameObject); //記述済み
gameManager.enemyCount--; //記述済み
gameManager.AddScore(100); //記述済み
Instantiate(enemy2); //記述済み
if (Random.Range(0, 2) < 1) //❸ 1/2の確率で
{
Instantiate(item, transform.position, Quaternion.identity); //❹アイテム生成
}
}
}
}
ファイルを保存したら、Inspectorから、変数:item に「Itemプレハブ」を指定します。
これで動かしてみましょう。
大体50%の確率で、アイテムが生成されていたら成功です。
3,アイテムの取得
最後の課題は、プレイヤーがアイテムを取得できるようにすること、さらに取得したらプレイヤーの hp を1ずつ増加させることです。
「PlayerController.cs」を立ち上げて、以下のコードを記述します。
Itemは、IsTrigger状態なので、イベント関数 OnTriggerEnter2D() に追記します。
❺ 侵入した相手のタグが ”Item” なら
❻ 変数:hp をインクリメントで1ずつ加算しています。
❼ UIのhp の値を更新しています。
❽ Destroy()関数で、侵入した相手を削除しています。
ここで指定している「collusion」はOnTriggerEnter2D( Collider2D collision )のカッコ内で指定している引数(変数)の名前ですよ。
void OnTriggerEnter2D(Collider2D collision)
{
if (collision.tag == "Enemy") //記述済み
{
SubHP(1); //記述済み
}
if (collision.tag == "Item") //❺"Item"タグを持っていたら
{
hp++; //❻hp 1加算
HPText.text = "HP:" + hp.ToString(); //❼HPText更新
Destroy(collision.gameObject); //❽Item削除
}
}
それでは、この状態で起動させてみましょう。
Itemを取得したタイミングで、UIのHPの値が増加していれば成功です。
イメージ的には以下の動画のような感じです。
ということで、まずは1つのアイテムの動きと効果を作成することができます。
次回は複数のアイテムをリストで管理していきます。
教室では実際に通って頂いての授業の他、ちょっとしたお困りごとに対するオンライン授業やオンラインサポートも行っております。
お困りごとのある方、ご興味がある方は、ぜひお問い合わせください。
お問い合わせは こちら から。
体験授業のお申込みは こちら から。
過去の作品はこちらから。
Vol.20までの作品は、下のVol.21 文末のリンクからどうぞ
Comments