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

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

ただいまの
回答率

90.47%

  • C#

    7471questions

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

index out of range

受付中

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 1,501

user1041

score 26

using UnityEngine; 
using System.Collections; 

public class Player_NonPhysics2D:MonoBehaviour { 
//宣言 
// Inspectorで調整するためのプロパティ 
    public float speed =15.0f; 
    public Sprite[] run; 
    public Sprite[] jump; 

    // 内部で扱う変数 

    float jumpVy; 
    int animIndex; 
    bool goalCheck; 

    //メッセージに対応したコード 
    //コンポーネントの実行開始 

    void Start(){ 
        //初期化 
        jumpVy = 0.0f; 
        animIndex = 0; 
        goalCheck = false; 
    } 

    //プレイヤーキャラのコリジョンに他のゲームオブジェクトのコリジョンが入った 
    void OnCollisionEnter2D(Collision2D col){ 
        //ゴールチェック 
        if(col.gameObject.name == "Stage_Gate"){ 
            //goal 
            goalCheck =true; 
            return; 
        } 
        //ゴール以外だったらステージを再読み込みしてリセット 
        Application.LoadLevel(Application.loadedLevelName); 
    } 

    //フレームの描き換え 
    void Update() { 
        if(goalCheck) { //ゴールチェック 
            return; 
            //ゴールだったら処理停止 
         
        } 

        //現在のプレイヤーキャラの高さを計算 
        float height= transform.position.y + jumpVy; 
        //接地チェック(高さが0なら接地している) 
        if(height <= 0.0f) { 
            //ジャンプ初期化 
            height = 0.0f; 
            jumpVy  = 0.0f; 
            //ジャンプチェック 
            if(Input.GetButtonDown("Fire1")){ 
                //ジャンプ処理 
                jumpVy = +1.3f; 
                //ジャンプスプライト画像に切り替え.. 
                GetComponent<SpriteRenderer>().sprite = jump[0]; 
            } 
            else{ 
                //走り処理 
                animIndex  ++; 
                if(animIndex >= run.Length){ 
                    animIndex = 0; 
                } 
                //走りスプライト画像に切り替え 
                GetComponent<SpriteRenderer>().sprite = run[animIndex]; 
            } 
        } 
        else{ 
            //ジャンプ後の降下中 
            jumpVy -= 0.2f; 
            //jumpVy -= 6.0f * Time.deltaTime; //正しい処理はこちら 
        } 

        //プレイヤーキャラの移動(座標設定) 
        transform.position = new Vector3 ( 
            transform.position.x+speed*Time.deltaTime,height,0.0f); 
        //下記のように相対移動で記述してもいい 
        //transfor.Translate(speed*Time.deltaTime,jumpVy,0.0f); 
        //transform.position += new Vector3(speed * Time.deltaTime,jumpVy,0.0f); 
        //ただし次の書き方では雨後置かないので注意 
        //transform.position.Set( 
        // transform.position.x+speed*Time.deltatime,height,0,0f); 
        //カメラの移動(座標の相対移動) 
        GameObject goCam = GameObject.Find ("Main Camera"); 
        goCam.transform.Translate (speed * Time.deltaTime, 0.0f,0.0f); 
    } 
    // UnitGuIの表示 
     void OnGUI(){ 
        //デバックテキスト 
        GUI.TextField(new Rect(10,10,300,60), 
                      "[Unity 2d Sample 3-1 A]\nマウスの左ボタンを押すと加速\nはなすとジャンプ"); 
        //リセットボタン 
        if(GUI.Button (new Rect(10,80,100,20),"リセット")) { 
            Application.LoadLevel (Application.loadedLevelName); 
        } 
    } 


上記はunity2dのスクリプトです 再生を押したところ以下のエラーがでました。 
IndexOutOfRangeException: Array index is out of range. 
Player_NonPhysics2D.Update () (at Assets/Scenes/Player_NonPhysics2D.cs:68) 

array index  is out of rangeのエラーを調べたところ配列の最大値を超えているという 
ことだとわかりましたが、いったいどこが間違っているのかがわかりません。 
間違っている文章を指摘くださるか、正常に戻すためのスクリプトがあれば教えてください。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

0

68行目の直前にanimIndexがrunの長さ以上なら0に戻る処理が入っているので
IndexOutOfRangeException が発生するのはrun[0]が範囲外、
つまり runの長さが0(空の配列)で1つもオブジェクトを持てない場合です。
runへ代入している箇所をチェックしてみましょう。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/03/21 16:13

