簡単な2Dシューティングゲーム作成の第3回目を進めていきます。今回は機体(プレイヤー)から弾を発射できるようにしていきます。
はじめに
Part1は下記から。
簡単なおさらいと今回やる事
前回まで、簡単な画面を作成して、矢印ボタンを押して機体が動くようにしました。今回は、機体から弾が出るようにします。
ゲーム作成開始
では、さっそく弾を撃つのを実装していきます。
弾の作成
まずは仮となる弾を用意します。Resourceフォルダ内で右クリック。作成から「2D」→「Sprites」→「Circle」を選びます。

名前をBulletにしてヒエラルキーにドラッグアンドドロップ。このままだと大きいのでスケールを変更しておきます。

スクリプトで弾を発射
次に、Scriptsフォルダ内で右クリックして「Bullet」と言う名前で新しくスクリプトファイルを作成します。

Bulletスクリプトの中身は下記のように変更します。縦方向に場所を移動しているだけです。
using UnityEngine;
public class Bullet : MonoBehaviour
{
private float bulletspeed = 4.0f;
private void FixedUpdate()
{
transform.position += new Vector3(0, bulletspeed, 0) * Time.fixedDeltaTime;
}
}
このスクリプトをBulletにくっつけます。
当然ですが、弾は何発も発射します。もちろん、同じ弾なのでこのようなものはプレハブ化しておきます。テンプレートみたいなものですね。ヒエラルキーからPrefabsフォルダ内にドラッグアンドドロップ。

試しに動かしてみると、弾が上に向かって動いていきます。これで弾の動きは一旦OKですね。
弾を複数作成する
次に「Attack」ボタンを押した時に弾が出るようにします。
Playerスクリプトの中身は下記のように変更します。一番下のAttack()を追加しただけです。
using UnityEngine;
public class Player : MonoBehaviour
{
[SerializeField] private GameObject prefabBullet;
private float speed = 4.0f;
private float MaxPos = 2.3f;
private bool LPush = false;
private bool RPush = false;
private void FixedUpdate()
{
if (LPush && transform.position.x >= -MaxPos)
{
transform.position -= new Vector3(speed, 0, 0) * Time.fixedDeltaTime;
}
else if (RPush && transform.position.x <= MaxPos)
{
transform.position += new Vector3(speed, 0, 0) * Time.fixedDeltaTime;
}
}
public void LeftPush(bool isPush)
{
LPush = isPush;
}
public void RightPush(bool isPush)
{
RPush = isPush;
}
public void Attack()
{
Instantiate(prefabBullet);
}
}
変数に「Bulletプレハブ」を指定します。ヒエラルキーにあったBulletは不要なので消しておきます。

Attackボタンを押した時に呼ばれるように、Attackのクリック時のイベントに追加します。

これで一度実行してみます。ボタンを押すと弾が出ますが、機体がどこにいても真ん中の決まった場所から弾が出ます。
弾の出る位置を調整
次に、弾が出る位置を「機体の先端」に変更します。Player配下に「CreateEmpty」で空オブジェクトを追加します。

弾が出る位置なので名前は「BulletPoint」にでもしておきます。機体の前の方のいい感じの位置に調整します。

PlayerスクリプトのAttack()を下記のように変更します。オブジェクトの生成場所をパラメータで指定します。
[SerializeField] private Transform BulletPoint;
public void Attack()
{
Instantiate(prefabBullet, BulletPoint.position, Quaternion.identity);
}
新たに追加した変数にBulletPointを指定します。

これで試しに動かして機体から弾が出るような動きになればOK。次回はマトとなる敵を生成していきます。

