У меня есть три сценария внутри 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
}
}