前回に引き続き射撃系の記事です。
今回は連射射撃する方法を記述していきます。
前回の記事↓
準備
弾を用意しましょう。名前をBulletとします。

用意した弾にRigidBodyを追加します。

そうしたら弾をプレハブ化させます。

次に射撃の管理をするオブジェクトを用意します。名前をAutoShootManagerとします。

これで準備は完了です。
連射スクリプト
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AutoShootScript : MonoBehaviour
{
Vector3 mousePosition;
float FireCountDown = 0;
[SerializeField] float NextFireTime = 0.1f;
[SerializeField] float ShootForce = 10;
[SerializeField] GameObject Bullet;
void Update()
{
Shoot();
}
void Shoot()
{
FireCountDown += Time.deltaTime;
mousePosition = Input.mousePosition;
mousePosition.z = 10.0f;
if (Input.GetMouseButton(0) && FireCountDown > NextFireTime)
{
FireCountDown = 0;
GameObject bullet = Instantiate(Bullet, Camera.main.ScreenToWorldPoint(mousePosition), Quaternion.identity);
var rb = bullet.GetComponent<Rigidbody>();
rb.AddForce(0, 0, ShootForce, ForceMode.Impulse);
}
}
}
このスクリプトを書けたら、射撃の管理をするオブジェクトにアタッチします。

そうしたら、Bulletの中に弾のプレハブを入れます。

これで実行をすると

連射できるようになりました!
スクリプトの解説
float FireCountDown = 0;
[SerializeField] float NextFireTime = 0.1f;
ここで、発射カウントダウンを格納するFireCountDown、発射ができるようになる時間NextFireTimeを宣言します。
FireCountDown += Time.deltaTime;
mousePosition = Input.mousePosition;
mousePosition.z = 10.0f;
この行でマウスの位置を取得し、カウントダウンが行われる行です。
毎フレーム取得する位置を更新するようにしたいのでif文の外に置きます。
if (Input.GetMouseButton(0) && FireCountDown > NextFireTime)
if文は、Input.GetMouseButton(0)でマウスが左クリックしている間かつFireCountDown が NextFireTimeよりも大きな値になったら処理を実行する。
という風にしています。
FireCountDown = 0;
GameObject bullet = Instantiate(Bullet, Camera.main.ScreenToWorldPoint(mousePosition), Quaternion.identity);
var rb = bullet.GetComponent<Rigidbody>();
rb.AddForce(0, 0, ShootForce, ForceMode.Impulse);
bulletの中に生成する弾を格納します。
さらにrbにbulletを格納しRigidbodyコンポーネントを取得します。
取得したRigidbodyコンポーネントでAddForce関数が使えるようになりました。
AddForceの中にZ方向に力を加えるようにして弾が発射されます。
まとめ
今回も射撃系の記事でした!
前回の単発発射のプログラムを少し変えればこんな風には連射できるようになりました!
コメント