如何检查脚本是否已加载数据并在另一个脚本Unity中渲染一次

问题描述

第一次使用StackOverflow时,我的英语很不好,所以我对这个问题是愚蠢的或措辞不佳表示歉意。 我有一个脚本,该脚本可以加载可脚本编写的对象数据,并基于该脚本创建一个包含其他对象的列表。

public class AntContainer : MonoBehavIoUr
{
    private List<AntType> _types;

    public IEnumerable<AntType> Types { get => _types; } 
    private void Start()
    {
        _types = new List<AntType>();
        List<AntTypeData> data = Resources.LoadAll<AntTypeData>("ScriptableObjects/AntTypes").ToList();
        data = data.OrderBy((x) => x.Price).ToList();

        foreach (var type in data)
        {
            _types.Add(new AntType(type));
        }
    }
}

然后我需要在UI脚本中绘制此列表

public class AntShopPanel : MonoBehavIoUr
{
    [Serializefield] private GameObject _antShopElementTemplate;
    [Serializefield] private Transform _parent;
    [Serializefield] private AntNursery _nursery;
    [Serializefield] private AntContainer _container;

    private void Start()
    {
        if (_container != null)
        {
            foreach (var type in _container.Types)
            {
                GameObject AntButton = Instantiate(_antShopElementTemplate,_parent);
                AntShopElementPresenter presenter = AntButton.GetComponent<AntShopElementPresenter>();
                presenter.Present(type);
                presenter.SetBuyButtonOnClick(() => _nursery.AddEgg(type));
            }
        }
    }
}

如您所见,这两个脚本都在Start方法中执行操作,因此,如果UI脚本较早初始化并且未加载数据,则将没有任何内容可绘制。 如何确保在UI脚本请求数据之前已加载数据?或如何以其他方式解决这个问题?

解决方法

在Unity的 Awake 函数中执行所有初始化步骤是一个很好的经验法则。

将AntContainer.Start()方法更改为Awake()可以确保在开始调用所有Start函数之前,一切都已初始化。

像这样:

public class AntContainer : MonoBehaviour
{
    private List<AntType> _types;

    public IEnumerable<AntType> Types { get => _types; } 
    private void Awake()
    {
        _types = new List<AntType>();
        List<AntTypeData> data = Resources.LoadAll<AntTypeData>("ScriptableObjects/AntTypes").ToList();
        data = data.OrderBy((x) => x.Price).ToList();

        foreach (var type in data)
        {
            _types.Add(new AntType(type));
        }
    }
}