質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.42%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

1037閲覧

ボタンを押したら処理が行われるようにしたいです

Shiranatsu

総合スコア2

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/09/12 05:35

編集2021/09/12 08:35

環境: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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/09/12 06:19

> このままではUIのボタンを押したときも銃を撃ってしまうので、UIのボタンが押されたら撃つようにしたいです。 ちと意味不明ですが、 現状はUIのボタンを押したらどうなって、 あなたはUIのボタンを押したらどうなってほしいんでしょうか
bboydaisuke

2021/09/12 07:30 編集

質問のコードは「UI とか関係なく、マウスがクリックされたら弾を発射する」という命令が書かれています。しかし、このコードは「UI のボタンを押して発射する」ことをどうやってやっているのかは全く説明されておらず、いったいどうやってそれをやっているのかわかりません。 UI のボタンを押して弾を発射したい、そうでない時はマウスがクリックされた時には発射して欲しくないならば、「UI とか関係なく、マウスがクリックされたら弾を発射する」ことを命令するのをやめればいいだけです。
Shiranatsu

2021/09/12 08:22

分かりずらくてすみません。現状は、メニューなどの撃つことと関係のないUIのボタンを押しても撃ってしまうので、それを解決するために、マウスのクリックで撃つというのを、撃つというボタンを新たにつくり、そのボタンを押したら撃つようにしたいです。
bboydaisuke

2021/09/12 10:39 編集

やりたい事はわかったし、どうすればいいかもわかるのですが、どのくらいのレベルで回答したらよいかわからないのでここに大まかなことを書いておきます。 - コードの中の Input.GetMouseButton(0) は左クリックが押されているかどうかを検出している - コードの中の Input.GetMouseButtonDown(0) は左クリックが押されていない状態から押されたことを検出している - UI で押されているかどうかを検出するには Button を使うことが多いが、Button は「押されてから離された時」に反応するので、発射ボタンを作るには Event Trigger を使って PointerDown を検出した方がよい
guest

回答2

0

自己解決

PointerDownとUPを使うことで解決しました。アドバイスありがとうございました!SEMIAUTOは消えましたがのせておきます。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5public class FirstPersonGunController1 : MonoBehaviour 6{ 7 private bool Get; 8 public GameObject image; 9 public GameObject ObM; 10 public GameObject ObA; 11 public enum ShootMode { AUTO, SEMIAUTO } 12 public bool shootEnabled = true; 13 [SerializeField] 14 ShootMode shootMode = ShootMode.AUTO; 15 [SerializeField] 16 int maxAmmo = 100; 17 [SerializeField] 18 int damage = 1; 19 [SerializeField] 20 float shootInterval = 0.15f; 21 [SerializeField] 22 float shootRange = 50; 23 [SerializeField] 24 Vector3 muzzleFlashScale; 25 [SerializeField] 26 GameObject muzzleFlashPrefab; 27 [SerializeField] 28 GameObject hitEffectPrefab; 29 [SerializeField] 30 Text ammoText; 31 [SerializeField] 32 Image ammoGauge; 33 34 bool shooting = false; 35 int ammo = 0; 36 GameObject muzzleFlash; 37 GameObject hitEffect; 38 39 public int Ammo 40 { 41 set 42 { 43 ammo = Mathf.Clamp(value, 0, maxAmmo); 44 45 ammoText.text = ammo.ToString("D3"); 46 47 float scaleY = (float)ammo / maxAmmo; 48 ammoGauge.rectTransform.localScale = new Vector3(1, scaleY, 1); 49 50 } 51 get 52 { 53 return ammo; 54 } 55 } 56 void Start() 57 { 58 InitGun(); 59 Get = false; 60 } 61 void Update() 62 { 63 if (shootEnabled & ammo > 0 & Get) 64 { 65 StartCoroutine(ShootTimer()); 66 } 67 68 } 69 void InitGun() 70 { 71 Ammo = maxAmmo; 72 } 73 74 public void PointerDown() 75 { 76 Get = true; 77 } 78 public void PointerUp() 79 { 80 Get = false; 81 } 82 83 IEnumerator ShootTimer() 84 { 85 if (!shooting) 86 { 87 shooting = true; 88 //マズルフラッシュON 89 if (muzzleFlashPrefab != null) 90 { 91 if (muzzleFlash != null) 92 { 93 muzzleFlash.SetActive(true); 94 } 95 else 96 { 97 muzzleFlash = Instantiate(muzzleFlashPrefab, ObM.transform.position, transform.rotation); 98 muzzleFlash.transform.SetParent(gameObject.transform); 99 muzzleFlash.transform.localScale = muzzleFlashScale; 100 } 101 } 102 Shoot(); 103 yield return new WaitForSeconds(shootInterval); 104 //マズルフラッシュOFF 105 if (muzzleFlash != null) 106 { 107 muzzleFlash.SetActive(false); 108 } 109 //ヒットエフェクトOFF 110 if (hitEffect != null) 111 { 112 if (hitEffect.activeSelf) 113 { 114 hitEffect.SetActive(false); 115 } 116 } 117 shooting = false; 118 } 119 else 120 { 121 yield return null; 122 } 123 } 124 void Shoot() 125 { 126 Ray ray = new Ray(ObA.transform.position, ObA.transform.forward); 127 RaycastHit hit; 128 //レイを飛ばして、ヒットしたオブジェクトの情報を得る 129 if (Physics.Raycast(ray, out hit, shootRange)) 130 { 131 //ヒットエフェクトON 132 if (hitEffectPrefab != null) 133 { 134 if (hitEffect != null) 135 { 136 hitEffect.transform.position = hit.point; 137 hitEffect.transform.rotation = Quaternion.FromToRotation(Vector3.forward, hit.normal); 138 hitEffect.SetActive(true); 139 } 140 else 141 { 142 hitEffect = Instantiate(hitEffectPrefab, hit.point, Quaternion.identity); 143 } 144 } 145 string tagName = hit.collider.gameObject.tag; 146 if (tagName == "Enemy") 147 { 148 EnemyController enemy = hit.collider.gameObject.GetComponent<EnemyController>(); 149 enemy.Hp -= damage; 150 } 151 } 152 Ammo--; 153 } 154}

いらないコードもあると思いますが許してください‼

投稿2021/09/12 16:18

Shiranatsu

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

if (shootEnabled & ammo > 0 & GetInput())

これは、

if ((shootEnabled & (ammo > 0)) & GetInput())

という意味となってしまいますが、これでいいんでしょうか

投稿2021/09/12 06:22

y_waiwai

総合スコア87881

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.42%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問