Как сослаться на объект из одного скрипта в другом

192
21 июля 2019, 02:30

Есть скрипт 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;
    }
Answer 1

Все, вопрос решен, если у кого-то возникнет такая проблема, то решение заключалось в том, что список надо было сделать статичным, и после этого обращаться к нему не через GetComponent, а напрямую по названию класса, т.е Grid.minedTiles[i].GetComponent.ExplodeExternal();

READ ALSO
c# оптимальный вариант базы данных

c# оптимальный вариант базы данных

нужно вести базу клиентовпрограмму для запросов напишу сам

198
ContextMenu не скрывается при выполнении команды

ContextMenu не скрывается при выполнении команды

Использую библиотеку HardcodetWpf

155
Обновлять свойство Button при изменении Text у TextBox

Обновлять свойство Button при изменении Text у TextBox

В окне кнопка, у которой свойство IsEnabled должно быть true только если Text в TextBox соответствует паттерну RegexА в других случаях false

159
Получения url страницы в ajax запросе

Получения url страницы в ajax запросе

Есть ajax запросРезультатом которого если всё хорошо будет срабатывать

168