【问题标题】:Dictionary not read when using GetComponent<>() in Unity在 Unity 中使用 GetComponent<>() 时未读取字典
【发布时间】: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


【解决方案1】:

一种可能的解决方案是使用静态:

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 });
    }
}

在其他脚本中使用tiles30之后,就这样调用字典

TileDB.tiles30

【讨论】:

    猜你喜欢
    • 2016-09-06
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多