在Unity中,我有一个场景特别大,里面有很多模型和灯光,导致每回加载该场景时都要等一段时间。于是设想,能不能在一打开程序时就预加载这个场景,这样再加载该场景时能节省点时间。

为防自己老年痴呆,先说一下加载场景的方法

新建一个按钮,一个空物体,一个脚本,脚本内容如下:

    public void 虚拟仿真()
    {
        SceneManager.LoadScene("虚拟仿真", LoadSceneMode.Single);
    }

把挂载脚本的物体拖给按钮,然后在On Click()里选择写好的函数。正常来说,编程的代码里不应该出现中文,但我无所谓,能跑就行。

把场景拖到build setting里,运行,点按钮,跳转到对应场景,功能完成

现在开始实现预加载指定场景的功能:

比如说我想一开始就预加载上图里“实验室场景”按钮所对应的场景,应该写如下函数:

   public TMP_Text Loadte;
    public void Start()
    {
        UnityEngine.SceneManagement.Scene scene = SceneManager.GetActiveScene();

        if (!scene.name.Equals("实验室场景"))
        {
            StartCoroutine(LoadSceneAsync());
        }
     }

    IEnumerator LoadSceneAsync()
    {
        asyncLoad = SceneManager.LoadSceneAsync("实验室场景", LoadSceneMode.Single);
        asyncLoad.allowSceneActivation = false;
        yield return null;
    }

    public void 实验室场景()
    {
        Loadte.text ="加载中:" +(asyncLoad.progress * 100) + "%";
        asyncLoad.allowSceneActivation = true;
    }

Loadte 为按钮的TMP_Text组件,实现了文字显示加载进度的效果

使用协程异步加载"实验室场景"。把场景加到build setting里,设置好按钮对应的跳转,按钮的文字组件拖到脚本上等准备工作做完

开始运行后可以看到上图显示"实验室场景"已经预加载了,实际上代码里的“, LoadSceneMode.Single”不要也行。

最开始写这个功能的脚本时会有bug,点击"实验室场景"能正常跳转,但点击其他按钮就不能正常跳转对应场景了,也会只在后台加载,非要再点"实验室场景"的按钮才行。这是由于全用的异步加载所致,既然解决就不复现这个bug了

补:当场景里同时存在 异步加载(is loading) 和 DontDestoryOnLoad 的时候,切换场景时要用 SceneManager.MoveGameObjectToScene(transform.root.gameObject, SceneManager.GetActiveScene()); 来取消 DontDestoryOnLoad 的设置

例如:

    public void SetFal()
    {
        SceneManager.MoveGameObjectToScene(transform.root.gameObject, SceneManager.GetActiveScene());
        gameObject.SetActive(false);
    }

其中,gameObject 是设置了DontDestoryOnLoad的物体,否则 预加载的场景会不按期望来跳出

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