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

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

新規登録して質問してみよう
ただいま回答率
85.50%
UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Unity3D

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

Unity

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

Q&A

解決済

2回答

1781閲覧

UnityUIのtextの変更するスクリプトについて

退会済みユーザー

退会済みユーザー

総合スコア0

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2020/01/03 07:07

前提・実現したいこと

その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と同じところに入ってます。

↓画面
イメージ説明
↓環境
Unity 2019 2.11f1
Visual Studio 2017 community

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

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

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

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

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

guest

回答2

0

float OnePlusTime = reloadTime / (float)(maxAmmo - Ammo);は1以上になる時も
ある訳ですから、OnePlusTimeを足すのではなく単にnowAmmoをインクリメントすればどうですか?

C#

1while(NowAmmo <= Ammo) 2{ 3 yield return new WaitForSeconds(OnePlusTime); 4 5 NowAmmo++; 6 trionText.text = NowAmmo.ToString(); 7}

2の方は、360度をmax - 残弾数で割った角度に、チャージ分の弾の割合分を足した
(120度が空白で、1発ずつチャージするなら40度)円弧をupdate()で描画するようにしたら良いのではないかと思います。

投稿2020/01/04 05:09

madone99

総合スコア1855

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

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

0

ベストアンサー

インスタンス化していないという初歩的なミスをしていたためできていなかった。円ゲージは数字がぎゅいんってなったらいらなく感じたのでサクジョ。ただ一回しかぎゅいんができないのでこれからなおす。

投稿2020/01/25 14:35

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問