Unity在加载场景时是否有构造函数?

时间:2016-02-29 05:22:56

标签: unity3d

我想在加载场景时使用正确的数据填充UI,而不是占位符。

当我调用“LoadSceneAsync”时,第一个被调用的对象是什么,所以我可以用正确的数据填充UI标签?我知道有一个场景GameObject,但我不确定这是否符合我的需要。

我正在寻找某种构造函数,在加载新的场景对象时调用;插入我的设置功能。<​​/ p>

3 个答案:

答案 0 :(得分:2)

你说

  

事实上,我确实使用了“onlevelwasloaded”,但当我调用它时,UI元素可能不存在,准备好了,导致错误

这将是Unity中令人难以置信的严重错误! :)

你可能在某处混淆了AwakeStart吗?

考虑到这一点的一种方法是,在您致电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);
    }
}

多亏了这一点,您现在可以确切地知道一段代码准备好了。