昨日投稿した『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秒おきに)連射されるようになりました