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

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

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

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

Unity

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

Q&A

解決済

1回答

1382閲覧

Unity2D StackOverflowException

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Unity

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

0グッド

1クリップ

投稿2018/05/11 08:48

C#

1#pragma warning disable 0414 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5using UnityEngine.UI; 6 7public class Statistics : MonoBehaviour { 8 9 public Text targetText; 10 11 int Level;//レベル 12 string Ability;//特性 13 int HP; 14 int Attack;//こうげき 15 int Defense;//ぼうぎょ 16 int Sp_Atk;//とくこう 17 int Sp_Def;//とくぼう 18 int Speed;//すばやさ 19 int Evasion;//回避 20 int Accuracy;//命中 21 string Gender;//性別 22 int Exp;//経験値 23 int Individual_Value;//個体値 24 int ATKorSPATK; 25 26 private void Awake() 27 { 28 Generate_Stats(); 29 targetText = this.GetComponent<Text>(); 30 } 31 32 void Generate_Stats() 33 { 34 //int Random_Level = Random.Range(1, 101); 35 int Random_Ability = Random.Range(1, 11); 36 int Random_HP = Random.Range(1, 256); 37 int Random_ATK = Random.Range(1, 256); 38 int Random_DEF = Random.Range(1, 256); 39 int Random_Sp_Atk = Random.Range(1, 256); 40 int Random_Sp_Def = Random.Range(1, 256); 41 int Random_Speed = Random.Range(1, 256); 42 int Random_Evasion = Random.Range(1, 101); 43 int Random_Accuracy = Random.Range(1, 101); 44 int Random_Gender = Random.Range(0, 2); 45 Exp = 0; 46 int Random_IV = Random.Range(100, 601); 47 int Random_ATKorSPATK = Random.Range(0, 2); 48 49 Level = 1; 50 HP = Random_HP; 51 Attack = Random_ATK; 52 Defense = Random_DEF; 53 Sp_Atk = Random_Sp_Atk; 54 Sp_Def = Random_Sp_Def; 55 Speed = Random_Speed; 56 Evasion = Random_Evasion; 57 Accuracy = Random_Accuracy; 58 Individual_Value = Random_HP + Random_ATK + Random_DEF 59 + Random_Sp_Atk + Random_Sp_Def + Random_Speed; 60 61 if (Random_Ability == 1) 62 { 63 Ability = "Power Boost";//ATKが二倍になる・パワーブースト 64 } 65 if (Random_Ability == 2) 66 { 67 Ability = "Poison Body";//歩いた場所が毒のマスになる・どくのからだ 68 } 69 if (Random_Ability == 3) 70 { 71 Ability = "Water Barrier";//状態異常にならない・みずのバリア 72 } 73 if (Random_Ability == 4) 74 { 75 Ability = "Levitate";//異常マスを踏んでもダメージを受けない・ふゆう 76 } 77 if (Random_Ability == 5) 78 { 79 Ability = "Shed Skin";//体力が半分以下になるととくこうが二倍になる・だっぴ 80 } 81 if (Random_Ability == 6) 82 { 83 Ability = "Insecticide";//分類・虫の相手に与えるダメージが二倍になる・さっちゅう 84 } 85 if (Random_Ability == 7) 86 { 87 Ability = "Quick Pace";//移動するスピードが二倍になる。ニマスずつ進む・はやあし 88 } 89 if (Random_Ability == 8) 90 { 91 Ability = "Damage Filter";//受けるダメージが三分の二になる。・ダメージフィルター 92 } 93 if (Random_Ability == 9) 94 { 95 Ability = "Solution";//広範囲にダメージを与える・ようかいえき 96 } 97 if (Random_Ability == 10) 98 { 99 Ability = "Aftermath";//もしも相手の攻撃によって死亡したとき、相手のHPの三分の一のダメージを与える・ゆうばく 100 } 101 102 if (Individual_Value != Random_IV) 103 { 104 Generate_Stats(); 105 } 106 else 107 { 108 targetText.text = "Level " + Level.ToString() + "\n" + "Ability " + Ability + "\n" + "IV " + Individual_Value.ToString() + "\n" + 109 "HP " + HP.ToString() + "\n" + "Attack " + Attack.ToString() + "\n" + "Defense " + Defense.ToString() + "\n" + 110 "Sp_Atk " + Sp_Atk.ToString() + "\n" + "Sp_Def " + Sp_Def.ToString() + "\n" + "Speed " + Speed.ToString() + "\n" + 111 "Evasion " + Evasion.ToString() + "\n" + "Accuracy " + Accuracy.ToString(); 112 } 113 } 114} 115

