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