麦田物语学习笔记:保存和加载场景中的物品
目录
基本流程
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主的其他视频也非常高质量,推荐观看
相关文章:
麦田物语学习笔记:保存和加载场景中的物品
目录 基本流程 1.代码思路 2.代码实现 最终效果 补充知识点 1.序列化 2.委托 基本流程 现在在切换场景后,场景中的物品即使被拾取了,也还是会被重新加载出来,所以本篇文章的任务是在切换场景前后能保留当前场景的数据 1.代码思路 (1)为了保留处在地上的物品数据,就需要…...
页高速缓存与缓冲区缓存的应用差异
页高速缓存(Page Cache)与缓冲区缓存(Buffer Cache)是计算机系统中用于提高数据访问性能的两种不同类型的缓存机制,它们的差异主要体现在以下几个方面: 缓存目的 页高速缓存:主要用于加速对磁…...
深度学习 Pytorch 单层神经网络
神经网络是模仿人类大脑结构所构建的算法,在人脑里,我们有轴突连接神经元,在算法中,我们用圆表示神经元,用线表示神经元之间的连接,数据从神经网络的左侧输入,让神经元处理之后,从右…...
一文读懂 HTTP:Web 数据交换的基石
HTTP 概述 HTTP 是一种用作获取诸如 HTML 文档这类资源的协议。它是 Web 上进行任何数据交换的基础,同时,也是一种客户端—服务器(client-server)协议,也就是说,请求是由接受方——通常是 Web 浏览器——发…...
算法知识补充2
一部分:Tire树:高效地存储和查找字符串集合的数据结构acwing835 #include<iostream> #include<cstring> using namespace std; const int N100010; int son[N][26],cnt[N],idx; char str[N]; void insert(char str[]){int p0;for(int i0;st…...
Vue.js组件开发-实现对视频预览
在 Vue 中实现视频文件预览 实现步骤 创建 Vue 组件:构建一个 Vue 组件用于处理视频文件的选择和预览。文件选择:添加一个文件输入框,允许用户选择视频文件。读取文件:监听文件选择事件,使用 FileReader API 读取所选…...
SSM开发(三) spring与mybatis整合(含完整运行demo源码)
目录 本文主要内容 一、Spring整合MyBatis的三个关键点 二、整合步骤 1、创建一个Maven项目 2、在pom.xml文件中添加jar包的依赖 3、配置MyBatis 注解实现方式 XML配置文件实现 4、配置Spring 5、测试运行 本文主要内容 1. Spring + Mybatis整合; 2. MyBatis两种SQL…...
.NET MAUI进行UDP通信(二)
上篇文章有写过一个简单的demo,本次对项目进行进一步的扩展,添加tabbar功能。 1.修改AppShell.xaml文件,如下所示: <?xml version"1.0" encoding"UTF-8" ?> <Shellx:Class"mauiDemo.AppShel…...
14-6-3C++STL的list
(一)list的插入 1.list.insert(pos,elem);//在pos位置插入一个elem元素的拷贝,返回新数据的位置 #include <iostream> #include <list> using namespace std; int main() { list<int> lst; lst.push_back(10); l…...
AAAI2024论文解读|HGPROMPT Bridging Homogeneous and Heterogeneous Graphs
论文标题 HGPROMPT: Bridging Homogeneous and Heterogeneous Graphs for Few-shot Prompt Learning 跨同构异构图的小样本提示学习 论文链接 HGPROMPT: Bridging Homogeneous and Heterogeneous Graphs for Few-shot Prompt Learning论文下载 论文作者 Xingtong Yu, Yuan…...
WPA_cli P2P命令详解及使用
目录 通用命令 status scan scan_results add_network set_network enable_network reconfigure save_config quit P2P 相关命令 p2p_find p2p_peers p2p_connect [method] p2p_group_add [ssid=] [freq=] [ht40] [persistent] p2p_remove_client p2p_di…...
【竞技宝】LPL:IG3-1击败RNG
北京时间1月26日,英雄联盟LPL2025正在如火如荼的进行之中,昨日共进行两场比赛。第二场比赛由RNG对阵IG。本场比赛,RNG在首局前期打出完美节奏后一直压制着IG拿下比赛,但此后的三局,IG发挥出自己擅长大乱斗的能力在团战…...
sqlite3 学习笔记
文章目录 前言SQL的概念与表格相关的操作i.创建表格(增)ii 删除表格(删)iii 更改表格(改)iv 查询表格(查) 与记录相关的操作i 插入记录ii 删除记录iii 查询记录iv 修改记录 Linux中使…...
Visual Studio Community 2022(VS2022)安装方法
废话不多说直接上图: 直接上步骤: 1,首先可以下载安装一个Visual Studio安装器,叫做Visual Studio installer。这个安装文件很小,很快就安装完成了。 2,打开Visual Studio installer 小软件 3,…...
项目集成RabbitMQ
文章目录 1.common-rabbitmq-starter1.创建common-rabbitmq-starter2.pom.xml3.自动配置1.RabbitMQAutoConfiguration.java2.spring.factories 2.测试使用1.创建common-rabbitmq-starter-demo2.目录结构3.pom.xml4.application.yml5.TestConfig.java 配置交换机和队列6.TestCon…...
3097. 或值至少为 K 的最短子数组 II
3097. 或值至少为 K 的最短子数组 II 题目链接:3097. 或值至少为 K 的最短子数组 II 代码如下: class Solution { public:int minimumSubarrayLength(vector<int>& nums, int k) {int res INT_MAX;for (int i 0;i < nums.size();i) {in…...
Linux 35.6 + JetPack v5.1.4之编译器升级
Linux 35.6 JetPack v5.1.4之编译器升级 1. 源由2. 步骤步骤一:添加编译器源步骤二:安装gcc/g 11/13步骤三:确认安装版本步骤四:配置gcc/g版本步骤五:使能gcc/g版本步骤六:查看使能链接关系步骤七…...
[MoeCTF 2022]ezhtml
题目 查看页面源代码 有个/evil.js文件打开查看 看到了flag NSSCTF{e15f7f51-d1a0-4d1b-a96d-c987a4fe69a0} 到这里也就可以直接结束了 // 获取元素节点 var sx document.querySelector(#sx); // 获取 id 为 sx 的元素节点 var yw document.querySelector(#yw); // 获取…...
活动回顾和预告|微软开发者社区 Code Without Barriers 上海站首场活动成功举办!
Code Without Barriers 上海活动回顾 Code Without Barriers:AI & DATA 深入探索人工智能与数据如何变革行业 2025年1月16日,微软开发者社区 Code Without Barriers (CWB)携手 She Rewires 她原力在大中华区的首场活动“AI &…...
使用 Redis List 和 Pub/Sub 实现简单的消息队列
使用 Redis List 和 Pub/Sub 实现简单的消息队列 Redis 本身不是专门的消息队列系统,但它提供了多种数据结构(如 List、Pub/Sub、Stream)来实现消息队列功能。根据不同的业务需求,可以选择不同的方式: 在 Redis 中&a…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
