Словарь не читается при использовании GetComponent <> () в Unity - PullRequest
1 голос
/ 23 апреля 2020

У меня есть три сценария внутри GameObjects, структурированные следующим образом:

GameObjectA
└ Script1
GameObjectB
└ Script2
└ Script3

Script3 имеет словарь, который мне нужно вспомнить в Script2:

public void SomeMethod()
{
    Dictionary<string, int> someDictionary;
    someDictionary = gameObject.GetComponent<Script3>().myDictionary;
    //other stuff
}

Если я позвоню метод в Script2 в его методе Start, он вызывается и нормально, и Словарь читается без проблем.

Однако во время выполнения кода мне иногда нужно вызывать Script2 из Script1:

Public GameObject GameObjectB;
GameObjectB.GetComponent<Script2>().SomeMethod();

и, если я сделаю это, при пошаговом выполнении кода во время выполнения, я понимаю, что Словарь SomeDictionary пуст.

Это нормально? Я могу дать больше информации или настоящие фрагменты, если это необходимо, я считаю это поведение странным и не знаю, действует ли оно регулярно.

Редактировать: реальные коды ниже.

Script1, PauseMenu:

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

public class PauseMenu : MonoBehaviour
{
    public GameObject tracksMenuContent;

    public void TracksList()
    {
        tracksMenuContent.GetComponent<PopulateGrid>().Populate();
    }
}

Script2, PopulateGrid:

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

public class PopulateGrid : MonoBehaviour
{
    [SerializeField] private TileDescr _prefab;
    public static PopulateGrid instance;

    private void Awake()
    {
        Populate();
    }

    public void Populate()
    {
        Dictionary<string, TileSupply> tilesList;
        tilesList = gameObject.GetComponent<TileDB>().tiles30;
        TileDescr newObj; // Create GameObject instance

        foreach (KeyValuePair<string, TileSupply> tile in tilesList)
        {
            Sprite tileSprite = Resources.Load<Sprite>("Tiles/tile" + tile.Key);
            string tileText = "[" + tile.Key + "] " + tile.Value.available + "/" + tile.Value.total;

            newObj = Instantiate(_prefab, transform);
            newObj.Initialize(tileSprite, tileText);
        }
    }
}

Script3, TileDB:

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

public class TileSupply
{
    public int available;
    public int total;
}

public class TileDB : MonoBehaviour
{
    public Dictionary<string, TileSupply> tiles30 = new Dictionary<string, TileSupply>();

    public void Awake()
    {
        tiles30.Add("1", new TileSupply() { available = 1, total = 1 });
        //many more elements, all pretty similar
    }
}

1 Ответ

1 голос
/ 23 апреля 2020

возможное решение состоит в том, чтобы использовать stati c:

public class TileDB : MonoBehaviour
{
    public static Dictionary<string, TileSupply> tiles30 = new Dictionary<string, TileSupply>();

    public void Awake()
    {
        tiles30.Add("1", new TileSupply() { available = 1, total = 1 });
    }
}

после того, как использовать tile30 в другом скрипте, просто вызовите словарь как этот

TileDB.tiles30
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...