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

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

ただいまの
回答率

89.25%

このようなエラーが表示されます

受付中

回答 2

投稿 編集

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

発生しているエラー

ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
System.ThrowHelper.ThrowArgumentOutOfRangeException (System.ExceptionArgument argument, System.ExceptionResource resource) (at <437ba245d8404784b9fbab9b439ac908>:0)
System.ThrowHelper.ThrowArgumentOutOfRangeException () (at <437ba245d8404784b9fbab9b439ac908>:0)
System.Collections.Generic.List`1[T].get_Item (System.Int32 index) (at <437ba245d8404784b9fbab9b439ac908>:0)
LogInManager+<>c.<Update>b__15_2 (System.Collections.Generic.List`1[T] objList, NCMB.NCMBException e) (at Assets/Scripts/LogInManager.cs:125)
NCMB.NCMBQuery`1+<>c__DisplayClass44_0[T].<Find>b__0 (System.Int32 statusCode, System.String responseData, NCMB.NCMBException error) (at Assets/NCMB/Script/NCMBQuery.cs:588)
NCMB.Internal.NCMBConnection+<SendRequest>d__37.MoveNext () (at Assets/NCMB/Script/NCMBConnection.cs:458)
UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at <480508088aee40cab70818ff164a29d5>:0)

該当のコード

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using UnityEngine.SceneManagement;
using NCMB;

public class LogInManager : MonoBehaviour
{

    private GameObject guiTextLogIn;   // ログインテキスト
    private GameObject guiTextSignUp;  // 新規登録テキスト

    // ログイン画面のときtrue, 新規登録画面のときfalse
    private bool isLogIn;

    // ボタンが押されると対応する変数がtrueになる
    private bool logInButton;
    private bool signUpMenuButton;
    private bool signUpButton;
    private bool backButton;

    // テキストボックスで入力される文字列を格納
    public string id;
    public string pw;

    public string username { get; set; }

    void Start()
    {

        FindObjectOfType<UserAuth>().logOut();

        // ゲームオブジェクトを検索し取得する
        guiTextLogIn = GameObject.Find("GUITextLogIn");
        guiTextSignUp = GameObject.Find("GUITextSignUp");

        isLogIn = true;
        guiTextSignUp.SetActive(false);
        guiTextLogIn.SetActive(true);

    }

    void OnGUI()
    {

        // ログイン画面
        if (isLogIn)
        {

            drawLogInMenu();

            // ログインボタンが押されたら
            if (logInButton)
                FindObjectOfType<UserAuth>().logIn(id, pw);

            // 新規登録画面に移動するボタンが押されたら
            if (signUpMenuButton)
                isLogIn = false;
        }

        // 新規登録画面
        else
        {

            drawSignUpMenu();

            // 新規登録ボタンが押されたら
            if (signUpButton)
                FindObjectOfType<UserAuth>().signUp(id, pw);

            // 戻るボタンが押されたら
            if (backButton)
                isLogIn = true;
        }
    }

    void Update()
    {
        // currentPlayerを毎フレーム監視し、ログインが完了したら
        if (FindObjectOfType<UserAuth>().currentPlayer() != null)
        {
            string username = FindObjectOfType<UserAuth>().currentPlayer();

            NCMBQuery<NCMBObject> query_p = new NCMBQuery<NCMBObject>("Player");
            query_p.WhereEqualTo("Name", username);
            query_p.FindAsync((List<NCMBObject> objList, NCMBException e) =>
            {
                //検索成功したら  
                if (e == null)
                {
           //ここでエラーが発生しています
                    PlayerPrefs.SetInt("PlayerATK", System.Convert.ToInt32(objList[0]["ATK"]));
                    PlayerPrefs.SetInt("PlayerLevel", System.Convert.ToInt32(objList[0]["Level"]));
                    PlayerPrefs.SetInt("PlayerMAX_HP", System.Convert.ToInt32(objList[0]["MAX_HP"]));
                    PlayerPrefs.SetInt("NowEXP", System.Convert.ToInt32(objList[0]["NowEXP"]));
                    PlayerPrefs.SetInt("needEXP", System.Convert.ToInt32(objList[0]["needEXP"]));
                    PlayerPrefs.SetInt("Tensei_Num", System.Convert.ToInt32(objList[0]["Tensei_Num"]));
                    PlayerPrefs.SetInt("Star", System.Convert.ToInt32(objList[0]["Star"]));
                    PlayerPrefs.Save();
                }
            });

            NCMBQuery<NCMBObject> query_w = new NCMBQuery<NCMBObject>("Weapon");
            query_w.WhereEqualTo("Name", username);
            query_w.FindAsync((List<NCMBObject> objList, NCMBException e) =>
            {

                //検索成功したら  
                if (e == null)
                {  
                    //ここでエラーが発生します        
                    PlayerPrefs.SetInt("WeaponLevel", System.Convert.ToInt32(objList[0]["Level"]));
                    PlayerPrefs.SetInt("WeaponATK", System.Convert.ToInt32(objList[0]["ATK"]));
                    PlayerPrefs.Save();
                }
            });

            NCMBQuery<NCMBObject> query_b = new NCMBQuery<NCMBObject>("Boss");
            query_b.WhereEqualTo("Name", username);
            query_b.FindAsync((List<NCMBObject> objList, NCMBException e) =>
            {

                //検索成功したら  
                if (e == null)
                {
                    //ここでエラーが発生します
                    PlayerPrefs.SetInt("BossSummon", System.Convert.ToInt32(objList[0]["Summon"]));
                    PlayerPrefs.SetInt("SlimeLevel", System.Convert.ToInt32(objList[0]["Slime"]));
                    PlayerPrefs.SetInt("RabbitLevel", System.Convert.ToInt32(objList[0]["Rabbit"]));
                    PlayerPrefs.SetInt("CerberusLevel", System.Convert.ToInt32(objList[0]["Cerberus"]));
                    PlayerPrefs.SetInt("SkeletonLevel", System.Convert.ToInt32(objList[0]["Skeleton"]));
                    PlayerPrefs.SetInt("ShujinLevel", System.Convert.ToInt32(objList[0]["Shujin"]));
                    PlayerPrefs.SetInt("SquirrelLevel", System.Convert.ToInt32(objList[0]["Squirrel"]));
                    PlayerPrefs.SetInt("Ice_golemLevel", System.Convert.ToInt32(objList[0]["Ice_golem"]));
                    PlayerPrefs.SetInt("DeathmouseLevel", System.Convert.ToInt32(objList[0]["Deathmouse"]));
                    PlayerPrefs.SetInt("DyurahanLevel", System.Convert.ToInt32(objList[0]["Dyurahan"]));
                    PlayerPrefs.SetInt("SakyubasuLevel", System.Convert.ToInt32(objList[0]["Sakyubasu"]));
                    PlayerPrefs.SetInt("NyaruratohotepuLevel", System.Convert.ToInt32(objList[0]["Nyaruratohotepu"]));
                    PlayerPrefs.SetInt("ShivaLevel", System.Convert.ToInt32(objList[0]["Shiva"]));
                    PlayerPrefs.SetInt("MarozorondLevel", System.Convert.ToInt32(objList[0]["Marozorond"]));
                    PlayerPrefs.SetInt("ShachoLevel", System.Convert.ToInt32(objList[0]["Shacho"]));
                    PlayerPrefs.SetInt("CatLevel", System.Convert.ToInt32(objList[0]["Cat"]));
                    PlayerPrefs.SetInt("BirdLevel", System.Convert.ToInt32(objList[0]["Bird"]));
                    PlayerPrefs.SetInt("Rabbit2Level", System.Convert.ToInt32(objList[0]["Rabbit2"]));
                    PlayerPrefs.SetInt("AmabieLevel", System.Convert.ToInt32(objList[0]["Amabie"]));
                    PlayerPrefs.SetInt("NekuroLevel", System.Convert.ToInt32(objList[0]["Nekuro"]));
                    PlayerPrefs.SetInt("ArcangelLevel", System.Convert.ToInt32(objList[0]["Arcangel"]));
                    PlayerPrefs.SetInt("HekantokeiruLevel", System.Convert.ToInt32(objList[0]["Hekantokeiru"]));
                    PlayerPrefs.Save();
                }
            });

            SceneManager.LoadScene("HomeScene");
        }
    }

    private void drawLogInMenu()
    {
        // テキスト切り替え
        guiTextSignUp.SetActive(false);
        guiTextLogIn.SetActive(true);

        // テキストボックスの設置と入力値の取得
        GUI.skin.textField.fontSize = 20;
        int txtW = 150, txtH = 40;
        id = GUI.TextField(new Rect(Screen.width * 1 / 2, Screen.height * 1 / 3 - txtH * 1 / 2, txtW, txtH), id);
        pw = GUI.PasswordField(new Rect(Screen.width * 1 / 2, Screen.height * 1 / 2 - txtH * 1 / 2, txtW, txtH), pw, '*');

        // ボタンの設置
        int btnW = 180, btnH = 50;
        GUI.skin.button.fontSize = 20;
        logInButton = GUI.Button(new Rect(Screen.width * 1 / 4 - btnW * 1 / 2, Screen.height * 3 / 4 - btnH * 1 / 2, btnW, btnH), "Log In");
        signUpMenuButton = GUI.Button(new Rect(Screen.width * 3 / 4 - btnW * 1 / 2, Screen.height * 3 / 4 - btnH * 1 / 2, btnW, btnH), "Sign Up");

    }

    private void drawSignUpMenu()
    {
        // テキスト切り替え
        guiTextLogIn.SetActive(false);
        guiTextSignUp.SetActive(true);

        // テキストボックスの設置と入力値の取得
        int txtW = 150, txtH = 35;
        GUI.skin.textField.fontSize = 20;
        id = GUI.TextField(new Rect(Screen.width * 1 / 2, Screen.height * 1 / 4 - txtH * 1 / 2, txtW, txtH), id);
        pw = GUI.PasswordField(new Rect(Screen.width * 1 / 2, Screen.height * 2 / 5 - txtH * 1 / 2, txtW, txtH), pw, '*');


        // ボタンの設置
        int btnW = 180, btnH = 50;
        GUI.skin.button.fontSize = 20;
        signUpButton = GUI.Button(new Rect(Screen.width * 1 / 4 - btnW * 1 / 2, Screen.height * 3 / 4 - btnH * 1 / 2, btnW, btnH), "Sign Up");
        backButton = GUI.Button(new Rect(Screen.width * 3 / 4 - btnW * 1 / 2, Screen.height * 3 / 4 - btnH * 1 / 2, btnW, btnH), "Back");
    }

}

色々と調べてみたのですが、原因がわかりませんでした。

コードのエラーが発生する部分にコメントを打ちました

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • soi013

    2020/05/22 23:16

    そのエラーが発生する最小限のソースコードまで切りつめてください。
    エラーが発生した行をコメントなどで示してください。

    キャンセル

  • Zuishin

    2020/05/22 23:31

    List<T> で IndexOutOfRange が出てるんで、objList[0] が原因だと思います。該当箇所ありすぎだし objList がどうなってるのかわからないので、それ以上はわかりません。処理を追ってください。

    キャンセル

  • m.ts10806

    2020/05/23 05:42

    >そこは何ともなさそうで
    それは確認してみないとこちらでは判断できません。
    自身で解決できない場合、その人が断言できるほど「違う」情報かどうかは判断できないはずです。

    キャンセル

回答 2

+2

NCMBのドキュメントらしきものを読んでみましたが
FindAsync時に検索しても該当データがない場合にエラーが発生するのかが曖昧ですね。

ソースを読んでみても「該当データなし」は成功扱いのようです。

したがって、

//検索成功かつ該当データありの場合  
if (e == null && objList.Count > 0)

のように該当データがあることを確認するとよいかと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+2

Listの部分を間違えていることが多いというのを見つけたのですが、そこは何ともなさそうで、ほかに調べて該当しそうな項目が見当たらなかったです。

asm さんの回答が直接的な解決策なので、別の方向で回答します。

この質問の根本的な問題は 調べるワードが不適切なこと だと思っています。
今回の場合は、以下のように行動すると自己解決ができたと思います。

  1. ArgumentOutOfRangeExceptionが発生したという事象をエラーメッセージを読むことで確認する
  2. ArgumentOutOfRangeExceptionがなぜ発生するかを知るために「C# ArgumentOutOfRangeException」と検索する
  3. ArgumentOutOfRangeExceptionが何行目で発生したかをエラーメッセージを見て確認する
  4. ArgumentOutOfRangeExceptionを引き起こしている原因となる処理を修正し、ArgumentOutOfRangeExceptionが発生しないようにする

上記の行動をより抽象的に書くと下記になります。

  1. エラーをエラーメッセージを読むことで確認する
  2. エラーの原因を知るためにキーワードを抜粋して検索エンジンで検索する
  3. エラーがどこで発生しているかをエラーメッセージを見て確認する
  4. エラーの原因となる処理を修正し、取り除く

今回のような「エラーの原因が分からない」という旨の質問をしたくなったときは上のプロセスを実践してください。
※上記のような下調べを他のユーザーに行わせた場合、質問ではなく作業依頼と受け取られる可能性があります

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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