Unity SceneManager场景管理Chinar详解API

简介: 本文提供全流程,中文翻译。 Unity SceneManager场景管理Chinar详解API 助力快速理解 Unity 场景管理的 API 诸多用法 Unity 场景API中文详解 我们在游戏开发中,经常用到关卡切换、场景切换、加载场景等诸多功能性操作 Unity 为我们提供了场景管理类.

Unity 场景API详解


本文提供全图文流程,中文翻译。

Chinar 坚持将简单的生活方式,带给世人!

(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)

Chinar —— 心分享、心创新!

助力快速理解 Unity 场景管理的 API 诸多用法

给新手节省宝贵的时间,避免采坑!


Chinar 教程效果:
1_API_


全文高清图片,点击即可放大观看 (很多人竟然不知道)


1

SceneManager —— 场景管理



我们在游戏开发中,经常用到关卡切换、场景切换、加载场景等诸多功能性操作

Unity 为我们提供了场景管理类,可以很方便的对场景进行各类操作

下边我们就来逐一的看一下,API中的函数具体用法

另附—— 官方API链接

其他

举个例子
1_API_


2

API —— API(创建/获取/加载)



直接给大家贴上中文注释,便于初学者学习

其他易出错的函数, Chinar 也用了简单例子做了说明,避免初学者踩坑!

提示:

其中 0 号场景为: SampleScene

其中 1 号场景为: Chinar
举个例子

using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement;


/// <summary>
/// 场景管理测试类
/// </summary>
public class ChinarSceneManager1 : MonoBehaviour
{
    /// <summary> 
    /// 初始化函数
    /// </summary>
    void Start()
    {
        SceneManager.CreateScene("Chinar");                             //使用给定名称在运行时创建一个空的新场景
        SceneManager.GetActiveScene();                                  //获取当前活动的场景
        SceneManager.GetSceneAt(0);                                     //在SceneManager的已加载场景列表中获取索引处的场景
        SceneManager.GetSceneByBuildIndex(0);                           //从构建Build Setting中索引获取Scene结构
        SceneManager.GetSceneByName("Chinar");                          //搜索给定名称的场景
        SceneManager.GetSceneByPath("Assets/Scenes/SampleScene.unity"); //搜索给定路径的场景
        SceneManager.LoadScene(1);                                      //根据“Build Setting”中索引加载场景
        SceneManager.LoadScene("Chinar");                               //根据“Build Setting”中名称加载场景
        SceneManager.LoadScene(1,        LoadSceneMode.Additive);       //加载场景,加载方式:保留当前场景,附加指定场景
        SceneManager.LoadScene("Chinar", LoadSceneMode.Single);         //加载场景,加载方式:关闭所有当前加载的场景并加载场景
        SceneManager.LoadSceneAsync(1);                                 //根据下标,在后台异步加载场景
        SceneManager.LoadSceneAsync("Chinar");                          //根据名称,在后台异步加载场景
        SceneManager.LoadSceneAsync(1, LoadSceneMode.Additive);         //异步加载,方式:附加
        SceneManager.LoadSceneAsync(1);                                 //异步加载,方式:单一
        SceneManager.UnloadSceneAsync("Chinar");                        //销毁与给定场景关联的所有GameObject,并从SceneManager中移除场景。
    }
}

3

API (Merge) —— 常用API(合并/移动对象/设置活动)



有时我们需要将场景合并

或者将当前场景的游戏对象,移动到其他场景中 / 设置活跃场景

提示:

进行这三类操作,都需要先将目标场景加载后,才可保证函数正确执行

这里为了便于初学者理解,我用了协成加载的方式,来做说明

其中 0 号场景为: SampleScene

其中 1 号场景为: Chinar
举个例子

using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement;


/// <summary>
/// 场景管理测试类
/// </summary>
public class ChinarSceneManager1 : MonoBehaviour
{
    /// <summary> 
    /// 初始化函数
    /// </summary>
    void Start()
    {
        StartCoroutine(MergeMethodEnumerator());           //合并场景
        StartCoroutine(MoveGameObjectToSceneEnumerator()); //移动游戏对象到目标场景
        StartCoroutine(SetActiveSceneEnumerator());        //设置场景为活动场景
    }


