问题描述
第一次使用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));
}
}
}