    これ 一応unity本のサンプルコードをそのままコピペしたんですけど、本が間違っているということでしょうか。。。 run[animIndex] →run[0] ですか?

    キャンセル

  • 2015/03/21 22:59

    すみません、新規に書いてしまいました。
    ↓が返答です。

    キャンセル

0

いえ、run[animIndex] は問題ないと思います。
IndexOutOfRangeExceptionが発生するならrunはどこかで代入されているはず(そうしないとNullPointerExceptionになるので)ですが、
あげていただいたコードには代入されている箇所がありません。
クラスの外でrunに代入しているようなのでそこを調べてみるのがいいと思います。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

このプログラムをちゃんと動作させるためにはInspector上から、run配列とjump配列の配列数を決めてやって、その配列数の数だけ、Spriteをアタッチする必要があります。おそらくそれを行っていないのでエラーが発生していると思うのですが。

そのままコピペしてrun配列とjump配列にSpriteを入れてあげたところ、問題なく動作しました。
イメージ説明

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/03/23 06:17

    inspectorは確認してみましたが、jumpとrunのElementにsprite?の画像も入っていました。 質問ばかりで恐縮ですが、いまのところjump配列は正常でrun配列にはspriteが入っていないということでよろしいでしょうか。とすれば、runにspriteを入れるためにはコードを追加する必要があると思うのですが、どう書けばよろしいでしょうか

    キャンセル

  • 2015/03/23 06:39

    unityは特性上、変数がpublicであればGUIであるInspector上からリソースを編集可能です。おそらく最初に解答した方が言っている通り、エラーが発生している原因はrun配列が初期化されていない事による、配列の範囲外参照だと思います。unityはInspector上からでも配列数を決定する事ができ、その際にrun配列の長さをを1以上にしていれば、配列内にspriteもとい、画像をセットしなくていても、エラーは発生しないはずです。キャラクタの画像が画面に映し出されなくなるだけなので。こちら側でコピペで正常に作動している以上、コードの書き足しは必要ないと思います。すみませんが、もし良ければ編集画面を見せてもらってもよろしいでしょうか?

    キャンセル

  • 2015/03/23 07:06

    http://gyazo.com/a00e653ebe839b5d4303679734e73072
    http://gyazo.com/b5ef14bec7c86fa5e985f4a5bcd87571

    よろしくお願いします。

    キャンセル

  • 2015/03/23 07:28

    ありがとうございます。
    見たところ、特に間違ってそうなところは全く見当たりません。Inspector上も問題はなさそうです。
    エラーコードを見たところ、68行目から、73行目に変わっていたのですが、上のスクリプトに何か付け足したものとかはありませんか?
    良ければ、最新のコードを拝見したいのですが。

    キャンセル

  • 2015/03/23 07:32

    少しだけいじったので行がずれたのだと思います。

    using UnityEngine;
    using System.Collections;

    public class Player_NonPhysics2D:MonoBehaviour {
    //宣言
    // Inspectorで調整するためのプロパティ
    public float speed =15.0f;
    public Sprite[] run;
    public Sprite[] jump;

    // 内部で扱う変数

    float jumpVy;
    int animIndex;
    bool goalCheck;



    //メッセージに対応したコード
    //コンポーネントの実行開始

    void Start(){
    //初期化
    jumpVy = 0.0f;
    animIndex = 0;
    goalCheck = false;

    }


    //プレイヤーキャラのコリジョンに他のゲームオブジェクトのコリジョンが入った
    void OnCollisionEnter2D(Collision2D col){
    //ゴールチェック
    if(col.gameObject.name == "Stage_Gate"){
    //goal
    goalCheck =true;
    return;
    }
    //ゴール以外だったらステージを再読み込みしてリセット
    Application.LoadLevel(Application.loadedLevelName);
    }