    /// <summary>
    /// 合并场景
    /// 必须要保证:要合并的场景被加载后,才可以正确合并
    /// 如果物体名称相同,并不会合并,相互独立
    /// </summary>
    IEnumerator MergeMethodEnumerator()
    {
        yield return SceneManager.LoadSceneAsync(1, LoadSceneMode.Additive);                           //等待场景加载完毕后,再向下执行
        SceneManager.MergeScenes(SceneManager.GetSceneByBuildIndex(1), SceneManager.GetActiveScene()); //源场景 1,目标场景:当前 —— 将源场景合并到目标场景中
    }


    /// <summary>
    /// 移动游戏对象到新场景
    /// 必须要保证:目标场景被加载后,游戏对象才能被正确移动到目标场景中
    /// 如果物体名称相同,并不会合并,相互独立
    /// </summary>
    IEnumerator MoveGameObjectToSceneEnumerator()
    {
        yield return SceneManager.LoadSceneAsync(1, LoadSceneMode.Additive);                                //等待场景加载完毕后,再向下执行
        SceneManager.MoveGameObjectToScene(GameObject.Find("Cube"), SceneManager.GetSceneByName("Chinar")); //将当前场景中的 Cube,移动到目标场景中
        SceneManager.UnloadSceneAsync(SceneManager.GetActiveScene());                                       //卸载掉当前场景
        //如果要加载单个场景,请确保在要移动到新场景的GameObject上使用DontDestroyOnLoad,否则Unity会在加载新场景时删除它。
    }


    /// <summary>
    /// 设置场景为活动场景
    /// 必须要保证:目标场景被加载后,才可以正确设置活动状态
    /// </summary>
    IEnumerator SetActiveSceneEnumerator()
    {
        yield return SceneManager.LoadSceneAsync(1, LoadSceneMode.Additive); //等待场景加载完毕后,再向下执行
        SceneManager.SetActiveScene(SceneManager.GetSceneAt(1));             //设置场景为活动场景
        //print(SceneManager.GetSceneAt(1).IsValid());
    }
}

4

Scene (Events) —— 场景事件



有时我们需要场景记载/卸载/变更时,进行一系列操作

这时我们需要用事件来完成通知

提示:

其中 0 号场景为: SampleScene

其中 1 号场景为: Chinar
举个例子

using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement;


/// <summary>
/// 场景管理测试类
/// </summary>
public class ChinarSceneManager1 : MonoBehaviour
{
    /// <summary> 
    /// 初始化函数
    /// </summary>
    void Start()
    {
        SceneManager.activeSceneChanged += SceneManager_activeSceneChanged; //订阅此事件可在活动场景发生更改时收到通知。
        StartCoroutine(SetActiveSceneEnumerator());                         //活动场景切换时,会收到通知,打印输出"活动场景变更了"
        SceneManager.sceneLoaded += SceneManager_sceneLoaded;               //委托 —— 加载场景时收到通知
        SceneManager.LoadSceneAsync(1);                                     //异步加载,加载方式:单一
        SceneManager.sceneUnloaded += SceneManager_sceneUnloaded;           //委托 —— 卸载Scene时收到通知
    }


    /// <summary>
    /// 设置场景为活动场景
    /// 必须要保证:目标场景被加载后,才可以正确设置活动状态
    /// </summary>
    IEnumerator SetActiveSceneEnumerator()
    {
        yield return SceneManager.LoadSceneAsync(1, LoadSceneMode.Additive); //等待场景加载完毕后,再向下执行
        SceneManager.SetActiveScene(SceneManager.GetSceneAt(1));             //设置场景为活动场景
    }


    /// <summary>
    /// 活动场景变动时被调用
    /// </summary>
    private void SceneManager_activeSceneChanged(Scene arg0, Scene arg1)
    {
        print("活动场景变更了");
    }


    /// <summary>
    /// 场景被加载后,被调用
    /// </summary>
    private void SceneManager_sceneLoaded(Scene arg0, LoadSceneMode arg1)
    {
        print("场景被加载了");
    }


