首页 > 其他分享 >Unity3D 基础 05 场景加载

Unity3D 基础 05 场景加载

时间:2024-03-17 12:04:38浏览次数:24  
标签:sceneName Unity3D 场景 05 using SceneLoader public 加载

Unity3D 基础系列(第五期)

场景配置

首先,在资源文件夹里创建一个 LoadScene 场景,摆放一些物体,用来做初始场景。

然后创建一个 Stage 文件夹,并创建两个场景 Stage1、Stage2。

两个 Stage 场景也可以简单布置一下,方便区分。

布置场景

接着,打开 Build Settings,把需要加载的场景添加到配置中。

场景打包设置

切换场景

创建一个 SceneLoader 脚本,并在 LoadScene 场景中创建一个空物体,挂载这个脚本。

这里为了方便调用加载场景的方法,简单使用了单例模式,在 Awake 初始化时,把当前脚本实例保存到 instance 变量里,并且设置为 DontDestroyOnLoad,保证这个对象不会因为场景切换而被销毁,其他对象通过 Instance 属性获取到单例。

当前脚本提供一个 LoadScene 方法,传入一个场景名称就可以直接切换场景。

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

public class SceneLoader : MonoBehaviour
{
    // 单例模式
    static SceneLoader instance;
    public static SceneLoader Instance
    {
        get { return instance; }
    }

    void Awake()
    {
        if (instance != null)
        {
            Destroy(gameObject);
        }
        else
        {
            instance = this;
            DontDestroyOnLoad(gameObject);
        }
    }

    public void LoadScene(string sceneName)
    {
        SceneManager.LoadScene(sceneName);
    }
}

接着再创建一个脚本 ChangeScene,挂载到场景中的 3D 物体上,并填写目标场景的名称。

OnMouseDown 方法会在物体被鼠标点击时调用。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ChangeScene : MonoBehaviour
{
    public string sceneName;

    void onm ouseDown()
    {
        SceneLoader.Instance.LoadScene(sceneName);
    }
}

目标场景

回到主场景

场景切换效果:

场景切换效果

场景叠加

目前场景加载是卸载掉原来的场景,加载新的场景,DontDestroyOnLoad 场景一直存在。

并且场景加载是同步的,如果新的场景包含的物体资源太多,加载时间稍慢的话,就会感觉到卡顿。

场景是可以叠加的,也就是同时加载了多个场景,也有异步加载的方式。

下面添加两个方法,用来加载或卸载场景。因为是异步加载,需要使用协程,场景加载完成后可以执行其他操作。

public class SceneLoader : MonoBehaviour
{
    // ...
    
    // 当前加载的场景
    Scene currentScene;
    
    // 加载场景(异步加载,叠加模式)
    public void LoadSceneAdditive(string sceneName)
    {
        StartCoroutine(LoadSceneAsync(sceneName));
    }

    IEnumerator LoadSceneAsync(string sceneName)
    {
        AsyncOperation operation = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);
        yield return operation;
        // 加载完成后,保存当前加载的场景
        currentScene = SceneManager.GetSceneByName(sceneName);
    }

    // 卸载当前已加载的场景
    public void UnloadCurrentScene()
    {
        // 判断是否加载过当前场景
        if (!currentScene.IsValid()) return;
        StartCoroutine(UnloadCurrentSceneAsync());
    }

    IEnumerator UnloadCurrentSceneAsync()
    {
        AsyncOperation operation = SceneManager.UnloadSceneAsync(currentScene);
        yield return operation;
    }
}

然后修改一下 ChangeScene 脚本调用的方法。

public class ChangeScene : MonoBehaviour
{
    public string sceneName;

    void onm ouseDown()
    {
        // 先卸载当前加载的场景
        SceneLoader.Instance.UnloadCurrentScene();
        
        // 加载新的场景(叠加模式)
        SceneLoader.Instance.LoadSceneAdditive(sceneName);
    }
}