    //フレームの描き換え
    void Update() {
    if(goalCheck) { //ゴールチェック
    return;
    //ゴールだったら処理停止

    }

    //現在のプレイヤーキャラの高さを計算
    float height= transform.position.y + jumpVy;
    //接地チェック(高さが0なら接地している)
    if(height <= 0.0f) {
    //ジャンプ初期化
    height = 0.0f;
    jumpVy = 0.0f;
    //ジャンプチェック
    if(Input.GetButtonDown("Fire1")){
    //ジャンプ処理
    jumpVy = +1.3f;
    //ジャンプスプライト画像に切り替え..
    GetComponent<SpriteRenderer>().sprite = jump[0];
    GetComponent<SpriteRenderer>().sprite = run[0];
    }
    else{
    //走り処理
    animIndex ++;
    if(animIndex >= run.Length){
    animIndex = 1;
    }
    //走りスプライト画像に切り替え
    GetComponent<SpriteRenderer>().sprite = run[animIndex];
    }
    }
    else{
    //ジャンプ後の降下中
    jumpVy -= 0.2f;
    //jumpVy -= 6.0f * Time.deltaTime; //正しい処理はこちら
    }

    //プレイヤーキャラの移動(座標設定)
    transform.position = new Vector3 (
    transform.position.x+speed*Time.deltaTime,height,0.0f);
    //下記のように相対移動で記述してもいい
    //transfor.Translate(speed*Time.deltaTime,jumpVy,0.0f);
    //transform.position += new Vector3(speed * Time.deltaTime,jumpVy,0.0f);
    //ただし次の書き方では雨後置かないので注意
    //transform.position.Set(
    // transform.position.x+speed*Time.deltatime,height,0,0f);
    //カメラの移動(座標の相対移動)
    GameObject goCam = GameObject.Find ("Main Camera");
    goCam.transform.Translate (speed * Time.deltaTime, 0.0f,0.0f);
    }
    // UnitGuIの表示
    void OnGUI(){
    //デバックテキスト
    GUI.TextField(new Rect(10,10,300,60),
    "[Unity 2d Sample 3-1 A]\nマウスの左ボタンを押すと加速\nはなすとジャンプ");
    //リセットボタン
    if(GUI.Button (new Rect(10,80,100,20),"リセット")) {
    Application.LoadLevel (Application.loadedLevelName);
    }
    }
    }

    キャンセル

  • 2015/03/23 07:38

    問題ありませんね・・・。
    今も動作させるとエラーコードは新たに出されますか?
    Consoleのデバッグコードリストは自分で消さない限り、エラーコードは残ります。
    そういうオチではないとは思いますが・・・。

    キャンセル

  • 2015/03/23 07:49

    すみません。
    問題ないとか言っていましたが、
    70行目の animIndex = 1;は
    animIndex = 0;にしたほうが良いと思います。
    だからといって、これが現状のエラー回復に繋がる訳ではありませんが・・・。

    キャンセル

  • 2015/03/23 07:50

    エラーがでたときに maincamera等が黄色くなるので確認してみたら、scriptがあったので
    それをremoveconponentで消してみたらエラーが消えました。が、再生すると消したはずのscriptがまた復活してしまいます。。

    キャンセル

0

黄色の三角の <The referecned script months Behaviour is missing!> が消えないという事でよろしでしょうか?
これは、はじめ、オブジェクトにアタッチされていたスクリプトが、開発者によりファイルごと削除されたなどの理由により中身が空になってしまったScriptComponentが存在していますという警告だったと思います。
この警告は作成するゲームに影響を及ぼす事は特にないと思います。
もし消したい場合は以下のサイトを参考にすれば良いと思います。
http://blog.be-style.jpn.com/article/91794043.html

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/03/23 08:09

    maincameraのinspectorにあるスクリプトをremoveconponentすれば 一時的にエラーが解消されて再生を押すとアニメーションが正常に動きますが、もう一度再生を押すと削除したscriptがまた出てくるのでエラーになる。ということです

    キャンセル

  • 2015/03/23 08:10

    すみません、消したコンポーネントが復活するという事でしたか。
    unityではプログラムからでもコンポーネントを追加する事が出来ます。( AddComponent<T>()等 )
    おそらくどこかのスクリプトにこれがあり、MainCameraに対してコンポーネントを追加していたかと。

