今回はUnityで「プレイヤーに向かって自動で弾を発射」するのを実装してみます。
はじめに
Unityのバージョンは2022.3.10f1です。
下記記事で「プレイヤーの侵入検知」を実装しており、途中までは似たような感じで作成していきます。「プレイヤーの位置に弾を発射」します。
実装開始
簡単なUIを作成後、スクリプトで機能を実装していきます。
UI作成
「2DObject」→「Sprites」→「Square」を2つ追加、名前を「Player」と「Ground」にします。

PlayerにAddComponentから「Rigidbody2D」と「BoxCollider2D」をアタッチ。

Groundには「BoxCollider2D」をアタッチ。SpriteRendererの色を変更、PositionとScaleも変更します。

ゲーム画面が下記のような感じですね。緑色が地面で、白い四角がプレイヤーです。

自動砲台のUI
次に弾を発射するオブジェクトを作成します、「2DObject」→「Sprites」→「Circle」を追加。名前を「Turret」とします。

次に「2DObject」→「Sprites」→「Capsule」を追加。名前を「bullet」とします。

bulletのScaleを変更して、「Rigidbody2D」をアタッチします。

Rigidbody2DのGravityScaleは0にします。

bulletをProjectフォルダに移動して、プレハブ化しておきます。Hierarchyのbulletは削除します。

これで画面の準備は完了です。
スクリプトの作成
各スクリプトを作成していきます。まずはPlayerにアタッチするスクリプト。キー操作でプレイヤーが動くようにします。
using UnityEngine;
public class Player : MonoBehaviour
{
private float _Speed = 5.0f;
private Rigidbody2D _rb;
private void Awake()
{
_rb = GetComponent<Rigidbody2D>();
}
void Update()
{
float inputX = Input.GetAxisRaw("Horizontal");
_rb.velocity = new Vector2(inputX * _Speed, 0);
}
}
次に弾を生成するスクリプトを作成します。下記の「Turret」、「Bullet」スクリプトにて、3秒ごとにターゲットに向かって弾を生成しています。
using UnityEngine;
public class Turret : MonoBehaviour
{
[SerializeField] private bullet _bullet;
[SerializeField] private Transform targetPos;
private float timer;
void Update()
{
timer += Time.deltaTime;
if (timer > 3.0f)
{
timer = 0f;
Shoot();
}
}
void Shoot()
{
Vector3 dir = (targetPos.position - transform.position).normalized;
bullet bulletIns = Instantiate(_bullet, transform);
bulletIns.Init(dir);
}
}
using UnityEngine;
public class bullet : MonoBehaviour
{
private Rigidbody2D _rb;
private void Awake()
{
_rb = GetComponent<Rigidbody2D>();
}
public void Init(Vector3 dir)
{
_rb.velocity = dir * 15f;
}
}
それぞれのスクリプトをオブジェクトにアタッチします。

Turretは下記のような感じにパラメータをセット。

実行してみると、下記のようにプレイヤーに向かって弾が発射されますが、弾の向きがおかしいので直していきます。

bulletのスクリプトを下記に変更します。
using UnityEngine;
public class bullet : MonoBehaviour
{
private Rigidbody2D _rb;
private void Awake()
{
_rb = GetComponent<Rigidbody2D>();
}
public void Init(Vector3 dir)
{
transform.rotation = Quaternion.FromToRotation(Vector3.up, dir);
_rb.velocity = dir * 15f;
}
}
実行すると下記のような感じに。発射時のプレイヤーの位置に向かって弾を発射します。

