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

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

ただいまの
回答率

90.76%

  • C#

    6562questions

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

  • Unity

    3589questions

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

  • Unity2D

    759questions

Unity2D StackOverflowException

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 105

t2t21212

score 29

#pragma warning disable 0414
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Statistics : MonoBehaviour {

    public Text targetText;

    int Level;//レベル
    string Ability;//特性
    int HP;
    int Attack;//こうげき
    int Defense;//ぼうぎょ
    int Sp_Atk;//とくこう
    int Sp_Def;//とくぼう
    int Speed;//すばやさ
    int Evasion;//回避
    int Accuracy;//命中
    string Gender;//性別
    int Exp;//経験値
    int Individual_Value;//個体値
    int ATKorSPATK;

    private void Awake()
    {
        Generate_Stats();
        targetText = this.GetComponent<Text>();
    }

    void Generate_Stats()
    {
        //int Random_Level = Random.Range(1, 101);
        int Random_Ability = Random.Range(1, 11);
        int Random_HP = Random.Range(1, 256);
        int Random_ATK = Random.Range(1, 256);
        int Random_DEF = Random.Range(1, 256);
        int Random_Sp_Atk = Random.Range(1, 256);
        int Random_Sp_Def = Random.Range(1, 256);
        int Random_Speed = Random.Range(1, 256);
        int Random_Evasion = Random.Range(1, 101);
        int Random_Accuracy = Random.Range(1, 101);
        int Random_Gender = Random.Range(0, 2);
        Exp = 0;
        int Random_IV = Random.Range(100, 601);
        int Random_ATKorSPATK = Random.Range(0, 2);

        Level = 1;
        HP = Random_HP;
        Attack = Random_ATK;
        Defense = Random_DEF;
        Sp_Atk = Random_Sp_Atk;
        Sp_Def = Random_Sp_Def;
        Speed = Random_Speed;
        Evasion = Random_Evasion;
        Accuracy = Random_Accuracy;
        Individual_Value = Random_HP + Random_ATK + Random_DEF
                           + Random_Sp_Atk + Random_Sp_Def + Random_Speed;

        if (Random_Ability == 1)
        {
            Ability = "Power Boost";//ATKが二倍になる・パワーブースト
        }
        if (Random_Ability == 2)
        {
            Ability = "Poison Body";//歩いた場所が毒のマスになる・どくのからだ
        }
        if (Random_Ability == 3)
        {
            Ability = "Water Barrier";//状態異常にならない・みずのバリア
        }
        if (Random_Ability == 4)
        {
            Ability = "Levitate";//異常マスを踏んでもダメージを受けない・ふゆう
        }
        if (Random_Ability == 5)
        {
            Ability = "Shed Skin";//体力が半分以下になるととくこうが二倍になる・だっぴ
        }
        if (Random_Ability == 6)
        {
            Ability = "Insecticide";//分類・虫の相手に与えるダメージが二倍になる・さっちゅう
        }
        if (Random_Ability == 7)
        {
            Ability = "Quick Pace";//移動するスピードが二倍になる。ニマスずつ進む・はやあし
        }
        if (Random_Ability == 8)
        {
            Ability = "Damage Filter";//受けるダメージが三分の二になる。・ダメージフィルター
        }
        if (Random_Ability == 9)
        {
            Ability = "Solution";//広範囲にダメージを与える・ようかいえき
        }
        if (Random_Ability == 10)
        {
            Ability = "Aftermath";//もしも相手の攻撃によって死亡したとき、相手のHPの三分の一のダメージを与える・ゆうばく
        }

        if (Individual_Value != Random_IV)
        {
            Generate_Stats();
        }
        else
        {
            targetText.text = "Level      " + Level.ToString() + "\n" + "Ability    " + Ability + "\n" + "IV         " + Individual_Value.ToString() + "\n" + 
                "HP         " + HP.ToString() + "\n" + "Attack     " + Attack.ToString() + "\n" + "Defense    " + Defense.ToString() + "\n" +
                "Sp_Atk     " + Sp_Atk.ToString() + "\n" + "Sp_Def     " + Sp_Def.ToString() + "\n" + "Speed      " + Speed.ToString() + "\n" +
                "Evasion    " + Evasion.ToString() + "\n" + "Accuracy   " + Accuracy.ToString();
        }
    }
}


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を使う必要があります。

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

void Foo()
{
    Foo();
}

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

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

        if (Individual_Value != Random_IV)
        {
            Generate_Stats();
        }

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/11 19:21

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

    キャンセル

  • 2018/05/11 19:47

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

    キャンセル

  • 2018/05/11 20:34

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

    キャンセル

  • 2018/05/11 20:45

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

    キャンセル

  • 2018/05/11 22:00 編集

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

    キャンセル

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

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • C#

    6562questions

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

  • Unity

    3589questions

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

  • Unity2D

    759questions