    /// <summary>
    /// 场景被卸载时,被调用
    /// </summary>
    private void SceneManager_sceneUnloaded(Scene arg0)
    {
        print("场景被卸载了");
    }
}

5

Scene —— 场景自身的一些属性



Scene 类自身具备一些属性和字段,便于我们对场景的状态进行了解/操作
提示:

其中 0 号场景为: SampleScene

其中 1 号场景为: Chinar
举个例子

using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement;


/// <summary>
/// 场景管理测试类
/// </summary>
public class ChinarSceneManager1 : MonoBehaviour
{
    /// <summary> 
    /// 初始化函数
    /// </summary>
    void Start()
    {
        print(SceneManager.GetActiveScene().buildIndex);           //返回“Build Setting”中场景的索引。如果场景是通过AssetBundle加载的,则始终返回-1。
        print(SceneManager.GetActiveScene().isDirty);              //如果场景被修改,则返回true。
        print(SceneManager.GetActiveScene().isLoaded);             //如果加载场景,则返回true。
        print(SceneManager.GetActiveScene().name);                 //返回场景的名称。
        print(SceneManager.GetActiveScene().path);                 //返回场景的相对路径。喜欢:“Assets/Scenes/SampleScene.unity”。
        print(SceneManager.GetActiveScene().rootCount);            //返回场景的游戏对象个数
        print(SceneManager.GetActiveScene().GetHashCode());        //返回场景的哈希值
        print(SceneManager.GetActiveScene().GetRootGameObjects()); //返回场景中所有游戏对象,是一个GameObject[] 数组
        foreach (var a in SceneManager.GetActiveScene().GetRootGameObjects())
        {
            print(a.name);
        }
        StartCoroutine(SetActiveSceneEnumerator());  //设置场景为活动场景
        print(SceneManager.GetSceneAt(1).IsValid()); //判断场景是否有效,如果场景未被加载/或是不存在,则场景可能无效
    }


    /// <summary>
    /// 设置场景为活动场景
    /// 必须要保证:目标场景被加载后,才可以正确设置活动状态
    /// </summary>
    IEnumerator SetActiveSceneEnumerator()
    {
        yield return SceneManager.LoadSceneAsync(1, LoadSceneMode.Additive); //等待场景加载完毕后,再向下执行
        SceneManager.SetActiveScene(SceneManager.GetSceneAt(1));             //设置场景为活动场景
    }
}

其他

May Be —— 搞开发,总有一天要做的事!


拥有自己的服务器,无需再找攻略!

Chinar 提供一站式教程,闭眼式创建!

为新手节省宝贵时间,避免采坑!




服务器、建站、备案、网站配置等(服务器相关教程大全)


END

本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究

对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com

对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址