Stage 场景也需要修改一下,隐藏掉相机和灯光,因为主场景已经有了,多个相机和灯光会影响视觉效果。

修改场景

场景叠加效果:

场景叠加

场景叠加2

标签:sceneName,Unity3D,场景,05,using,SceneLoader,public,加载
From: https://blog.csdn.net/2301_76984003/article/details/136779493

相关文章

  • 【时事篇-05-03】20240316 一笔145元拆分成3笔存款存入(排除有相似性的十位数字)
    背景需求前文提到,每笔都存一样的数目,容易被银行识别违法,【时事篇-05-01】20240112150元存46只货币基金-CSDN博客文章浏览阅读580次,点赞15次,收藏11次。【时事篇-05-01】20240112150元存46只货币基金https://blog.csdn.net/reasonsummer/article/details/136106686前几天我......
  • AntSK 0.2.1 版本揭秘:动态加载dll,驱动Function Call新境界!
        在.NET的无限宇宙中,动态加载dll似乎一直是操控代码生生不息的魔杖。今天,我将与您探讨如何通过AntSK0.2.1版本灵活运用dll,将FunctionCall的强大功能插拔自如地融入项目之中,我们走入插件化开发的全新篇章。新版本简介       AntSK,这个曾被我们广泛探讨过的......
  • 访问JavaWeb项目报405错误
     一、问题由来一位朋友最近在学习JavaWeb开发,做测试时出现问题,页面报了405错误,HTTPStatus405?MethodNotAllowed如果是只出现一次,那也还好。主要是这个错误他遇到过多次,第一次就是刚开始学习Servlet的时候,还有一次是在学习文件上传的时候出现的。因此就特意写一篇博......
  • JVM 实战 - JVM之类加载过程
    在Java虚拟机(JVM)中,类加载过程是将编译后的.class文件或其它格式的类定义数据加载到JVM内存的方法区,并为这些类型创建运行时的Class对象实例的过程。这个过程确保了Java代码能够在JVM上被正确执行。类加载主要包括以下几个步骤:加载(Loading)通过类的全限定名来查找和读取对......
  • Codeforces-1005C
    https://codeforces.com/problemset/problem/1005/C一、代码目录#include<bits/stdc++.h>usingnamespacestd;voidsolve(){inta[122222],n,ans=0;map<int,int>m;scanf("%d",&n);for(inti=0;i<n;i++){......
  • STM32F105双路隔离型CAN总线转4G控制板 - 把CAN数据发送到TCP服务器,实现通过TCP透传
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/product/STM32F105_2CAN/index.html"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p>......
  • 【Web】浅聊Hessian反序列化之Resin的打法——远程类加载
    目录前言原理分析XString:触发恶意类toStringQName的设计理念?远程恶意类加载Context:ContinuationContextQName:恶意toString利用hash相等构造EXP前言精神状态有点糟糕,随便学一下吧首先明确一个朴素的认知:当Hessian反序列化Map类型的对象的时候,会自动调用其put方法,而......
  • 05循环结构
    1<!DOCTYPEhtml>2<htmllang="en">3<head>4<metacharset="UTF-8">5<metaname="viewport"content="width=device-width,initial-scale=1.0">6<title>Document......
  • Several ports (8005, 8080) required by Tomcatv9.0 Server at localhost are alread
    'StartingTomcatv9.0Serveratlocalhost'hasencounteredaproblem.Port8080requiredbyTomcatv9.0Serveratlocalhostisalreadyinuse.Theservermayalreadyberunninginanotherprocess,orasystemprocessmaybeusingtheport.Tost......
  • AVCE - AV Evasion Craft Online 更新 8 种加载方式 - 过 WD 等
    免责声明:本工具仅供安全研究和教学目的使用,用户须自行承担因使用该工具而引起的一切法律及相关责任。作者概不对任何法律责任承担责任,且保留随时中止、修改或终止本工具的权利。使用者应当遵循当地法律法规,并理解并同意本声明的所有内容。下载地址https://github.com/yu......