【问题标题】:How to load a scene based on the name of the script's parent gameObject?如何根据脚本的父游戏对象的名称加载场景?
【发布时间】:2021-08-18 12:30:30
【问题描述】:

我正在尝试统一创建一个关卡加载器系统,它将根据您按下的按钮加载关卡。我现在的代码是非常不必要的,因为我必须为每个单独的按钮创建一个 IEnumerator 和一个 StartCoroutine 函数。

这是我目前的代码:

    public void LoadLevel1()
    {
        StartCoroutine(Level1());
    }

    IEnumerator Level1()
    {
        transition.SetTrigger("Start");

        yield return new WaitForSeconds(2);

        SceneManager.LoadScene("Level 1");
    }

每个关卡的这个过程变得非常烦人和重复,因为 10 个关卡已经占用了 150 多行杂乱的代码。

我尝试通过使用按钮名称加载场景来优化这一点。

例如在加载级别 1 的按钮上,按钮的名称称为“级别 1”,所以逻辑上我会调用“gameObject.name”并取按钮的名称“级别 1”并加载场景“1 级”。

Visual Studio 对此没有问题,但是当我尝试运行以下代码时:

    public void LoadLevel()
    {
        StartCoroutine(GoToLevel());
    }

    IEnumerator GoToLevel()
    {
        transition.SetTrigger("Start");

        yield return new WaitForSeconds(2);

        SceneManager.LoadScene(gameObject.name);
    }

但由于某种原因,unity 接受了 gameObject.name 并说:“哦,你想要你父母的名字”并尝试加载场景“LoadLevel”。这是不存在的,因为它应该加载“1 级”。我不知道为什么会这样。任何想法将不胜感激。

【问题讨论】:

  • 加载游戏的按钮是静态的(例如标准的 10 个按钮)还是动态加载?

标签: c# unity3d


【解决方案1】:

gameObject.name 从您添加脚本的游戏对象中获取值。您必须通过 btn 的 gameobject.name 并且它会正常工作。或者,您可以使用 int 在函数中添加一个参数并像这样传递级别的索引:

public void LoadLevel(int i)
{
    StartCoroutine(GoToLevel(i));
}

IEnumerator GoToLevel(int i)
{
    transition.SetTrigger("Start");

    yield return new WaitForSeconds(2);

    SceneManager.LoadScene("Level" + i);
}

从 btn 调用此 LoadLevel 函数并将级别的编号作为参数传递给检查器,然后你就可以开始了。并确保将场景名称保留为 Level1、Level2 ....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多