麦田物语学习笔记:保存和加载场景中的物品

目录

基本流程

1.代码思路

2.代码实现

最终效果

补充知识点

1.序列化

2.委托


基本流程

        现在在切换场景后,场景中的物品即使被拾取了,也还是会被重新加载出来,所以本篇文章的任务是在切换场景前后能保留当前场景的数据

1.代码思路

        (1)为了保留处在地上的物品数据,就需要保存物品的坐标,以及这个物品是什么,所以在卸载场景之前读取要卸载的场景中的物品都有什么,重新加载场景的时候,按照之前的进度把物品再生成出来

        (2)创建一个存储数据的字典,这个字典需要把场景的名字和物品的信息存储在一起,由于一个场景里有多个物品,那么就需要一个列表来保存

2.代码实现

新增和修改ItemManager.cs的代码

private Dictionary<string, List<SceneItem>> sceneItemDict = new Dictionary<string, List<SceneItem>>();

private void OnEnable()
{
    EventHandler.InstantiateItemInScene += OnInstantiateItemInScene;
    EventHandler.BeforeSceneUnloadEvent += OnBeforeSceneUnloadEvent;
    EventHandler.AfterSceneLoadedEvent += OnAfterSceneLoadedEvent;
}

private void OnDisable()
{
    EventHandler.InstantiateItemInScene -= OnInstantiateItemInScene;
    EventHandler.BeforeSceneUnloadEvent -= OnBeforeSceneUnloadEvent;
    EventHandler.AfterSceneLoadedEvent -= OnAfterSceneLoadedEvent;
}

private void OnBeforeSceneUnloadEvent()
{
    GetAllSceneItems();
}

private void OnAfterSceneLoadedEvent()
{
    itemParent = GameObject.FindWithTag("ItemParent").transform;
    RecreateAllItems();
}

/// <summary>
/// 获得当前场景所有Item
/// </summary>
private void GetAllSceneItems()
{ 
    List<SceneItem> currentSceneItems = new List<SceneItem>();

    foreach (var item in FindObjectsOfType<Item>())
    {
        SceneItem sceneItem = new SceneItem
        { 
            itemID = item.itemID,
            position = new SerializableVector3(item.transform.position)
        };
        currentSceneItems.Add(sceneItem);
    }

    if (sceneItemDict.ContainsKey(SceneManager.GetActiveScene().name))
    {
        //找到数据就更新Item数据列表
        sceneItemDict[SceneManager.GetActiveScene().name] = currentSceneItems;
    }
    else //如果是新场景
    {
        sceneItemDict.Add(SceneManager.GetActiveScene().name, currentSceneItems);
    }
}

/// <summary>
/// 刷新重建当前场景的物品
/// </summary>
private void RecreateAllItems()
{
    List<SceneItem> currentSceneItems = new List<SceneItem>();

    if (sceneItemDict.TryGetValue(SceneManager.GetActiveScene().name, out currentSceneItems))
    {
        if (currentSceneItems != null)
        {
            //清场
            foreach (var item in FindObjectsOfType<Item>())
            {
                Destroy(item.gameObject);
            }

            foreach (var item in currentSceneItems)
            {
                Item newItem = Instantiate(itemPrefab, item.position.ToVector3(), Quaternion.identity, itemParent);
                newItem.Init(item.itemID);
            }
        }
    }
}

DataCollection新增可序列化坐标和场景中的物品

[System.Serializable]
//可序列化的坐标
public class SerializableVector3
{
    //坐标 
    public float x, y, z;

    public SerializableVector3(Vector3 pos)
    {
        this.x = pos.x;
        this.y = pos.y;
        this.z = pos.z;
    }

    public Vector3 ToVector3()
    { 
        return new Vector3(x,y,z);
    }

    public Vector2Int ToVector2Int()
    {
        return new Vector2Int((int)x, (int)y);
    }
}

[System.Serializable]
public class SceneItem
{
    public int itemID;
    public SerializableVector3 position;
}

 对调TransitionManager中呼叫加载场景之后的事件以及场景淡出效果的顺序

private IEnumerator Transition(string sceneName, Vector3 targetPosition)
{
    //呼叫卸载场景之前要做的事
    EventHandler.CallBeforeSceneUnloadEvent();

    yield return Fade(1);

    yield return SceneManager.UnloadSceneAsync(SceneManager.GetActiveScene());

    yield return LoadSceneSetActive(sceneName);

    //移动人物坐标
    EventHandler.CallMoveToPosition(targetPosition);

    //呼叫加载场景之后的事件
    EventHandler.CallAfterSceneLoadedEvent();

    yield return Fade(0);
}

