En este momento estás viendo El índice estaba fuera de los límites de la matriz.  matriz 3D [duplicate]

 – Unity

El índice estaba fuera de los límites de la matriz. matriz 3D [duplicate] – Unity

El índice estaba fuera de los límites de la matriz. matriz 3D [duplicate]

– UnityAssets3Free

hola , soy josel luis y en esta ocasion os traigo
esta nueva pregunta

Esta pregunta ya tiene respuestas aquí: ¿Qué es una excepción IndexOutOfRangeException/ArgumentOutOfRangeException y cómo la soluciono? (5 respuestas) Cerrado el año pasado.

IndexOutOfRangeException: el índice estaba fuera de los límites de la matriz. (administrado a contenedor administrado) System.Object.ElementAddr_4(object,int,int,int) Camera_s.Start() (en Activos/scripts/Camera_s.cs:19)

Script Move.cs:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Move : MonoBehaviour

    public Block scr;
    public Camera_s cam;

    public Transform my_block;
    private int[,,] grid;
    void Start()
    
        my_block = gameObject.transform.parent;
        scr = my_block.GetComponent<Block>();
        cam = GameObject.Find("Main Camera").GetComponent<Camera_s>();
        grid = cam.Grid;
    

    void OnMouseDown()
        if (scr.IsActive)
            if (gameObject.transform.name == "left")
                my_block.position -= new Vector3(cam.Jump_Size, 0f);
            
            else if (gameObject.transform.name == "right")
                my_block.position += new Vector3(cam.Jump_Size, 0f);
            
            else if (gameObject.transform.name == "up")
                my_block.position += new Vector3(0f, cam.Jump_Size);
            
            else if (gameObject.transform.name == "down")
                my_block.position -= new Vector3(0f, cam.Jump_Size);
            
        
    

    void Update()
    
        
    

Script Block.cs:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Block : MonoBehaviour

    public bool IsActive = false;

    public Camera_s Camera_Script;

    public int Id;
    public int[] coords;
    public int color;
    private int[,,] grid;

    void Start()
    
        Camera_Script = GameObject.Find("Main Camera").GetComponent<Camera_s>();
        Id = Camera_Script.Block_max + 1;
        Camera_Script.Block_max += 1;
        grid = Camera_Script.Grid;
        grid[coords[0], coords[1], 0] = 1;
        grid[coords[0], coords[1], 0] = color;
    

    void OnMouseDown()
        IsActive = true;
        Camera_Script.Active = Id;
        Debug.Log("Active");
    

    // Update is called once per frame
    void Update()
    
        if (Camera_Script.Active != Id)
            IsActive = false;
        
    

Script Camera_s.cs:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Camera_s : MonoBehaviour

    public int Active = -1;
    public int Block_max = -1;


    public float Jump_Size;
    public int[] Grid_Size;
    public int[,,] Grid;
    void Start()
    
        Grid = new int[Grid_Size[1], Grid_Size[0], 2];
        for (int i = 0;i < 3;i++)
            for (int j = 0;j< 5;j++)
                Grid[j, i, 0] = 0;
                Grid[j, i, 1] = 0;
            
        
    

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

Entiendo que algo anda mal con mi for, pero no sé cómo solucionarlo.

Parte principal del código donde me equivoqué:

for (int i = 0;i < 3;i++)
            for (int j = 0;i < 5;j++)
                Grid[j, i, 0] = 0;
                Grid[j, i, 1] = 0;
            
        

Datos ingresados ​​por Unity Editor:

Salto_Tamaño = 3f; Grade_Size = [5, 3]

¡Gracias!

1 respuesta 1

Si lo que ingresa es en realidad Grid_Size = [5, 3], esto significa que sus dos primeras dimensiones están invertidas. Puede arreglar eso, pero no debe exponer los tamaños si algo más que un par de valores arroja errores.

Grid = new int[Grid_Size[0], Grid_Size[1], 2];
for (int i = 0;i < Grid.GetLength(1);i++)
    for (int j = 0;j< Grid.GetLength(0);j++)
        Grid[j, i, 0] = 0;
        Grid[j, i, 1] = 0;
    

Daría como resultado las mismas dimensiones de matriz que antes si invierte la entrada, pero aún usa el mismo orden de acceso que antes. La forma exacta en que haga esto depende de lo que quiera hacer con la matriz, por supuesto.

Además, sería prudente verificar la entrada para obtener los valores correctos, en Bloque está indexando la Cuadrícula con la entrada del editor (coords) nuevamente. Recomiendo asegurarse de que la entrada esté dentro de los límites esperados de la matriz

nota: si aun no se resuelve tu pregunta por favor dejar un comentario y pronto lo podremos de nuevo , muchas gracias

sin mas,espero que te halla servido

Deja una respuesta