如何检查Unity3D中是否加载了级别

时间:2015-03-23 05:37:12

标签: c# unity3d

我今年开始学习C#和Unity3D,但我遇到了一个问题。我正在加载一个新级别,并且在级别加载之前初始化了玩家对象。

我想我只需要在初始化对象之前检查是否加载了关卡。我不知道我是否可以使用LoadLevelAsync。我正在使用Unity3D个人版。

我目前的代码:

MasterClient.cs

void Update(){
    if(SceneUpdateRequired)
    {
        Application.LoadLevel(SceneUpdateID);
        if (Application.isLoadingLevel == false)
        {              
            SceneUpdateRequired = false;
            SceneUpdateCompleted = true;
        }
    }
}

void CharacterLoginUpdate(){
    if (SceneUpdateCompleted == true)
    { 
        GameObject networkPlayerObj = (GameObject)Instantiate(NPlayerObj, PlayerLoginUpdatePosition, PlayerLoginUpdateRotation);
        NPlayer networkPlayer = networkPlayerObj.GetComponent<NPlayer>();
        networkPlayer.UpdatePlayerInstantiateCompleted(PlayerLoginUpdateNetworkID, PlayerLoginUpdateHP, PlayerLoginUpdateClass, PlayerLoginUpdateLevel, PlayerLoginUpdateName, PlayerLoginUpdatePosition);
        PlayerLoginUpdateRequired = false;
    }
 }

1 个答案:

答案 0 :(得分:3)

您的代码存在的问题是您在更新中的加载级别,如果您不使用布尔值控制任务,则最终会遇到大问题。 您的更新代码应如下所示

 void Update(){
    if(SceneUpdateRequired)
    {
        Application.LoadLevel(SceneUpdateID);
        SceneUpdateRequired = false;        
    }
    if (Application.isLoadingLevel == false)
    {              
        SceneUpdateRequired = false;
        SceneUpdateCompleted = true;
    }
 }

这样,场景代码只会在你请求它时尝试加载级别,而不是每次都在更新循环中,因为加载级别很重。

另一件事是,如果您需要使用,可能会遇到一个问题   SceneUpdateRequired,SceneUpdateCompleted 变量在其他地方

if (Application.isLoadingLevel == false)
{              
    SceneUpdateRequired = false;
    SceneUpdateCompleted = true;
}

在更新循环中的上述部分将在每次加载级别时重置变量。为了防止这种情况,你必须引入另一个布尔标志来阻止每次更新。因此,如果您想阻止每个帧的更新,您的代码最终会看起来像这样

void Update() {
    if(SceneUpdateRequired){
        Application.LoadLevel(SceneUpdateID);
        SceneUpdateRequired = false;
    }
    if (Application.isLoadingLevel == false && StartCheckingLoadLevel){ 
        SceneUpdateRequired = false;
        SceneUpdateCompleted = true;
        StartCheckingLoadLevel = false;
    }
}

void StartLoad() {
    SceneUpdateRequired = true;
    SceneUpdateCompleted = false; 
    StartCheckingLoadLevel = true;
}

void CharacterLoginUpdate(){
    if (SceneUpdateCompleted == true) {
        Debug.Log("Do Something after load");
    } else {
        Debug.Log("Scene not yet loaded");
    }
}

希望这有帮助。