前提・実現したいこと
その1 画面右下に残弾を表示させ、リロード(Rボタン)をすると指定した時間後までに1ずつ数字が増え、最大装弾数になるということをしたいです。
その2 数字ではなく円ゲージでも打ったら少しずつ減りn秒後に最大になるようにしたいです。
発生している問題・エラーメッセージ
打って弾が減ると残弾数が表示されるようにはでき、n秒後に最大になるのはできたのですが、1ずつ増やすができないです。(その2を試したらこれすらもできなくなりました)
スクリプトはかけたのですが(絶対動くとは言ってない)、どこに配置するかという基本的なことがわからないです。
NullReferenceException: Object reference not set to an instance of an object GunController+<ReloadTimer>d__26.MoveNext () (at Assets/Scripts/GunController.cs:91) UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at C:/buildslave/unity/build/Runtime/Export/Scripting/Coroutines.cs:17) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) GunController:Update() (at Assets/Scripts/GunController.cs:54) NullReferenceException: Object reference not set to an instance of an object GunController+<ReloadTimer>d__26.MoveNext () (at Assets/Scripts/GunController.cs:91) UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at C:/buildslave/unity/build/Runtime/Export/Scripting/Coroutines.cs:17) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) GunController:Update() (at Assets/Scripts/GunController.cs:54)
該当のソースコード
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class GunController : MonoBehaviour 7{ 8 public enum ShootMode { AUTO, SEMIAUTO } 9 10 public bool shootEnabled = true; 11 12 public ShootMode shootMode = ShootMode.SEMIAUTO; 13 public int maxAmmo = 30; 14 public int damage = 1; 15 public float shootInterval = 0.1f; 16 public float shootRange = 50; 17 18 public int ModechangeTime = 1; 19 public int reloadTime = 2; 20 public AmmoGaugeChanger ReloadUIchange; 21 22 public Vector3 muzzleFlashScale; 23 public GameObject muzzleFlashPrefab; 24 public GameObject hitEffectPrefab; 25 public Text trionText; 26 27 public AudioClip FireSound; 28 29 bool shooting = false; 30 int ammo = 0; 31 32 GameObject muzzleFlash; 33 GameObject hitEffect; 34 35 void Start() 36 { 37 InitGun(); 38 } 39 40 void Update() 41 { 42 trionText.text = Ammo.ToString(); 43 if (shootEnabled & ammo > 0 & GetInput()) 44 { 45 StartCoroutine(ShootTimer()); 46 } 47 48 if (Input.GetKey(KeyCode.B)) 49 { 50 StartCoroutine(ChangeShootMode()); 51 } 52 if (Input.GetKey(KeyCode.R)) 53 { 54 StartCoroutine(ReloadTimer()); 55 } 56 } 57 58 public int Ammo 59 { 60 set 61 { 62 ammo = Mathf.Clamp(value, 0, maxAmmo); 63 } 64 get 65 { 66 return ammo; 67 } 68 } 69 70 void InitGun() 71 { 72 Ammo = maxAmmo; 73 } 74 75 bool GetInput() 76 { 77 switch (shootMode) 78 { 79 case ShootMode.AUTO: 80 return Input.GetMouseButton(0); 81 82 case ShootMode.SEMIAUTO: 83 return Input.GetMouseButtonDown(0); 84 } 85 return false; 86 } 87 88 IEnumerator ReloadTimer() 89 { 90 ReloadUIchange.roop = true; 91 92 float NowAmmo = Ammo; 93 float OnePlusTime = reloadTime / (float)(maxAmmo - Ammo); 94 95 while(NowAmmo <= Ammo) 96 { 97 yield return new WaitForSeconds(OnePlusTime); 98 NowAmmo += OnePlusTime; 99 trionText.text = NowAmmo.ToString(); 100 } 101 } 102 IEnumerator ChangeShootMode() 103 { 104 yield return new WaitForSeconds(ModechangeTime); 105 106 if (shootMode == ShootMode.AUTO) 107 { 108 shootMode = ShootMode.SEMIAUTO; 109 } 110 else 111 { 112 shootMode = ShootMode.AUTO; 113 } 114 } 115 116 IEnumerator ShootTimer() 117 { 118 if (!shooting) 119 { 120 shooting = true; 121 if (muzzleFlashPrefab != null) 122 { 123 if (muzzleFlash != null) 124 { 125 muzzleFlash.SetActive(true); 126 } 127 else 128 { 129 muzzleFlash = Instantiate(muzzleFlashPrefab, transform.position, transform.rotation); 130 muzzleFlash.transform.SetParent(gameObject.transform); 131 muzzleFlash.transform.localScale = muzzleFlashScale; 132 } 133 } 134 Shoot(); 135 yield return new WaitForSeconds(shootInterval); 136 if (muzzleFlash != null) 137 { 138 muzzleFlash.SetActive(false); 139 } 140 if (hitEffect != null) 141 { 142 if (hitEffect.activeSelf) 143 { 144 hitEffect.SetActive(false); 145 } 146 } 147 shooting = false; 148 } 149 else 150 { 151 yield return null; 152 } 153 } 154 155 void Shoot() 156 { 157 Ray ray = new Ray(transform.position, transform.forward); 158 RaycastHit hit; 159 160 AudioSource fireSE = gameObject.GetComponent<AudioSource>(); 161 fireSE.clip = FireSound; 162 fireSE.Play(); 163 164 if (Physics.Raycast(ray, out hit, shootRange)) 165 { 166 if (hitEffectPrefab != null) 167 { 168 if (hitEffect != null) 169 { 170 hitEffect.transform.position = hit.point; 171 hitEffect.transform.rotation = Quaternion.FromToRotation(Vector3.forward, hit.normal); 172 hitEffect.SetActive(true); 173 } 174 else 175 { 176 hitEffect = Instantiate(hitEffectPrefab, hit.point, Quaternion.identity); 177 } 178 } 179 } 180 Ammo--; 181 } 182}
UIchanger
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class AmmoGaugeChanger : MonoBehaviour 7{ 8 public GunController GunCOntroller; 9 public Image uiobj; 10 public bool roop = false; 11 12 private float reloadtim; 13 void Start() 14 { 15 reloadtim = GunCOntroller.reloadTime; 16 uiobj.fillAmount = 0; 17 } 18 19 void Update() 20 { 21 if (roop) 22 { 23 uiobj.fillAmount -= 1.0f / reloadtim * Time.deltaTime; 24 } 25 } 26}
試したこと
最初OnePlusTimeをintにしていたのですが、DivideByZeroExceptionのエラーを吐いたのでfloatにしてみました、がエラーが出ないだけで動きませんでした。
円のやつを変えるのは下のサイトを参考にしました。
https://clrmemory.com/programming/unity/circle-gauge-meter-p1/#Scene
補足情報(FW/ツールのバージョンなど)
円UIを変えるスクリプトはGunControllerと同じところに入ってます。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。