相关文章
|
图形学
Unity 不同Scene场景转换(简)
本文提供了Unity中实现场景转换的基本方法,包括编写传送脚本、创建传送门和玩家对象,并通过触发器实现玩家触碰传送门时切换到另一个场景的功能。
Unity 不同Scene场景转换(简)
|
2月前
|
缓存 监控 API
电商 API 场景中,电商平台将核心完整诊断、分析和优化过程
某头部电商平台通过分阶段性能优化,将核心 API 的 QPS 从 100 提升至 1000。优化涵盖架构、应用、代码和运维四层,包括引入 API 网关、数据库分库分表、多级缓存、异步化改造、序列化优化、容器化弹性伸缩等关键手段,并结合 Jaeger、Prometheus、wrk 等工具进行性能诊断与监控。最终平均响应时间下降 4.7 倍,错误率降低 15 倍,资源使用率显著下降,系统稳定性与吞吐能力大幅提升。
|
1月前
|
存储 搜索推荐 安全
几个常用的电商API接口及其应用场景
电商平台依赖商品、订单、支付、客户、营销及数据分析六大API,实现商品管理、订单追踪、安全支付、用户个性化服务及精准营销等功能,全面支撑电商高效运营与业务拓展,推动行业智能化发展。
|
3月前
|
人工智能 搜索推荐 算法
电商API的五大应用场景:解锁增长新机遇
电子商务中,API作为提升效率与创新服务的核心工具,连接支付、物流、用户管理等系统。本文探讨电商API五大应用场景:支付集成确保高效交易,物流优化降低成本,用户个性化管理增强忠诚度,智能推荐驱动转化,数据分析支持决策。结合实际案例与关键指标,展示API如何助力企业降低成本、提升转化率并解锁新增长点,成为电商增长的核心引擎。
66 0
|
3月前
|
人工智能 JSON 测试技术
AI 驱动 API 研发提效:解析 Apipost 在 API 文档生成场景的全流程能力
随着AI和大模型技术发展,软件开发步入智能化时代。API研发作为核心环节,高效调试与文档编写至关重要。Apipost是国内领先的API协同工具,提供从API设计到性能测试的完整闭环,支持AI驱动的文档生成、Markdown润色及OpenAPI生成等功能,显著提升团队效率。其AI功能可一键补全参数描述、生成示例代码与响应样例,减少重复劳动,助力开发者专注于业务逻辑优化。无论是快速迭代还是大规模接口设计,Apipost都为高效协作提供了强大支持。
157 0
|
5月前
|
安全 API 数据安全/隐私保护
12种API认证全场景解析:从Basic到OAuth2.0,哪个认证最适合你的业务?
在API认证领域,从简单的Key-Value到高级的OAuth2.0和JWT,共有12种主流认证方式。本文详解了每种方式的意义、适用场景及优劣,并通过认证方式矩阵对比常见工具(如Postman、Apifox)的支持情况。此外,还介绍了企业级安全功能,如密钥保险箱、动态令牌和合规审计。选择合适的认证方式不仅能提升安全性,还能大幅提高开发效率。未来,自动化认证矩阵或将成为API调试的核心趋势。
|
6月前
|
供应链 搜索推荐 API
一文读懂:京东、淘宝、拼多多 API 接口,功能大不同,场景各有招
本文深入解析京东、淘宝、拼多多三大电商巨头的API接口特点与差异。京东API以商品管理、订单处理和物流跟踪见长,适合电商平台及零售商;淘宝API功能丰富,涵盖商品查询、订单管理与用户认证,适用多场景电商业务;拼多多API聚焦社交电商,提供拼团、砍价等特色玩法,助力商家提升曝光与销量。开发者和商家需根据自身需求选择合适的API接口,并关注其安全性与稳定性。随着技术进步,这些API将持续优化,推动电商行业蓬勃发展。
|
8月前
|
API 开发者
通义灵码 API 开发文档自动生成场景DEMO
通义灵码API开发文档自动生成场景DEMO展示了通过自定义指令,大模型能快速根据类代码生成Markdown格式的API文档。文档详细描述API的入参、出参,并可生成测试代码等示例,帮助开发者快速创建美观的API文档。
413 1
|
存储 设计模式 监控
运用Unity Profiler定位内存泄漏并实施对象池管理优化内存使用
【7月更文第10天】在Unity游戏开发中,内存管理是至关重要的一个环节。内存泄漏不仅会导致游戏运行缓慢、卡顿,严重时甚至会引发崩溃。Unity Profiler作为一个强大的性能分析工具,能够帮助开发者深入理解应用程序的内存使用情况,从而定位并解决内存泄漏问题。同时,通过实施对象池管理策略,可以显著优化内存使用,提高游戏性能。本文将结合代码示例,详细介绍如何利用Unity Profiler定位内存泄漏,并实施对象池来优化内存使用。
1063 0
|
9月前
|
存储 搜索推荐 安全
介绍几个常用的电商API接口及其应用场景。(一篇文章全清楚)
电商API接口是电商平台高效运营的核心技术支撑,涵盖商品管理、订单管理、支付、客户管理、营销推广和数据分析六大模块。商品管理API实现商品信息的精准上传与动态调整;订单管理API确保订单全流程透明可控;支付API保障交易安全便捷;客户管理API通过数据分析提供个性化服务;营销推广API助力精准营销;数据分析API为决策提供数据支持。各API协同工作,推动电商行业创新发展,构建智能便捷的电商生态。
936 12