Application.LoadLevel

本文关键字:LoadLevel Application | 更新日期: 2023-09-27 18:21:58

我正试图通过与标记为Complete的对象的碰撞来切换游戏级别。

这是我的代码:

using UnityEngine;
using System.Collections;
public class GameManager : MonoBehaviour {
    public int currentLevel = 0;
    void OncollisionEnter(Collision other)
    {
        if (other.transform.tag == "Complete") {
            Application.LoadLevel (currentLevel + 1);
            currentLevel + 1;
        }
    }
}

没有错误,但它根本不起作用。有人能帮我解决问题吗?事实上,我在构建设置中确实有级别。

Application.LoadLevel

试试这个。如果它不起作用,显示更多的代码(在另一个对象上);

using UnityEngine;
using System.Collections;
public class GameManager : MonoBehaviour {
    public int currentLevel = 0;
    void OnCollisionEnter(Collision other)
    {
        if (other.transform.tag == "Complete") {
            currentLevel++; //first change level number
            Application.LoadLevel (currentLevel); //then load
        }
    }
}

请尝试使用此选项,因为转换并没有确切的标记,但具有标记的是gameObject本身。此外,使用.CompareTag()比使用equals运算符进行比较更有效。

if(other.CompareTag("Complete")){
your code here
}

当您加载另一个级别时,您会在场景中加载带有另一个脚本和gameObjects的另一个场景。因此,您在场景0中,并尝试加载场景1,在加载了场景1之后,您处于新场景中。我假设这个脚本也在级别1中,但currentLevel变量将为零,因为它是一个新脚本。

因此,您有一些选择,首先尝试在场景加载(我不建议)之间保持此脚本的有效性,或者保存currentLevel的值并在其他场景中读取该值

因此,让我们列出脚本中可能出现的一些错误:

1:OncollisionEnter应为OncollisionEnter;

2:这种行为需要附加在你的游戏对象上,该对象将与标记为"完成"的对象碰撞(我的意思是,如果它附加到你场景中的某个对象GameManager,并且你希望当你的玩家是同一场景中的另一个游戏对象并且不是GameManager的父对象时,这将不起作用。你需要OnCollisionEnter作为你的游戏对象与标记为"完成"的对象发生碰撞的行为)。

3:即使第一次进入1级是有效的,当你处于1级时,它也会持续重置为1级,因为场景之间的切换会破坏和重建每个游戏对象,如果你不隐含地告诉Unity不要在Awake()或GameManager的Start()方法中调用DontDestoyOnLoad()。

4:即使你把它放在两个场景中,如果你在改变场景时不在每个场景的检查器中调整currentLevel,它将始终为0,并尝试始终加载场景1;

5:您的Application.LoadLevel()应该处于LateUpdate或某种状态,以确保在尝试加载新场景之前,帧中的每个并发处理都将完成。Unity可以完美地处理这个问题,但你可以明智地使用它来避免一些问题。因此,设置一个布尔值或其他指示碰撞并希望加载另一个场景的值,并在主战利品过程的最后调用真正的LoadLevel。。。