プレハブにした Bullet ゲームオブジェクトを生成し、プレイヤーの進行方向の情報を渡して発射準備するためのジェネレーター用のスクリプトです。
このスクリプトはどのゲームオブジェクトにアタッチしても問題ありませんが、管理のしやすさから、今回はプレイヤー役のゲームオブジェクトにアタッチします。
これはキー入力の情報をこのスクリプト内でも新しく取得しているため、プレイヤーの移動用のキー入力とは連動していないためです。
もしも連動した方がよいのであれば、スクリプトを見直して、処理を書き換えてみましょう。
BulletGenerator.cs
<= クリックすると開きます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BulletGenerator : MonoBehaviour
{
[SerializeField] private Bullet bulletPrefab;
[SerializeField] private int damage;
[SerializeField] private float speed;
[SerializeField] private float interval;
private Vector2 direction; // プレイヤーの進行方向
private bool isShooting; // コルーチン用
void Start() {
// 初期の発射方向の設定
direction = Vector2.down;
// TODO BulletData 作成後は、damage, speed, interval の値を BulletData の内容に更新する
}
void Update()
{
// 弾の連射防止
if (isShooting) {
return;
}
// キー入力を取得
Vector2 inputDirection = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
// キー入力があれば、発射する弾の向きも更新する
if (inputDirection.sqrMagnitude > 0) {
direction = inputDirection.normalized;
}
if (Input.GetButtonDown("Fire1") || Input.GetKeyDown(KeyCode.Return)) {
// 弾の発射
StartCoroutine(ShootCo());
}
}
/// <summary>
/// コルーチンでの弾の発射と連射防止
/// </summary>
/// <returns></returns>
private IEnumerator ShootCo() {
isShooting = true;
GenerateBullet();
yield return new WaitForSeconds(interval);
isShooting = false;
}
/// <summary>
/// 弾の生成
/// </summary>
private void GenerateBullet() {
Bullet bullet = Instantiate(bulletPrefab, transform.position, Quaternion.identity);
// 発射命令
bullet.Shoot(damage, speed, direction);
}
}
プレイヤーの進行方向については、キー入力から取得しています。
その際、以前のキー入力情報を保持しておいて、進行方向が変更になったときだけ更新するようにしています。
そのため、停止している状態(キー入力がない状態)であっても、現在の進行方向に対して弾を発射できるようにしています。
弾の発射には連射防止の機能を設けたいため、弾の発射処理部分をコルーチンメソッドとして処理しています。