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

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

相关文章
|
10月前
|
供应链 搜索推荐 数据挖掘
探秘京东 API 接口的神奇应用场景
京东API如同数字钥匙,助力商家实现商品、库存、订单等多平台高效同步,提升效率超80%。支持物流实时追踪,增强用户满意度;赋能精准营销与数据分析,决策准确率提升20%以上,全面优化电商运营。
|
11月前
|
人工智能 运维 监控
阿里云 API 聚合实战:破解接口碎片化难题,3 类场景方案让业务响应提速 60%
API聚合破解接口碎片化困局,助力开发者降本增效。通过统一中间层整合微服务、第三方接口与AI模型,实现调用次数减少60%、响应提速70%。阿里云实测:APISIX+函数计算+ARMS监控组合,支撑百万级并发,故障定位效率提升90%。
806 0
|
11月前
|
数据采集 缓存 API
小红书笔记详情 API 实战指南:从开发对接、场景落地到收益挖掘(附避坑技巧)
本文详解小红书笔记详情API的开发对接、实战场景与收益模式,涵盖注册避坑、签名生成、数据解析全流程,并分享品牌营销、内容创作、SAAS工具等落地应用,助力开发者高效掘金“种草经济”。
小红书笔记详情 API 实战指南:从开发对接、场景落地到收益挖掘(附避坑技巧)
|
11月前
|
移动开发 安全 小程序
淘宝/天猫:使用支付宝API实现多场景支付,覆盖用户偏好
本文详解如何通过支付宝API在淘宝、天猫等平台实现多场景支付,覆盖APP、PC、H5及小程序,结合用户偏好动态配置分期、快捷支付等功能,提升转化率与体验。内容涵盖API核心功能、技术示例(Python)、安全实践与性能优化,确保开发高效可靠。
1130 3
监控 安全 API
1040 0
|
11月前
|
数据采集 缓存 API
1688 API 实战指南:搞定批发场景的 3 大核心难题(附签名代码与避坑清单)
本文深入解析了1688 API 在批发场景下的三大核心难题及解决方案,涵盖签名机制、商品数据处理与订单同步等高频问题,提供可复用代码与避坑清单,助你高效对接1688平台。
|
12月前
|
供应链 搜索推荐 API
苏宁易购 API 接口:开启苏宁易购全场景零售数据融合新时代
苏宁易购凭借先进的API技术,推动全场景零售数据融合,实现线上线下无缝连接。通过标准化接口,高效整合销售、用户与供应链数据,提升运营效率与消费体验。微服务架构与实时数据处理技术支撑高并发、弹性扩展,赋能开发者共建智慧零售生态。API不仅助力企业降本增效,更为消费者带来智能化、个性化服务,引领零售业迈入数据驱动新时代。
|
存储 搜索推荐 安全
几个常用的电商API接口及其应用场景
电商平台依赖商品、订单、支付、客户、营销及数据分析六大API,实现商品管理、订单追踪、安全支付、用户个性化服务及精准营销等功能,全面支撑电商高效运营与业务拓展,推动行业智能化发展。
|
缓存 监控 API
电商 API 场景中,电商平台将核心完整诊断、分析和优化过程
某头部电商平台通过分阶段性能优化,将核心 API 的 QPS 从 100 提升至 1000。优化涵盖架构、应用、代码和运维四层,包括引入 API 网关、数据库分库分表、多级缓存、异步化改造、序列化优化、容器化弹性伸缩等关键手段,并结合 Jaeger、Prometheus、wrk 等工具进行性能诊断与监控。最终平均响应时间下降 4.7 倍,错误率降低 15 倍,资源使用率显著下降,系统稳定性与吞吐能力大幅提升。
|
人工智能 搜索推荐 算法
电商API的五大应用场景:解锁增长新机遇
电子商务中,API作为提升效率与创新服务的核心工具,连接支付、物流、用户管理等系统。本文探讨电商API五大应用场景:支付集成确保高效交易,物流优化降低成本,用户个性化管理增强忠诚度,智能推荐驱动转化,数据分析支持决策。结合实际案例与关键指标,展示API如何助力企业降低成本、提升转化率并解锁新增长点,成为电商增长的核心引擎。