こんにちは、ともくんのゲーム作り部屋にようこそ!
このページでは、Unityを使った2Dシューティングゲームの作り方の11回目として、ゲーム内でのアイテム作成の処理について紹介しています。
前回、敵からダメージを受けた際のリトライ処理やリトライポイントを作りました。
今度は、シューティングゲームでよくあるアイテムを配置して、そのアイテムを取るとプレイヤーの能力が上がるという処理を作っていきます。
アイテムを作る際は、そのアイテムを取得しているかどうかを判定する変数を作り、その変数を元にアイテムの効果を加えていく形になります。
そこで、ゲーム内にアイテムを配置して、アイテムを取った際の処理までをまとめていきます。
アイテム用の変数を作成する
まずは、アイテムを所持しているかどうかを判定する変数を作成します。
今回は、
- プレイヤーの速度をあげるアイテム
- プレイヤーの弾を増やすアイテム
の2つのアイテムを作りたいと思うので、それぞれに変数を作ります。
そしてこの変数は、GameManager上で管理させて、一度リトライしてもアイテムを所持している状態にしたいと思います。
using UnityEngine;
public class GameManager : MonoBehaviour
{
public static GameManager instance; // 静的なGameManagerのインスタンスを作成
public int lifeCount; // ライフの数を計算する変数
public int scorePoint; // スコアの数を計算する変数
public int startPos; // スタート位置を決める変数
public int speedUpItem; // 速度アップのアイテム所持の変数
public int bulletUpItem; // 弾数アップのアイテム所持の変数
// 以下省略 //
}
9行目で速度をあげるアイテムの変数speedUpItem、10行目で弾数を増やす変数bulletUpItemを宣言して、どちらもint型の変数で、アイテムをプレイヤーが取ったら「1」に更新するという形でこの後作っていきます。
なお、GameManagerについては、以下の記事で紹介していますので、参考にしてみてください。
プレイヤーの速度をあげるアイテムの処理
2つのうち、まずはプレイヤーの速度をあげるアイテムの処理を作り、ゲーム内にアイテムを配置していきます。
プレイヤーの速度をあげる処理
プレイヤーの速度をあげる処理は、プレイヤーに紐づけているPlayerControllerに記述していきます。
using UnityEngine;
public class PlayerController : MonoBehaviour
{
float playerSpeed = 0.05f; // プレイヤー速度の変数
bool isSpeedUp = false; // スピードアップ中かどうかを判定する変数
void Update()
{
if (GameManager.instance.speedUpItem == 1 && isSpeedUp == false) // 速度アップアイテムを持っている場合
{
playerSpeed *= 1.5f; // プレイヤーの速度を1.5倍にする
isSpeedUp = true; // スピードアップ中の変数をtrueに変更する
}
// 以下省略 //
}
}
10行目のif文の中でGamaManagerで管理している変数のspeedUpItemが「1」の場合に、速度を1.5倍にする処理を行っています。
そのままだと、アイテムを持っているとフレームごとに速度をあげる処理が重複して行われてしまうので、スピードアップをすでに行ったかどうかの判定を行う必要があります。
そこで、bool型のisSpeedUp変数を使って、一度スピードアップの処理が行われたら、6行目でtrueに更新して重複しないようにしています。
これで、速度をあげる処理をスクリプト内に書くことができました。
速度をあげるアイテムの当たり判定の処理
次に、スピードアップアイテムをゲーム内に配置して、プレイヤーとの当たり判定の処理を作っていきます。
今回は、Unity Asset Storeにある画像を使い、「speedUpItem」というオブジェクトをstageの中の子オブジェクトとして配置します。

このspeedUpItemに当たり判定を付けるために、Polygon Collider 2Dを付けて、「Is Trigger」にチェックを入れておきます。

当たり判定の処理を作るのに、「SpeedUpItem」というスクリプトを作成して、speedUpItemにアタッチしておきます。

using UnityEngine;
public class SpeedUpItem : MonoBehaviour
{
public GameObject player; // プレイヤーを取得するための変数
void OnTriggerEnter2D(Collider2D collision) // 当たり判定処理
{
if (collision.gameObject == player) // プレイヤーと当たった場合
{
GameManager.instance.speedUpItem = 1; // スピードアップの変数を1に更新
this.gameObject.SetActive(false); // アイテムを消去する
}
}
void Start()
{
if (GameManager.instance.speedUpItem == 1) // アイテムをすでに取っている場合
{
this.gameObject.SetActive(false); // アイテムを消去する
}
}
}
5行目でプレイヤーのオブジェクトを取得する変数を宣言して、7行目でOnTriggerEneter2Dを使って、アイテムとプレイヤーの当たり判定の処理を記述しています。
11行目でプレイヤーと当たった場合に、GameManagerで管理している変数のspeedUpItemの値を「1」に更新しています。
アイテムを手に入れたら、そのあとはアイテムが表示されないように、12行目でSetActiveを使って非アクティブにしています。
また、すでにアイテムを所有してリトライした際にはアイテムが表示されないように、Startメソッド内でもアイテム消去の処理を書いています。
スクリプトが書けたら、speedUpItemを選択し、インスペクターウィンドウのSpeedUpItemのplayer変数に、「player」オブジェクトをドラッグ&ドロップして代入してあげます。