最终效果

拾取物品切换场景后,场景中的物品并不存在

 

补充知识点

1.序列化

        序列化,简单来说就是将对象转化为可传输的字节序列的过程叫做序列化,

        这里的对象指的任意脚本Unity文件,

        可以将对象转换为字节序列后,存储在数据库,内存或者文件
        

        我通过这个视频了解的

2.委托

        虽然在该专栏里的其他文章中补充过该知识,但是该视频是我遇到过的把委托讲的最通透的

因此再次提出并记录在这个文章中

        视频在这 

        up主的其他视频也非常高质量,推荐观看  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/957865.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习-K近邻算法

文章目录 一. 数据集介绍Iris plants dataset 二. 代码三. k值的选择 一. 数据集介绍 鸢尾花数据集 鸢尾花Iris Dataset数据集是机器学习领域经典数据集&#xff0c;鸢尾花数据集包含了150条鸢尾花信息&#xff0c;每50条取自三个鸢尾花中之一&#xff1a;Versicolour、Setosa…

大数据,Hadoop,HDFS的简单介绍

大数据 海量数据&#xff0c;具有高增长率、数据类型多样化、一定时间内无法使用常规软件工具进行捕捉、管理和处理的数据集 合 大数据的特征: 4V Volume : 巨大的数据量 Variety : 数据类型多样化 结构化的数据 : 即具有固定格式和有限长度的数据 半结构化的数据 : 是…

2024年博客之星年度评选|第一步——创作影响力评审入围Top300名单 | 博客之星陪跑指南

2024年博客之星年度评选&#xff5c;第一步——创作影响力评审入围Top300名单 | 博客之星陪跑指南 2024年博客之星年度评选正在如火如荼地进行中&#xff01;作为博客圈最具影响力的评选活动之一&#xff0c;今年的评选吸引了众多优秀博主的参与。现在&#xff0c;距离Top300入…

全面评测 DOCA 开发环境下的 DPU:性能表现、机器学习与金融高频交易下的计算能力分析

本文介绍了我在 DOCA 开发环境下对 DPU 进行测评和计算能力测试的一些真实体验和记录。在测评过程中&#xff0c;我主要关注了 DPU 在高并发数据传输和深度学习场景下的表现&#xff0c;以及基本的系统性能指标&#xff0c;包括 CPU 计算、内存带宽、多线程/多进程能力和 I/O 性…

CSRF漏洞学习总结

一、什么是CSRF漏洞&#xff1f; CSRF&#xff08;Cross-Site Request Forgery&#xff0c;跨站请求伪造&#xff09;是一种网络攻击&#xff0c;它利用受害者在受信任网站上的已认证会话&#xff0c;来执行非预期的行动。这种攻击的核心在于&#xff0c;攻击者能够诱使受害者…

模型剪枝及yolov5剪枝实践

文章目录 1、模型剪枝1、 稀疏化训练2、模型剪枝2.1 非结构化剪枝2.2 结构化剪枝2.3 一些疑惑&#xff1a;2.3.1 剪枝后参数量不变&#xff1f; 3、微调 【结构化剪枝掉点太多&#xff0c;不如一开始就选个小模型训练。非结构化剪枝只是checkpoint文件变小了&#xff0c;推理速…

黑马程序员C++ P1-P40

一.注释和常量 1.多行注释&#xff1a;/*...............*/ ; 单行注释&#xff1a;//.............. 2.常量&#xff1a;用于记录程序中不可修改的量 。定义方式&#xff1a;宏常量#define定义在文件上方 ;const修饰变量 3.标识符命名规则&#xff1a;标识符不能是关键字&a…

Airflow:BranchOperator实现动态分支控制流程

Airflow是用于编排复杂工作流的开源平台&#xff0c;支持在有向无环图&#xff08;dag&#xff09;中定义、调度和监控任务。其中一个关键特性是能够使用BranchOperator创建动态的、有条件的工作流。在这篇博文中&#xff0c;我们将探索BranchOperator&#xff0c;讨论它是如何…

怎么使用CRM软件?操作方法和技巧有哪些?

