我在GameObjects内部有三个脚本,结构如下:
GameObjectA
└ Script1
GameObjectB
└ Script2
└ Script3
Script3
有一个我需要在中回忆的字典Script2
:
public void SomeMethod()
{
Dictionary<string, int> someDictionary;
someDictionary = gameObject.GetComponent<Script3>().myDictionary;
//other stuff
}
如果我Script2
在其Start
方法中调用该方法,它将被正常调用,并且可以毫无问题地读取Dictionary。
然而,代码执行过程中,我有时会需要调用Script2
来自Script1
:
Public GameObject GameObjectB;
GameObjectB.GetComponent<Script2>().SomeMethod();
而且,如果这样做的话,在执行过程中单步执行代码时,我会发现字典SomeDictionary
为空。
这正常吗?如果需要,我可以提供更多信息或真实的摘要,我发现这种行为很奇怪,而且我不知道它是否正常运行。
编辑:下面的真实代码。
脚本1 ,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();
}
}
脚本2 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
}
}
一个可能的解决方案是使用static:
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句