日々是好日~every day is a good day~

日常の中の非日常の備忘録

【Unity】カメラの方向に弾を連射する

昨日投稿した『ARでカメラの方向に弾を撃つ』は弾を発射するのにボタンをクリック(スマホの場合はタップ)しなければなりませんでした
これではあまり実用的ではないので ボタンを押したままにすると弾を連射するように変更しました
『ARでカメラの方向に弾を撃つ』の続きです
1.プロジェクトタブ内で右クリックし作成/C#スクリプトを選択 名前をButtonStatusにする

2.ButtonStatusスクリプトを編集

using UnityEngine;

public class ButtonStatus : MonoBehaviour
{
    // ボタンを押したときtrue 離したときfalse
    public bool buttonFlag = false;

    // ボタンを押したとき
    public void ButtonDown()
    {
        buttonFlag = true;
    }

    // ボタンを離したとき
    public void ButtonUp()
    {
        if (buttonFlag)
        {
            buttonFlag = false;
        }
    }

    // ボタンの枠から外れたとき
    public void ButtonExit()
    {
        if (buttonFlag)
        {
            buttonFlag = false;
        }
    }
}

3.スクリプトをShootButtonにアタッチする

4.ShootButtonのインスペクターでクリック時()のーをクリックして削除
コンポーネントを追加をクリック

5.EventTriggerを追加する

6.新しいイベントタイプを追加をクリックしてPointerDown PointerUp PointerExitを追加する




7.PointerDown PointerUp PointerExitそれぞれの+をクリックしてShootButtonオブジェクトをドラッグ&ドロップ

8..PointerDownにはButtonStatus/ButtonDown PointerUpにはButtonStatus/ButtonUp PointerExitにはButtonStatus/ButtonExitを設定する



9.BulletCntrlスクリプトを再編集

using System.Collections.Generic;
using UnityEngine;

public class BulletCntrl : MonoBehaviour
{
    public GameObject bulletPrefab;
    public float bulletSpeed = 5f;
    public Transform transformCamera;
    public List<GameObject> listOfBullet = new List<GameObject>();
    private List<float> listOfTime = new List<float>();

    public GameObject shootButton;   //追加
    public float shootInterval = 0.3f;   //追加
    private float waitCounter = 0;   //追加

    // Start is called before the first frame update
    void Start()
    {
        for (int i = 0; i < 10; i++)
        {
            GameObject obj = Instantiate(bulletPrefab);
            obj.SetActive(false);
            listOfBullet.Add(obj);
            listOfTime.Add(0);
        }
    }

    // Update is called once per frame
    void Update()
    {
        //追加
        waitCounter -= Time.deltaTime;
        if (shootButton.GetComponent<ButtonStatus>().buttonFlag && waitCounter <= 0)
        {
            ShootClick();
            waitCounter = shootInterval;
        }
        //発射済弾の移動
        BallPositionUpdate();
    }
    private void BallPositionUpdate()
    {
        for (int i = 0; i < listOfBullet.Count; i++)
        {
            if (listOfBullet[i].activeInHierarchy)
            {
                Vector3 moveDirection = transformCamera.forward.normalized * bulletSpeed * Time.deltaTime;
                listOfBullet[i].transform.Translate(moveDirection);
                if (Time.time - listOfTime[i] > 2f)
                {
                    listOfBullet[i].SetActive(false);
                }

            }
        }
    }
    public void ShootClick()
    {
        for (int i = 0; i < listOfBullet.Count; i++)
        {
            if (listOfBullet[i].activeInHierarchy == false)
            {
                listOfBullet[i].SetActive(true);
                listOfBullet[i].transform.position = transformCamera.transform.position;
                listOfTime[i] = Time.time;
                break;
            }
        }
    }
}

10.BulletのスクリプトにShootButtonをアタッチする

実行すると

Shootボタンを押したままにすると弾が(今回は0.3秒おきに)連射されるようになりました