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