我想在加载场景时使用正确的数据填充UI,而不是占位符。
当我调用“LoadSceneAsync”时,第一个被调用的对象是什么,所以我可以用正确的数据填充UI标签?我知道有一个场景GameObject,但我不确定这是否符合我的需要。
我正在寻找某种构造函数,在加载新的场景对象时调用;插入我的设置功能。</ p>
答案 0 :(得分:2)
你说
事实上,我确实使用了“onlevelwasloaded”,但当我调用它时,UI元素可能不存在,准备好了,导致错误
这将是Unity中令人难以置信的严重错误! :)
Awake
和Start
吗?考虑到这一点的一种方法是,在您致电Start
后,您知道所有Awake
已经投放。
当我调用“LoadSceneAsync”时,第一个被调用的对象是什么,所以我可以用正确的数据填充UI标签
您仍然在同一帧内 。
一旦看到LoadSceneAsync
,您就可以绝对放心,Awake
d。
或者一旦你使用Start
,你可以绝对放心,一切都是Awake
d。
1)可能是你的一些UI元素(或其他)你在Start中做了什么,你应该在Awake中做什么?
2)如果(出于某种原因)你想“等到下一帧”,也许只是在开发期间 - 那么就这样做,等待一帧。你会看到一个闪烁,但如果这是你想要做的(出于某种原因)那样做。
3)请注意,如果你的意思是想要上网来获取某些东西,当然你必须等待帧(使用Update / coroutine),直到信息从网上回来,显然。 (怎么可能呢?)
请注意,在实践中,应该在任何地方都使用UnityEngine.Events.UnityEvent
。
答案 1 :(得分:1)
答案 2 :(得分:0)
依靠Unity的内部功能并不总是可行的。特别是在处理RESTApi时(这是你在这里处理的某种方式)。
你不能假设一个物体在另一个物体之前准备就绪,除非你控制它。
添加使用Awake的Controller脚本。在Awake中,调用您需要的所有方法,并在主要准备就绪时使用一些回调来生成二级代码。
public class MyController: MonoBehaviour{
private ServerRequestController serverCtrl = null;
private UIController uiCtrl = null;
private void Awake(){
serverCtrl = this.gameObject.AddComponent<ServerRequestController>();
uiCtrl =this.gameObject.AddComponent<UIController>();
serverCtrl.GetData(uiCtrl.SetUI);
}
}
public class UIController:MonoBehaviour{
public void SetUI(Data data)
{
SetTopImage(data.topImage);
SetBottomImage(data.bottomImage);
// And so on
}
}
public class ServerRequestController:MonoBehaviour{
public void GetData(Action onCompletion){
// This may be a coroutine if you fetch from server
Data data = GetDataFromSomewhere();
// At this point, your data is ready
onCompletion(data);
}
}
多亏了这一点,您现在可以确切地知道一段代码准备好了。