環境:unity2020.3.2f1
サイトを参考にして作っていたのですが、このままではUIのボタン(メニューなど)を押したときも銃を撃ってしまうので、マウスクリックの代わりにUIのボタン(撃つボタン)が押されたら撃つようにしたいです。
該当のソースコード
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5public class FirstPersonGunController : MonoBehaviour 6{ 7 public GameObject ObM; 8 public GameObject ObA; 9 public enum ShootMode { AUTO, SEMIAUTO } 10 public bool shootEnabled = true; 11 [SerializeField] 12 ShootMode shootMode = ShootMode.AUTO; 13 [SerializeField] 14 int maxAmmo = 100; 15 [SerializeField] 16 int damage = 1; 17 [SerializeField] 18 float shootInterval = 0.15f; 19 [SerializeField] 20 float shootRange = 50; 21 [SerializeField] 22 Vector3 muzzleFlashScale; 23 [SerializeField] 24 GameObject muzzleFlashPrefab; 25 [SerializeField] 26 GameObject hitEffectPrefab; 27 [SerializeField] 28 Text ammoText; 29 [SerializeField] 30 Image ammoGauge; 31 32 bool shooting = false; 33 int ammo = 0; 34 GameObject muzzleFlash; 35 GameObject hitEffect; 36 37 public int Ammo 38 { 39 set 40 { 41 ammo = Mathf.Clamp(value, 0, maxAmmo); 42 43 ammoText.text = ammo.ToString("D3"); 44 45 float scaleY = (float)ammo / maxAmmo; 46 ammoGauge.rectTransform.localScale = new Vector3(1, scaleY, 1); 47 48 } 49 get 50 { 51 return ammo; 52 } 53 } 54 void Start() 55 { 56 InitGun(); 57 } 58 void Update() 59 { 60 if (shootEnabled & ammo > 0 & GetInput()) 61 { 62 StartCoroutine(ShootTimer()); 63 } 64 } 65 void InitGun() 66 { 67 Ammo = maxAmmo; 68 } 69 bool GetInput() 70 { 71 switch (shootMode) 72 { 73 case ShootMode.AUTO: 74 return Input.GetMouseButton(0); 75 case ShootMode.SEMIAUTO: 76 return Input.GetMouseButtonDown(0); 77 } 78 return false; 79 } 80 81 IEnumerator ShootTimer() 82 { 83 if (!shooting) 84 { 85 shooting = true; 86 //マズルフラッシュON 87 if (muzzleFlashPrefab != null) 88 { 89 if (muzzleFlash != null) 90 { 91 muzzleFlash.SetActive(true); 92 } 93 else 94 { 95 muzzleFlash = Instantiate(muzzleFlashPrefab, ObM.transform.position, transform.rotation); 96 muzzleFlash.transform.SetParent(gameObject.transform); 97 muzzleFlash.transform.localScale = muzzleFlashScale; 98 } 99 } 100 Shoot(); 101 yield return new WaitForSeconds(shootInterval); 102 //マズルフラッシュOFF 103 if (muzzleFlash != null) 104 { 105 muzzleFlash.SetActive(false); 106 } 107 //ヒットエフェクトOFF 108 if (hitEffect != null) 109 { 110 if (hitEffect.activeSelf) 111 { 112 hitEffect.SetActive(false); 113 } 114 } 115 shooting = false; 116 } 117 else 118 { 119 yield return null; 120 } 121 } 122 void Shoot() 123 { 124 Ray ray = new Ray(ObA.transform.position, ObA.transform.forward); 125 RaycastHit hit; 126 //レイを飛ばして、ヒットしたオブジェクトの情報を得る 127 if (Physics.Raycast(ray, out hit, shootRange)) 128 { 129 //ヒットエフェクトON 130 if (hitEffectPrefab != null) 131 { 132 if (hitEffect != null) 133 { 134 hitEffect.transform.position = hit.point; 135 hitEffect.transform.rotation = Quaternion.FromToRotation(Vector3.forward, hit.normal); 136 hitEffect.SetActive(true); 137 } 138 else 139 { 140 hitEffect = Instantiate(hitEffectPrefab, hit.point, Quaternion.identity); 141 } 142 } 143 string tagName = hit.collider.gameObject.tag; 144 if (tagName == "Enemy") 145 { 146 EnemyController enemy = hit.collider.gameObject.GetComponent<EnemyController>(); 147 enemy.Hp -= damage; 148 } 149 } 150 Ammo--; 151 } 152}
> このままではUIのボタンを押したときも銃を撃ってしまうので、UIのボタンが押されたら撃つようにしたいです。
ちと意味不明ですが、
現状はUIのボタンを押したらどうなって、
あなたはUIのボタンを押したらどうなってほしいんでしょうか
質問のコードは「UI とか関係なく、マウスがクリックされたら弾を発射する」という命令が書かれています。しかし、このコードは「UI のボタンを押して発射する」ことをどうやってやっているのかは全く説明されておらず、いったいどうやってそれをやっているのかわかりません。
UI のボタンを押して弾を発射したい、そうでない時はマウスがクリックされた時には発射して欲しくないならば、「UI とか関係なく、マウスがクリックされたら弾を発射する」ことを命令するのをやめればいいだけです。
分かりずらくてすみません。現状は、メニューなどの撃つことと関係のないUIのボタンを押しても撃ってしまうので、それを解決するために、マウスのクリックで撃つというのを、撃つというボタンを新たにつくり、そのボタンを押したら撃つようにしたいです。
やりたい事はわかったし、どうすればいいかもわかるのですが、どのくらいのレベルで回答したらよいかわからないのでここに大まかなことを書いておきます。
- コードの中の Input.GetMouseButton(0) は左クリックが押されているかどうかを検出している
- コードの中の Input.GetMouseButtonDown(0) は左クリックが押されていない状態から押されたことを検出している
- UI で押されているかどうかを検出するには Button を使うことが多いが、Button は「押されてから離された時」に反応するので、発射ボタンを作るには Event Trigger を使って PointerDown を検出した方がよい
回答2件
あなたの回答
tips
プレビュー