首页 > 其他分享 >7-3. 场景管理和切换

7-3. 场景管理和切换

时间:2024-02-28 14:25:39浏览次数:29  
标签:场景 管理 void private fadeScreen 切换 using 加载

使用 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 += onl oadRequestEvent;
    }

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

    private void onl oadRequestEvent(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 的时候,监听 onl oadRequestEvent 事件,记录要切换的场景、位置、是否淡入淡出,然后开启协程卸载旧场景和加载新场景

TeleportPoint 切换场景的时候发送 SceneLoadEventSO

项目相关代码

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

标签:20240228_1347

标签:场景,管理,void,private,fadeScreen,切换,using,加载
From: https://www.cnblogs.com/hellozjf/p/18040252

相关文章

  • 7-2. 场景互动的逻辑实现
    创建可互动接口实现宝箱代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassChest:MonoBehaviour,IInteractable{privateSpriteRendererspriteRenderer;publicSpriteopenSprite;publicSpriteclose......
  • 使用Docker部署仓库GreaterWMS 仓库管理平台
    参考:https://www.56yhz.com/md/docker_deployment/zh-CN安装Docker不详述配置国内加速器不详述安装docker-compose不详述安装git不详述开始部署拉取代码####拉取代码gitclonehttps://github.com/GreaterWMS/GreaterWMS.git####修改Dockerfile####说明1:如果您......
  • SpringBoot 2x 系列之(七)web场景
    web场景1.SpringMVC自动配置概览SpringBootprovidesauto-configurationforSpringMVCthatworkswellwithmostapplications.(大多场景我们都无需自定义配置)Theauto-configurationaddsthefollowingfeaturesontopofSpring’sdefaults:InclusionofCont......
  • Windows开发环境如何启用Directory.Build.props版本号集中管理
    每个产品一个根目录Directory.Build.props的工作模式和NuGet.Config不同,Directory.Build.props不能继承。当dotnetrestore工作的时候,会从当前目录开始,逐级向上查找,找到一个Directory.Build.props文件,就不会再向上查找了。公司如果有多套产品在开发,一般每个产品里面,对同一个包,使......
  • 声明式管理
     声明式管理离线式的修改  kubectlexposepodnginx-d9d8cf5c7-rcdsg--namehanbao-shutiao--type=NodePort--port=9090--target-port=80  #将端口改为8800,nodeport改为4371 #4371不在端口范围内,所以报错 #改为43710  在线修改   ......
  • git 分支切换合代码
    1、当前分支 2、提示有冲突不能切换 3、提交掉冲突代码,然后stash 4、切换到release分支 5、merger 6、pull和push ......
  • pickBy 在前端开发中的最佳实践和使用场景举例说明
    pickBy是lodash中的一个函数,其作用是过滤对象中的属性,只保留符合条件的属性。它的用法如下:_.pickBy(object,[predicate=_.identity])其中,object是要过滤的对象,predicate是一个可选的函数,用于定义过滤条件。如果没有传入predicate函数,则默认使用_.identity函数,即返回......
  • offline RL · RLHF · PbRL | OPPO:PbRL 场景的 offline hindsight transformer
    论文题目:BeyondReward:OfflinePreference-guidedPolicyOptimization,ICML2023,3368reject。(已经忘记当初为何加进readinglist了,可能因为abstract太炫酷了?就当作学习经验教训吧…)材料:pdf版本:https://arxiv.org/pdf/2305.16217.pdfhtml版本:https://ar5iv.labs......
  • Spring系列之(三)Spring对Bean的管理细节
    Spring对Bean的管理细节1.创建Bean的三种方式使用默认构造函数创建bean标签仅配置id和class,即标识和全限定类名,同时保证要创建的类是有无参构造函数的如果没有无参构造函数,将会报错使用某个类中的方法创建对象,该方法的返回值是某个类的对象以新建的Factory类为例,需......
  • 设备管理器-网络适配器-Remote NDiS-based Internet Sharing Device(基于远程NDIS的互
    RemoteNDiS-basedInternetSharingDevice(基于远程NDIS的互联网共享设备)是一种网络接口遥控分享装置。这种设备允许通过USB连接将智能手机等设备连接到电脑,从而充当无线网卡的作用,使电脑能够连接到互联网。具体功能作用如下:充当无线网卡:当手机连接到互联网后,通过USB绑定,这个......