使用GetComponent

时间:2015-09-17 08:51:09

标签: unity3d

在名为MenuScript的脚本中,当按下开始按钮时,我有以下方法用于加载带有咔嗒声的新场景:

/// Play a sound and change the scene.
public void LoadLevel(string sceneName)
{
    audioSource.Play();
    StartCoroutine(LoadSceneAsync(sceneName));
}


/// Change the scene (load the level).
private IEnumerator LoadSceneAsync(string levelName)
{ 
    yield return new WaitForSeconds(0.2f);
    Application.LoadLevel(levelName);
}


/// Start the simulation once the Start Button is clicked.
public void startSimulation()
{                   
    LoadLevel("mainScene");         
}

我这样做而不只是使用Application.LoadLevel("mainScene");

当然,我保留附加了此脚本的游戏对象在Awake中被销毁:

void Awake()
{           
    DontDestroyOnLoad(GameObject.Find("Menu Manager"));
}

现在......在这个已加载的新场景中,我想使用上面MenuScript脚本中存在的相同函数来加载又一个场景。我写了以下内容:

void Start()
{
    GameObject menuManager = GameObject.Find("Menu Manager");
    MenuScript menuScript = menuManager.GetComponent<MenuScript>();
}

void Update()
{
    if (Input.GetKeyDown(KeyCode.Z))
        menuScript.LoadLevel("finalScene");
}

但是,menuScript.LoadLevel部分以红色突出显示。我究竟做错了什么?这是使用这些方法的好方法吗?有人可以帮我理解我所缺少的东西,或者是否有更好的方法可以做到这一点?谢谢

1 个答案:

答案 0 :(得分:1)

您正尝试从另一个函数访问menuScript变量,它是Start()函数的局部变量。要解决此问题,请将menuScript变量声明为类变量。这是代码示例:

private MenuScript menuScript;

void Start()
{
    GameObject menuManager = GameObject.Find("Menu Manager");
    menuScript = menuManager.GetComponent<MenuScript>();
}

void Update()
{
    if (Input.GetKeyDown(KeyCode.Z))
        menuScript.LoadLevel("finalScene");
}