【问题标题】:Getting Scene Names at Runtime/Creating Scenes at runtime在运行时获取场景名称/在运行时创建场景
【发布时间】:2016-03-17 20:45:12
【问题描述】:

我想在 Unity 5.3.xxx 版本中构建 RTS 游戏。 我想要一个下拉菜单来选择我想要玩的关卡。 我不想对其进行硬编码,那么如何在运行时获取场景名称? 这是在游戏中添加新关卡所必需的。 那就是下一个问题了。如何创建新场景并将它们添加到运行时构建路径以在游戏中使用它们?例如在地图编辑器中?

我不能使用 UnityEditor 通过 foreeach 浏览所有场景,因为它是一个编辑器类,而这些不会进入最终构建..

谢谢

【问题讨论】:

  • 您不会创建新场景并在运行时添加它们。您使用 Unity 的 UI 和按钮单击事件,然后您可以在按钮单击回调函数中执行 scenemanager.loadscene。查看 UI 教程。

标签: c# unity3d scene


【解决方案1】:

从 Unity 5.x 开始,有更多强大的选项可用于在运行时管理场景。

获取当前场景名称:

SceneManager.GetActiveScene().name


获取添加到 SceneManager 的所有场景名称的列表:

var numScenes = SceneManager.sceneCount;
List<string> sceneNames = new List<string>(numScenes);

for (int i=0; i < numScenes; ++i)
{
   sceneNames.Add(StageManager.GetSceneAt(i).name);
}

在运行时创建新场景:

var newScene = SceneManager.CreateScene(string sceneName);

在运行时向构建路径添加新场景:

我很确定这是不可能的,也不推荐。

如果您想在游戏中使用关卡编辑器的功能,请考虑编写自己的序列化场景的方法,以便在运行时将其反序列化为空场景。


另见:

【讨论】:

  • 非常感谢。你能更清楚地解释最后一点吗?我想稍后有一个关卡编辑器,或者只是一个文件夹来放置地图(场景?),游戏必须使用它,但据我所知,场景必须在构建路径中。
  • 这里还有一个问题:你使用 GetSceneAt(i).name 你的意思是 SceneManager.GetSceneAt(i).name 吗?如是。它只有一个场景,我的主要场景不是其他场景。索引大于 1 超出范围。但是场景被添加到构建路径中?为什么不将它们添加到场景管理器中?
【解决方案2】:

正如here on the Unity forums 解释的那样,SceneManager.GetSceneAt 仅适用于当前活动场景。

目前,您需要使用变通方法在运行时获取构建中的所有场景,使用EditorBuildSettings.scenes。没错,这仅在编辑期间可用,但您只需确保在构建之前将它们缓存到运行时资产或组件。

还请注意,documentation example for EditorBuildSettings.scenes 实际上为您提供了一个非常强大的脚本来抓取所有场景,包括那些尚未添加到构建设置中的场景(甚至可以通过单击按钮将它们添加到构建设置中)!您可以使用它将所有场景路径保存到组件或ScriptableObject,然后在运行时可用。

【讨论】:

    【解决方案3】:

    我知道,但它与我的搜索匹配,所以我发布了我的解决方案。现在使用 SceneUtility.GetScenePathByBuildIndex

    在运行时这似乎是可能的

    我做了什么:

    var sceneNames = new List<string>();
    var regex = new Regex(@"([^/]*/)*([\w\d\-]*)\.unity");
    for (int i = 0; i < SceneManager.sceneCountInBuildSettings; i++)
    {
        var path = SceneUtility.GetScenePathByBuildIndex(i);
        var name = regex.Replace(path, "$2");
        sceneNames.Add(name);
    }
    

    Regex Credit

    【讨论】:

    • 您也可以使用 System.IO.Path.GetFileNameWithoutExtension 代替正则表达式。
    猜你喜欢
    • 1970-01-01
    • 2016-10-04
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    相关资源
    最近更新 更多