【发布时间】:2020-04-23 06:22:50
【问题描述】:
我在 GameObjects 中有三个脚本,结构如下:
GameObjectA
└ Script1
GameObjectB
└ Script2
└ Script3
Script3 有一个我需要在Script2 中调用的字典:
public void SomeMethod()
{
Dictionary<string, int> someDictionary;
someDictionary = gameObject.GetComponent<Script3>().myDictionary;
//other stuff
}
如果我在其Start 方法中调用Script2 中的方法,它会被正常调用,并且可以正常读取字典。
但是,在代码执行期间,我有时需要从Script1 调用Script2:
Public GameObject GameObjectB;
GameObjectB.GetComponent<Script2>().SomeMethod();
如果我这样做了,在执行期间单步执行代码时,我会意识到 Dictionary SomeDictionary 是空的。
这正常吗?如果需要,我可以提供更多信息或真实的 sn-ps,我觉得这种行为很奇怪,我不知道它是否经常发生。
编辑:下面的真实代码。
脚本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);
}
}
}
脚本3,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
}
}
【问题讨论】:
-
是的,请添加真实代码,这样会更容易重现,也许我们可以在实际代码中发现您的 sn-ps 中看不到的问题
-
我刚刚做到了!您可能会认出 Script2...无论如何,如果您需要更多详细信息,请尽管询问!谢谢!
-
实际上
Dictionary是一个引用类型......你实际上可以分配一次,将引用存储在类字段中。然后从哪个类中添加一个元素,它将更新到您引用此字典的每个脚本..然后您不必重复使用GetComponent^^ 但是没有..我看不出有什么明显的原因其他时候 dict 应该是空的......你确定你引用了正确的组件吗? -
这很有趣,谢谢!我才刚刚开始,我真的不知道如何使用 C# 语言的精妙之处。我会看看如何相应地修改我的代码。
-
@derHugo 我没有看到第二部分!这很奇怪,因为当它从
Awake方法中的第二个脚本调用时没有问题,但是当我从外部这样做时,它会给我带来问题。
标签: c# dictionary unity3d