
Unityで作る「シューティングゲーム」。
前回は「敵2」の弾と攻撃を作ってみました。
弾には「Enemy」タグをつけているので、敵の攻撃に当たるとダメージを受けるはずですね。
今回の課題は次の2つ。
- 「敵2」にもHPを持たせた上で倒せるようにする
- 「敵2」が画面外に出てしまわないように移動制限をかける
それでは早速作っていきましょう。
まずは「Enemy2Controller.cs」を立ち上げて以下のコードを追加します。
❶~❻は「敵1」の作り方とほぼ一緒、❶❷❹(内部処理も含む)⓭はVol.10 を❸⓯はvol.12 で詳しく説明しています。
そちらもご参考にしてみてください。
int hp; //❶ヒットポイント
[SerializeField] GameObject explosion; //❷爆発エフェクト
GameManager gameManager; //❸GameManagerを入れる変数
void OnTriggerEnter2D(Collider2D collision) //❹侵入判定
{
if (collision.gameObject.tag == "Projectile" && IsMove) // ❺起動中にミサイルに衝突したら
{
Destroy(collision.gameObject); //❻弾の削除
hp--; //❼hp の減算
if (hp == 0) //❽hpが 0 になったら
{
Destroy(gameObject); //❾Enemyの削除
gameManager.AddScore(200); //➓スコアを200追加
GameObject effect = Instantiate(explosion, transform.position, transform.rotation); //⓫爆発のエフェクトを生成
Destroy(effect, 1.5f); //⓬爆発エフェクトの削除
}
}
}
void Start()
{
hp = 5; //⓭hpに初期値5を代入
shot_speed = 300; //記述済み
enemyRb2d = GetComponent<Rigidbody2D>(); //記述済み
StartCoroutine(Move()); //記述済み
StartCoroutine(Shot()); //記述済み </span>
gameManager = GameObject.Find("GameManager").GetComponent<GameManager>();//⓮gameManagaer を代入
}
void Update()
{
//⓯移動制限
transform.position = new Vector3(Mathf.Clamp(transform.position.x, -18f, 18f), transform.position.y, 1);
}
では解説です。
❶ 敵2にもHPを持たせるために整数型の 変数:hp を宣言します。
❷ 敵2を倒したときに発生させる、爆発エフェクトを使うためのGameObject型の変数: explosion を宣言。
❸ スコア加算させる関数を呼びだすために、GameManager にアクセスします。
そのための変数:gameManager を宣言。
❹ からはプレイヤーの攻撃を受けたときの侵入判定と、その後の処理をプログラミングしています。
ほとんど「敵1」と同じですね?
❺ プレイヤーの攻撃を受ける条件は次の2つ。
1,プレイヤーミサイルについたタグが「Projectile」ということ。
2,すでに作成済みの変数、IsMove が true であること。
それぞれを && つまり「かつ」条件で指定しています。
❻ 衝突したとき、衝突したオブジェクト、つまり「Playerの弾」を削除します。
❼ hp– これはデクリメント。hp=hp-1 と同じ意味です。
敵のhpを1ずつ減算しています。
❽ もし敵のhpが0になったら
❾ Enemy自体を削除しています。
➓ GameManagerクラスが持つ関数、 AddScore(); を発動。
引数に「200」を代入して200点加算しています。
⓫ ここで、爆発のエフェクトを敵の場所に生成しています。
わざわざゲームオブジェクト型の変数に置き換えなくても生成できるのですが、この後このオブジェクトを操作したいので、いったん変数に置き換えています。
⓬ ⓫で生成したオブジェクトに命令をしています。
Destroy() 関数の2つ目の引数には、秒数を指定します。
これで、1.5秒後に爆発エフェクトのオブジェクトが削除されます。
⓭ ❶で宣言したhpの初期値は5にしています。
「敵1」よりもちょっとだけ強くしています。
⓮ では❸で宣言した「gameManager」に「GameManager」を探してきて、そこに追加されている「GameManager」クラスを取得、代入しています。
今回初めて学習するのが⓯です。
transform.position = new Vector3(Mathf.Clamp(transform.position.x, -18f, 18f), transform.position.y, 1);
ゲームオブジェクトが画面外に出ないようにするには、いろいろな方法があります。
Playerについては、if 文を使って座標管理をしました。
今回利用するのは「Mathf.Clamp()」という便利な関数です。
Mathf.Clamp( value , min , max);
value には制限対象となるパラメーターを指定します。
今回は敵2の「X座標」を指定したいので、「transform.position.x 」 を指定します。
min は最小値。「-18f」 を指定します。max は最大値。「18f」 を指定します。
また、y座標には「敵2」がもともと持っている値を、z座標には1を指定しておきます。
これで「敵2」のx座標方向(横方向)の動きは、-18~18 に制限されます。
今回のプログラムはこれで完成。最後はこのプログラムで宣言した「explosion」という変数に「Explosion」プレハブをセットしておきましょう。

今回はここまでです。
教室では実際に通って頂いての授業の他、ちょっとしたお困りごとに対するオンライン授業やオンラインサポートも行っております。お困りごとのある方、ご興味がある方は、ぜひお問い合わせください。
お問い合わせは こちら から。
体験授業のお申込みは こちら から。