    また、他に考えられる原因としては、

    ・ゲームの起動中にコンポーネントを削除した
    ゲームは停止させると、ゲームの起動前の状態に戻ってしまいます。なので、コンポーネントを削除するときには一度停止してから行った方が良いと思います。

    ・Sceneを更新していない
    unityは1つの画面がどうやって構成されているかをScene単位で保存しています。シーンをまたいでゲームを作成する場合、きちんとSceneをセーブしておかないと、うまく動作しません。

    ・Prefabを更新していない
    unityはオブジェクトをprefabという単位でProject内に持っています。
    これをInstantiate()でゲーム内に出す事が出来ます。prefab化しているオブジェクトは青色で名前が表示されます。ヒエラルキー上のオブジェクトをいじっても、Applyをしてやらない限り、project上のprefabは更新されません。

    キャンセル

  • 2015/03/23 08:27

    おっしゃるとおりsceneセーブしていなかったことが原因でした。The referecned script months Behaviour is missingは問題ないのであれば無視します。 エラーも消えましたが、
    ただ、ゲーム内の boxと接触するとアニメーションがそこから進まなくなってしまいまいます。 http://gyazo.com/9d14b5a6a44befcdb64b7f7e70a107fa  
    画像でいうとクリックした箇所です。 これはinspectorの問題かと思うのですが、どうでしょうか。。

    キャンセル

  • 2015/03/23 08:37

    これはプログラム上の問題だと思います。
    スクリプトを見ると、毎フレーム行われる関数であるUpdate()の最初に、
    if(goalCheck) { //ゴールチェック
    return;
    //ゴールだったら処理停止

    }
    とあります。これだと一度ゴールしてフラグがたってしまうと、return;文でこの先のスクリプトが実行される事なく終わってしまいます。この先に、run配列画像を切り替える処理があるので、ゴールするとアニメーションが切り替わらないのだと思います。

    ゴールしても動いてよいと言うなら、上の文を消せば良いと思います。

    キャンセル

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

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

関連した質問

  • 解決済

    時間制限をつけたいのですが、

    C#スクリプトを使って、3Dのゲーム制作をしています。この数字画像を使って15:00という文字を表示しつつ15:00~00:00となっていくようにして、00:00となったら「タイム

  • 解決済

    Unity 突進型の敵キャラAI

    Unityでプレイヤーに突っ込んでくるタイプの敵を作りたいのですが 今のスクリプトだと読み込んだ時にプレイヤーが居た位置に移動した後 その場で止まってしまいます。 突進を回避して

  • 受付中

    Unityで、Lerpというものを使いたいのですがなにが間違っているのかわかりません。

    2つの操作キャラクターに一つのカメラをつける。 これをspeceボタンを押すことで切り替えるようにしたい。その時、Lerpというものを使いいきなり画面が変わるのではなく徐々に追従す

  • 解決済

    Unity2DでのRPGのマップシステム

    Unity2DでRPGツクールみたいなマップシステム(キャラクターの最小移動単位がマップチップの大きさと等しく、二次元配列でマップの状態を表現できるようなもの)をつくろうとして、下

  • 受付中

    unity 3Dキャラ視点での移動方法

    現在unityちゃんを使って移動をしています。 3Dゲーム開発講座を使っているのですが、 移動方法がワールド座標での方向固定でカメラをキャラに追尾させても 歩く方向はやは

  • 解決済

    Unityで球体を正確に12度ずつ一方向に回転させたい

    Unity5(3D)で球体を12度ずつ回転させる処理をしたいのですが上手くいきません。 ボタンがクリックされると下記の関数が実行されるのですが、この書き方だと一回転後に丁度3

  • 解決済

    untiy terrain機能で作った壁が登れてしまう

    unityで、terrainで作った壁を登れなくしたいです。 キャラクターがジャンプ中に移動方向に進むと、terrainで作った急斜面な山や壁を登れてしまいます。 滑り落ち

  • 解決済

    unityのカメラ制御について

    unityのcamera制御について Maincameraに下記をアタッチしました。 frはunitychanの子オブジェクトでunitychanの後ろローカル座標(0.0

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

  • C#

    7471questions

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