Есть скрипт Tile в котором находится метод ExplodeExternal() и есть ещё один скрипт Grid в котором хранится List minedTiles. Как обратиться к членам minedTiles из скрипта Tile и вызвать к каждому из них метод ExplodeExternal? Компилятор при запуске жалуется на NullReferenceException: Object reference not set to an instance of an object.
Все лишнее удалено. Собственно проблема в методе Explode(), но как исправить не знаю. Необходимо сослаться на каждого члена списка minedTiles(), но что-то не работает.
Сами скрипты: Grid
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Grid : MonoBehaviour
{
public GameObject TilePrefab; // Переменная для Префаба клетки
public List<GameObject> minedTiles;
public void CreateTiles()
{
allTiles = new List<GameObject>();
float coordinateX = 0.0f;
float coordinateY = 0.0f;
int tilesCreated = 0;
for (int i = 0; i < gridSize; i++)
{
for (int j = 0; j < gridSize; j++)
{
GameObject newTile = Instantiate(TilePrefab, new Vector2(transform.position.x + coordinateX, transform.position.y + coordinateY), transform.rotation);
coordinateX += distanceBetweenTiles;
allTiles.Add(newTile);
newTile.GetComponentInChildren<Tile>().ID = tilesCreated;
tilesCreated++;
}
coordinateX = 0.0f;
coordinateY += distanceBetweenTiles;
}
AssignedMines();
}
public void AssignedMines()
{
dontMinedTiles = new List<GameObject>();
minedTiles = new List<GameObject>();
dontMinedTiles.AddRange(allTiles);
for (int assignedMines = 0; assignedMines < numberOfMines; assignedMines++)
{
GameObject currentTile = dontMinedTiles[Random.Range(0, dontMinedTiles.Count)];
minedTiles.Add(currentTile);
dontMinedTiles.Remove(currentTile);
currentTile.GetComponentInChildren<Tile>().isMined = true;
}
}
и Tile
public class Tile : MonoBehaviour
{
public bool isMined = false;
public TextMesh counter;
public Color32 zeroColor;
public GameObject zeroTile;
public GameObject bomb;
public GameObject selector;
public List<GameObject> adjacentTiles;
public int adjacentMines;
void UncoverTile()
{
if (!isMined)
{
state = "uncovered";
counter.GetComponent<Renderer>().enabled = true;
zeroTile.GetComponent<SpriteRenderer>().color = zeroColor;
if (adjacentMines == 0)
UncoveredAdjacentTiles();
}
else
Explode();
}
void Explode()
{
state = "detonated";
GetComponent<Tile>().bomb.GetComponent<Renderer>().enabled = true;
GetComponent<Tile>().counter.GetComponent<Renderer>().enabled = false;
for (int i = 0; i < GetComponent<Grid>().minedTiles.Count; i++)
{
var temp = GetComponent<Grid>().minedTiles[i].GetComponent<Tile>();
temp.ExplodeExternal();
}
}
public void ExplodeExternal()
{
state = "detonated";
GetComponent<Tile>().bomb.GetComponent<Renderer>().enabled = true;
}
Все, вопрос решен, если у кого-то возникнет такая проблема, то решение заключалось в том, что список надо было сделать статичным, и после этого обращаться к нему не через GetComponent, а напрямую по названию класса, т.е Grid.minedTiles[i].GetComponent.ExplodeExternal();
Виртуальный выделенный сервер (VDS) становится отличным выбором
В окне кнопка, у которой свойство IsEnabled должно быть true только если Text в TextBox соответствует паттерну RegexА в других случаях false
Есть ajax запросРезультатом которого если всё хорошо будет срабатывать