我今年开始学习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;
}
}
答案 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");
}
}
希望这有帮助。