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

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

ただいまの
回答率

90.61%

  • Unity

    3803questions

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

  • Unity2D

    829questions

配列を使った時間制限

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 148

4423

score 6

制限時間をつくっています。
5分間の制限になっており、
0~9のスプライトをイメージの配列で回そうと思っておりますが
エラーが出てしましました。

 エラーメッセージ

IndexOutOfRangeException: Array index is out of range.
Timemanager.SetNumber (Int32 min, Int32 val1, Int32 val2, Int32 val3) (at Assets/ScriputsUI/Timemanager.cs:52)
Timemanager+<TimeStart>c__Iterator0.MoveNext () (at Assets/ScriputsUI/Timemanager.cs:64)
C:/buildslave/unity/build/Runtime/Export/Coroutines.cs:17)
UnityEngine.MonoBehaviour:StartCoroutine(String)
Timemanager:Update() (at Assets/ScriputsUI/Timemanager.cs:41)

C#

コード
public class Timemanager : MonoBehaviour {

    [SerializeField]
    Sprite[] Sprites;
    [SerializeField]
    Image[] Images;

    int minutes;
    int seconds_10;//秒数10桁
    int seconds_1;//秒数1桁
    [SerializeField]
    int total;    //制限時間


    // Use this for initialization
    void Start() {

        //下記は別のエラーによりコメントアウトしております。
        //Instantiate(Resources.Load("Digital/TimePng/"));
        Sprites = Resources.LoadAll<Sprite>("SpriteUI/Digital/");

        Sprites = new Sprite[10];

        total = minutes * 60+(seconds_10+seconds_1);

    }
    // Update is called once per frame
    void Update () {


        //時間を計測
        total = minutes * 60 + (seconds_10 + seconds_1);


        StartCoroutine("TimeStart");


    }
    //経過時間の数値を文字型として取り、
    //文字列の値をイメージ配列の要素数と組み合わせる
    void SetNumber(int min,int val1,int val2 ,int val3) {

        string str = string.Format("{0:00}", min);//第一引数を文字型に変換

        //(引数内訳:val1=分・val2=10秒単位・val3=一秒単位)//それぞれ第一引数から指定の文字列を引き抜く
        Images[val1].sprite = Sprites[Convert.ToInt32(str.Substring(0, 1))];//0番目1文字
        Images[val2].sprite = Sprites[Convert.ToInt32(str.Substring(1, 1))];//1番目1文字
        Images[val3].sprite = Sprites[Convert.ToInt32(str.Substring(2, 1))];
    }
    //文字列関数で使った引数を変更経過時間ごとに変更する
    IEnumerator TimeStart()
    {
        while (total >= 0)
        {

            //分単位をSetNumber関数にminutesを渡す
            minutes = Mathf.FloorToInt(total - (seconds_1 + seconds_10)) / 60;
            SetNumber(minutes, 4, 9, 9);
            //10秒単位  〃
            seconds_10 =Mathf.FloorToInt( total % 60) ; 
            SetNumber(seconds_10, 4, 9, 9);
            //1秒単位   
            seconds_1 =Mathf.FloorToInt( minutes % 60);
            SetNumber(seconds_1, 4, 9, 9);
            total -= (int)Time.deltaTime;
            yield return new WaitForSeconds(1.0f);
        }

試したこと

配列の上限を超えた様子?なので
上記のコードMathf.FloorToIntをつかった数式に変えてみました。
結果は変わらずでした。
私としては、数式が原因だと考えておりますが、
どう改善すればいいか分からない状態です。

改善策となるヒント、その他、原因となるコードがありましたら
ご教授の程、よろしくお願い申し上げます。

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

Unity 2017.4.2

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+1

IndexOutOfRangeException: Array index is out of range.

配列のサイズが外れている、というエラーです
まず、
Images の生成、あるいは代入をどこで行ってるんでしょうか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/20 13:41

    ご連絡下さり、ありがとうございます。一度、見直して見ようと思います。
    解決いたしましたら、改めて
    お礼を言わせて頂きます…

    キャンセル

  • 2018/06/20 17:15

    仰る通り、
    スプライトの代入がイメージにできておりませんでした。
    また、resourceの数と、スプライトの配列数があっていなかった
    ということがわかり、改善した結果
    きちんと動作しました。

    この度は、的確なご指摘、本当にありがとうございまいた。

    キャンセル

checkベストアンサー

0

まず、インスペクタから正しくImagesを設定しているかどうか確認してください。
10個設定していないとエラーとなります。


また、SetNumberの引数minですが、これが1桁か2桁の場合、
Images[val3].sprite = Sprites[Convert.ToInt32(str.Substring(2, 1))];
この行でエラーが起こります。

string str = string.Format("{0:00}", min);
ここに1桁か2桁の数字を入れた時、出て来るのは2桁の文字列なので、
str.Substring(2, 1)で指定される「3文字目」が存在しません。

string str = string.Format("{0:000}", min);
やるなら多分こうですね。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/20 11:11

    あとバグではないのですが
    Sprites = Resources.LoadAll<Sprite>("SpriteUI/Digital/");
    Sprites = new Sprite[10];
    こうしているので、Spritesの中身は全部nullになり、画像は表示されないです。
    デバッグ用だと思いますが一応確認ということで。

    キャンセル

  • 2018/06/20 13:44

    ご丁寧に解説まで添えて頂き、
    ありがとうございます。

    初歩的なご質問で申し訳ないのですが、スプライトは10個、イメージは4つ分(この場合は05:00とするつもりです。)で、各桁をイメージで表示するつもりでいたのですが、それだとエラーになるということでしょうか?

    キャンセル

  • 2018/06/20 14:17

    SetNumber(seconds_1, 4, 9, 9);
    呼び出し側が↑で
    void SetNumber(int min,int val1,int val2 ,int val3) {
    定義が↑ということは
    Images[4].sprite = 〜
    Images[9].sprite = 〜
    Images[9].sprite = 〜
    こうなりますので、このままだとImagesは10個必要ですね。
    (呼び出し側の数字設定が意図と合ってないように思います)

    キャンセル

  • 2018/06/20 17:12

    ご回答いただき、ありがとうございます。
    私がやりたかったこと、と間違えて引数を渡してたみたいです・・・
    ご指摘ありがとうございます。

    あと、resourceフォルダの中身が
    宣言した配列数を超えていたのと、
    経過時間の数式がやはり間違っていたようです。

    ご指摘いただいた箇所と、
    訂正しなおした結果、うまく改善しました。
    お時間いただいて、申し訳ないです・・・。
    本当にありがとうございました。

    キャンセル

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

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

関連した質問

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

  • Unity

    3803questions

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

  • Unity2D

    829questions