

Unityを使っています。初心者です。実行をすると、コンソールエラーで

> IndexOutOfRangeException array index is out of range

と

> The referenced script on this Behaviour is missing

と出ました。

エラーを調べてみましたが、よくわからなかったので どなたか解決策を教えてください。

[code]

    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);
            }
        }
    }
    
[/code]


CC BY-SA 3.0
2015-03-14T01:19:37.047
7898
2015-03-14T12:59:19.903
2015-03-14T12:42:41.803
3313
8269
question
c# unity3d
IndexOutOfRangeException array index is out of range


配列の添字が0より小さいか、もしくは配列の要素数以上であると発生する例外です。


CC BY-SA 3.0
2015-03-14T01:47:12.853
7899
2015-03-14T01:47:12.853
5750
7898
answer


> IndexOutofRangeException array index is out of range

はこのあたり [Unity Error List](http://www.atsuhiro-me.net/unity/dev/unity-error-
list) ※ページ中程

> The referenced script on this Behaviour is missing

はこのあたり [[Unity] Behaviour is missing! の原因オブジェクトの見つけ方](http://blog.be-
style.jpn.com/article/91794043.html)  
が参考になると思います。

最初は大変だと思いますが、どんな開発でもエラー調査は必須スキルですので、  
がんばってください（IDEの見方、使い方を学ぶのも有効だと思います）。

----- 追記 -----
[code]

    //走り処理
    animIndex++;
    if(animIndex <= run.Length){
        animIndex = 0;
    }
    //走りスプライト画像に切り替え
    GetComponent<SpriteRenderer>().sprite=run[animIndex];  
    
[/code]

手元で確認できないので詳細は分かりませんが、これだと`animIndex`が`run`の要素数を超えることは普通にありえますね。

この実装だとこんなイメージです。

[code]

    animeIndex = 6;
    // run.Length = 5
    run = new[] {1, 2, 3, 4, 5}; 
    
    // 6は５より大きいので分岐には入らない
    if (6 <= 5) {
        animIndex = 0;
    }
    // runのindexは最大4なので「IndexOutofRangeException」
    var sprite = run[6];
    
[/code]


CC BY-SA 3.0
2015-03-14T02:06:36.377
7900
2015-03-14T12:59:19.903
2015-03-14T12:59:19.903
3516
3516
7898
answer