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

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

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

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

UI

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

Unity3D

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

解決済

Unityでスタックオーバーフローしてしまった

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

UI

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

Unity3D

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

1回答

0リアクション

0クリップ

9088閲覧

投稿2020/01/01 09:59

前提・実現したいこと

UnityでUIが変わったり、発砲できたりするようなシステムを作っています。
UIの変更機能を実装しテストに以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

StackOverflowException: The requested operation caused a stack overflow. FirstPersonGunController.set_SupplyValue (System.Int32 value) <0x1e3a228f5d0 + 0x00016> in <141fe023199f493885009e10446256d3>:0

該当のソースコード

C#

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class FirstPersonGunController : MonoBehaviour { public enum ShootMode { AUTO, SEMIAUTO } public bool shootEnabled = true; public ShootMode shootMode = ShootMode.AUTO; public int maxAmmo = 30; public int damage = 1; public float shootInterval = 0.1f; public float shootRange = 50; [SerializeField] int maxSupplyValue = 30; [SerializeField] float supplyInterval = 0.1f; public Vector3 muzzleFlashScale; public GameObject muzzleFlashPrefab; public GameObject hitEffectPrefab; [SerializeField] Image ammoGauge; [SerializeField] Text ammoText; [SerializeField] Image supplyGuage; bool shooting = false; bool supplying = false; int ammo = 0; int supplyValue = 0; GameObject muzzleFlash; GameObject hitEffect; void Start() { InitGun(); } void Update() { if (shootEnabled & ammo > 0 & GetInput()) { StartCoroutine(ShootTimer()); } if (shootEnabled) { StartCoroutine(SupplyTimer()); } } public int Ammo { set { ammo = Mathf.Clamp(value, 0, maxAmmo); ammoText.text = ammo.ToString(); float scaleX = (float)ammo / maxAmmo; ammoGauge.rectTransform.localScale = new Vector3(scaleX, 1, 1); } get { return ammo; } } public int SupplyValue { set { SupplyValue = Mathf.Clamp(value, 0, maxSupplyValue); if (SupplyValue >= maxSupplyValue) { Ammo = maxAmmo; supplyValue = 0; } float scaleX = (float)supplyValue / maxSupplyValue; supplyGuage.rectTransform.localScale = new Vector3(scaleX, 1, 1); } get { return supplyValue; } } void InitGun() { Ammo = maxAmmo; } bool GetInput() { switch (shootMode) { case ShootMode.AUTO: return Input.GetMouseButton(0); case ShootMode.SEMIAUTO: return Input.GetMouseButtonDown(0); } return false; } IEnumerator ShootTimer() { if (!shooting) { shooting = true; //マズルフラッシュON if (muzzleFlashPrefab != null) { if (muzzleFlash != null) { muzzleFlash.SetActive(true); } else { muzzleFlash = Instantiate(muzzleFlashPrefab, transform.position, transform.rotation); muzzleFlash.transform.SetParent(gameObject.transform); muzzleFlash.transform.localScale = muzzleFlashScale; } } Shoot(); yield return new WaitForSeconds(shootInterval / 2); //マズルフラッシュOFF if (muzzleFlash != null) { muzzleFlash.SetActive(false); } //ヒットエフェクトOFF if (hitEffect != null) { if (hitEffect.activeSelf) { hitEffect.SetActive(false); } } yield return new WaitForSeconds(shootInterval / 2); shooting = false; } else { yield return null; } } IEnumerator SupplyTimer() { if (!supplying) { supplying = true; SupplyValue++; yield return new WaitForSeconds(supplyInterval); supplying = false; } } void Shoot() { Ray ray = new Ray(transform.position, transform.forward); RaycastHit hit; //レイを飛ばして、ヒットしたオブジェクトの情報を得る if (Physics.Raycast(ray, out hit, shootRange)) { //ヒットエフェクトON if (hitEffectPrefab != null) { if (hitEffect != null) { hitEffect.transform.position = hit.point; hitEffect.transform.rotation = Quaternion.FromToRotation(Vector3.forward, hit.normal); hitEffect.SetActive(true); } else { hitEffect = Instantiate(hitEffectPrefab, hit.point, Quaternion.identity); } } //★ここに敵へのダメージ処理などを追加 } Ammo--; } }

試したこと

無限ループに入ると起きるというサイトを見たので、そのような部分を探したりデバッグログ出力を付けたりしましたが、わかりませんでした。

補足情報(FW/ツールのバージョンなど)

Unity : 2019.2.11f1
VisualStudio : 2017 community

このサイトを参考にやっています。このページまでやりました。
https://unity.moon-bear.com/zombie-slayer/gauge-and-score/

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2020/01/01 11:59

こちらの質問が他のユーザーから「過去の低評価」という指摘を受けました。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C#

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

UI

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

Unity3D

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。