7-3. 场景管理和切换

使用 Addressable

如下图所示安装 Addressables

打开 Addressables

创建 Addressables Settings

创建完毕之后,就能在 Assets 目录下找到配置好的文件

我们把默认的 Group Name 改成 Scenes

然后选择场景,勾选 Addressable

把场景变成 Addressable 之后,在 Build Settings 里面就不需要添加场景了

接着把所有场景都加进来,可以右键简化名字

敌人制作预制体并 Addressable

在 Assets 文件夹下面创建一个子文件夹,叫做 Prefabs,然后把野猪、蜗牛、蜜蜂都拖拽进去

创建 ScriptableObject

我们要告诉 SceneLoadManager,最开始要加载什么场景。Teleport 也要告诉 SceneLoadManager,发生传送的时候要加载什么场景。所以我们创建 SceneLoadEventSO。要加载什么场景还比较复杂,需要区分场景的类型,已经场景的引用,所以用到了 GameSceneSO

创建 Data SO

SceneLoadManager 加载第一个场景以及接收 SceneLoadEventSO

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

public class SceneLoader : MonoBehaviour
{
    [Header("事件监听")]
    public SceneLoadEventSO loadEventSO;
    public GameSceneSO firstLoadScene;

    [SerializeField]
    private GameSceneSO currentLoadScene;
    private GameSceneSO locationToLoad;
    private Vector3 posToGo;
    private bool fadeScreen;
    public float fadeDuration;

    private void Awake()
    {
        // Addressables.LoadSceneAsync(firstLoadScene.sceneReference, LoadSceneMode.Additive);
        currentLoadScene = firstLoadScene;
        currentLoadScene.sceneReference.LoadSceneAsync(LoadSceneMode.Additive);
    }

    private void OnEnable()
    {
        loadEventSO.loadRequestEvent += OnLoadRequestEvent;
    }

    private void OnDisable()
    {
        loadEventSO.loadRequestEvent -= OnLoadRequestEvent;
    }

    private void OnLoadRequestEvent(GameSceneSO locationToLoad, Vector3 posToGo, bool fadeScreen)
    {
        this.locationToLoad = locationToLoad;
        this.posToGo = posToGo;
        this.fadeScreen = fadeScreen;

        StartCoroutine(UnLoadPreviousScene());
    }

    private IEnumerator UnLoadPreviousScene()
    {
        if (fadeScreen)
        {
            // todo 实现渐入渐出
        }

        yield return new WaitForSeconds(fadeDuration);

        if (currentLoadScene != null)
        {
            yield return currentLoadScene.sceneReference.UnLoadScene();
        }

        LoadNewScene();
    }

    private void LoadNewScene()
    {
        locationToLoad.sceneReference.LoadSceneAsync(LoadSceneMode.Additive, true);
    }
}

在 Awake 的时候,加载了第一个场景 First Load Scene

在 Enable 的时候,监听 OnLoadRequestEvent 事件,记录要切换的场景、位置、是否淡入淡出,然后开启协程卸载旧场景和加载新场景

TeleportPoint 切换场景的时候发送 SceneLoadEventSO

项目相关代码

代码仓库:https://gitee.com/nbda1121440/2DAdventure.git

标签:20240228_1347

posted @ 2024-02-28 14:15  hellozjf  阅读(33)  评论(0编辑  收藏  举报