35行目の「int Random_Ability = Random.Range(1, 11);」がエラーになってしまいます。

エラーメッセージは

StackOverflowException
UnityEngine.Random.Range (Int32 min, Int32 max) (at C:/buildslave/unity/build/artifacts/generated/common/runtime/RandomBindings.gen.cs:63)

です。

Random.Rangeを使わずに、イコール(1~10)までにすると、普通に動作します。ですが、ランダムで1から10まで数字を選びたいので、Random.Rangeを使う必要があります。

どう書き直せばよいでしょうか? 教えていただけるとありがたいです。

回答よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

StackOverflowとは、メモリのスタック領域を、その領域よりも多く使おうとしてしまうことです。
詳しいことは自分で調べて欲しいと思いますが、その原因として考えられるのは関数の呼び出しすぎです。
現在のPCではメモリが多いので、普通にしていれば問題ないと思いますが、例えば、

C#

1void Foo() 2{ 3 Foo(); 4}

のようにしてしまうと、Foo()が永遠に呼ばれ続け、しまいにはメモリがFoo()だらけになってしまいます。

同じように、同じ関数自身を呼び出している箇所があります。
それは、以下の箇所です。

C#

1 if (Individual_Value != Random_IV) 2 { 3 Generate_Stats(); 4 }

この場合、Individual_Value == Random_IVとなればこの現象から抜け出せるので、永遠ではないですが、

C#

1 int Random_IV = Random.Range(100, 601);

となっているので、単純に考えると500回に1回ぐらいの確率しか抜け出せません。
平均500回も関数を呼び出していては、メモリのスタック領域を超えてもおかしくないと思いますが、どうでしょうか?

なお、これが正しければ、int Random_Ability = Random.Range(1, 11);で起きたのはただの偶然でしょう。
何回か実行していれば、そのうち他の箇所で同じエラーが起きるでしょう。

投稿2018/05/11 10:04

fiveHundred

総合スコア9803

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

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

fiveHundred

2018/05/11 10:21

…と思ったけど、仮にRandom_IVの値を固定しても、Individual_Value == Random_IVが満たされる確率は限りなく低いですね。
退会済みユーザー

退会済みユーザー

2018/05/11 10:47

回答ありがとうございました。エラーにならずにIndividual_Value == Random_IVにするためには、どのように書けばいいのでしょうか?もしよろしければ、教えていただきたいです。
fiveHundred

2018/05/11 11:34

Random_IVをランダムに生成し、そのRandom_IVの数だけ「Random_HP〜Random_Speedのいずれかを+1する」を繰り返せば、パラメータをランダムに振り分けることが出来ます。 この方法を取れば、Individual_Value == Random_IVの判定はそもそも要らないでしょう。
fiveHundred

2018/05/11 11:45

あるいは、そもそもRandom_HP〜Random_Speedはランダムなので、Individual_Value == Random_IVではなく「100 <= Individual_Value && Individual_Value < 601」としても良いでしょう。 この程度であれば確率的には問題ないと思いますが、心配であれば再帰呼び出しではなくループを使うのも良いかもしれません。
退会済みユーザー

退会済みユーザー

2018/05/11 13:28 編集

回答ありがとうございます。出来ました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問