什么是CRM&#xff1f; 嘿&#xff0c;大家好&#xff01;你知道吗&#xff0c;在当今这个数字化时代里&#xff0c;我们每天都在与各种各样的客户打交道。无论是大公司还是小型企业&#xff0c;都希望能够更好地管理这些关系并提高业务效率。这时候就轮到我们的“老朋友”——…

java开发,IDEA转战VSCODE配置(mac)

一、基本java开发环境配置 前提&#xff1a;已经安装了jdk、maven、vscode&#xff0c;且配置了环境变量 1、安装java相关的插件 2、安装spring相关的插件 3、vscode配置maven环境 打开 VsCode -> 首选项 -> 设置&#xff0c;也可以在setting.json文件中直接编辑&…

AI模型提示词(prompt)优化-实战(一)

一、prompt作用 用户与AI模型沟通的核心工具&#xff0c;用于引导模型生成特定内容、控制输出质量、调整行为模式&#xff0c;并优化任务执行效果&#xff0c;从而提升用户体验和应用效果 二、prompt结构 基本结构 角色&#xff1a;设定一个角色&#xff0c;给AI模型确定一个基…

Unreal Engine 5 C++ Advanced Action RPG 十章笔记

第十章 Survival Game Mode 2-Game Mode Test Map 设置游戏规则进行游戏玩法 生成敌人玩家是否死亡敌人死亡是否需要刷出更多 肯定:难度增加否定:玩家胜利 流程 新的游戏模式类游戏状态新的数据表来指定总共有多少波敌人生成逻辑UI告诉当前玩家的敌人波数 3-Survival Game M…

设计模式的艺术-代理模式

结构性模式的名称、定义、学习难度和使用频率如下表所示&#xff1a; 1.如何理解代理模式 代理模式&#xff08;Proxy Pattern&#xff09;&#xff1a;给某一个对象提供一个代理&#xff0c;并由代理对象控制对原对象的引用。代理模式是一种对象结构型模式。 代理模式类型较多…

每日一题洛谷P1423 小玉在游泳c++

#include<iostream> using namespace std; int main() {double s;cin >> s;int n 0;double sum 0;double k 2;while (sum < s) {sum k;n;k * 0.98;}cout << n << endl;return 0; }

Python3 OS模块中的文件/目录方法六

一. 简介 前面文章简单学习了Python3中 OS模块中的文件/目录的部分函数。 本文继续来学习 OS模块中文件、目录的操作方法。 二. Python3 OS模块中的文件/目录方法 1. os.lseek() 方法、os.lstat() 方法 os.lseek() 方法用于在打开的文件中移动文件指针的位置。在Unix&#…

HTB:Heist[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用smbclient匿…

【HarmonyOS NEXT】华为分享-碰一碰开发分享

关键词&#xff1a;鸿蒙、碰一碰、systemShare、harmonyShare、Share Kit 华为分享新推出碰一碰分享&#xff0c;支持用户通过手机碰一碰发起跨端分享&#xff0c;可实现传输图片、共享wifi等。我们只需调用系统 api 传入所需参数拉起对应分享卡片模板即可&#xff0c;无需对 U…

使用Inno Setup软件制作.exe安装包

1.下一步&#xff1a; 2. 填写 程序名字 和 版本号&#xff1a; 3.设置安装路径信息 4.添加要打包的exe和依赖文件 5.为应用程序创建关联的文件 如果不需要就直接取消勾选 6.创建快捷方式 &#xff08;1&#xff09;第一种&#xff1a;常用 &#xff08;1&#xff09;第二种&am…

CPU 缓存基础知识

并发编程首先需要简单了解下现代CPU相关知识。通过一些简单的图&#xff0c;简单的代码&#xff0c;来认识CPU以及一些常见的问题。 目录 CPU存储与缓存的引入常见的三级缓存结构缓存一致性协议MESI协议缓存行 cache line 通过代码实例认识缓存行的重要性 CPU指令的乱序执行通过…

初步搭建并使用Scrapy框架

目录 目标 版本 实战 搭建框架 获取图片链接、书名、价格 通过管道下载数据 通过多条管道下载数据 下载多页数据 目标 掌握Scrapy框架的搭建及使用&#xff0c;本文以爬取当当网魔幻小说为案例做演示。 版本 Scrapy 2.12.0 实战 搭建框架 第一步&#xff1a;在D:\pyt…