これでプレイヤーの速度をあげるアイテムの処理が完成したので、実際にゲームを実行して確認してみます。

アイテムにプレイヤーが触れると、プレイヤーの速度がちゃんとあがっているので大丈夫そうです。
プレイヤーの弾を増やすアイテムの処理
次に、プレイヤーの弾を増やすアイテムの処理を作っていきます。
プレイヤーの弾を増やす処理
プレイヤーの弾を増やしたいので、弾を発射するポイントを追加していきます。
弾の発射する位置を決めている「playerBulletPoint」のオブジェクトをコピーして、アイテムを取った際に発射される場所に配置していきます。
元の発射位置を決めているものを「playerBulletPoint1」として、それぞれ新しいものを「playerBulletPoint2」「playerBulletPoint3」としてオフで配置しておきます。


アイテムを取った際に、それぞれの発射位置の空オブジェクトのアクティブ状態を変えるので、その処理をPlayerControllerのスクリプトに書いていきます。
using UnityEngine;
public class PlayerController : MonoBehaviour
{
float playerSpeed = 0.05f; // プレイヤー速度の変数
bool isSpeedUp = false; // スピードアップ中かどうかを判定する変数
public GameObject[] bulletPoint; // 弾を発射する位置を決めるオブジェクトの配列
bool isBulletUp = false; // 弾を増やしているかどうかを判定する変数
void Update()
{
// 省略 //
if (GameManager.instance.bulletUpItem == 1 && isBulletUp == false) // 弾数増加アイテムを持っている場合
{
bulletPoint[0].SetActive(false); // 0番目のオブジェクトをオフにする
bulletPoint[1].SetActive(true); // 1番目のオブジェクトをオンにする
bulletPoint[2].SetActive(true); // 2番目のオブジェクトをオンにする
isBulletUp = true; // 弾増加判定の変数をtrueに変更する
}
// 以下省略 //
}
}
8行目で弾を発射する位置を決めるオブジェクト用の配列bulletPointを作成します。
16行目以降でGamaManagerで管理している変数のbulletUpItemが「1」の場合に、それぞれのオブジェクトをSetActive関数を使って、アクティブ状態を変更する処理を書いています。
速度をあげるアイテムと同様に、効果が重複しないように、bool型のisBulletUp変数を使って、プレイヤーの弾がすでに増えているかどうかを判定しています。
弾を増やす処理が書けたら、「player」のオブジェクトを選択して、インスペクターウィンドウにあるPlayerControllerのbulletPointから+ボタンを押して配列を追加して、ドラッグ&ドロップでplayerBulletPointを順番に設定していきます。

これで、アイテムを取った際に、プレイヤーの弾が増えるという処理を作ることができました。
弾を増やすアイテムの当たり判定の処理
次は、弾を増やすアイテムを配置して、プレイヤーとの当たり判定の処理を作っていきます。
速度をあげるアイテムと同じく、ゲーム内に「bulletUpItem」をstageの中に子オブジェクトとして配置します。

当たり判定の処理を書いていくので、bulletUpItemにもPolygon Collider 2Dを付けて、「Is Trigger」にチェックを入れておきます。

アイテムに当たり判定の処理を作っていくので、新しく「BulletUpItem」というスクリプトを作成して、このbulletUpItemのオブジェクトにアタッチしておきます。

using UnityEngine;
public class BulletUpItem : MonoBehaviour
{
public GameObject player; // プレイヤーを取得するための変数
void OnTriggerEnter2D(Collider2D collision) // 当たり判定処理
{
if (collision.gameObject == player) // プレイヤーと当たった場合
{
GameManager.instance.bulletUpItem = 1; // スピードアップの変数を1に更新
this.gameObject.SetActive(false); // アイテムを消去する
}
}
void Start()
{
if (GameManager.instance.bulletUpItem == 1) // アイテムをすでに取っている場合
{
this.gameObject.SetActive(false); // アイテムを消去する
}
}
}
先ほどのSpeedUpItemのスクリプトと同じく、プレイヤーと当たった際にGameManagerの変数bulletUpItemを「1」に更新するように書いていきます。
スクリプトが書けたら、bulletUpItemのオブジェクトを選択して、インスペクターウィンドウからBulletUpItemのplayer変数に「player」のオブジェクトをドラッグ&ドロップで代入します。

これで実際にゲームを実行してアイテムを取ってみます。

プレイヤーの弾が一つだったのが、アイテムを取ると二つになりました。
まとめ
このページでは、アイテムを配置してそのアイテムを取ったプレイヤーへの処理を作っていきました。
アイテムを作る際は、アイテムを所持したかどうかを変数でチェックして、変数の値に合わせてプレイヤーに処理を加える形で作ることができます。
また、すでにアイテムを所持している場合は、効果が重複しないような仕組みも作っておきましょう。
次は、ゲーム内に音やエフェクトを付けて、よりゲーム感を高めていきます。
最後までお読みいただきまして、ありがとうございました!
コメント