当前位置: 首页 > news >正文

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

目录

基本流程

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主的其他视频也非常高质量,推荐观看  

http://www.lryc.cn/news/527197.html

相关文章:

  • 页高速缓存与缓冲区缓存的应用差异
  • 深度学习 Pytorch 单层神经网络
  • 一文读懂 HTTP:Web 数据交换的基石
  • 算法知识补充2
  • Vue.js组件开发-实现对视频预览
  • SSM开发(三) spring与mybatis整合(含完整运行demo源码)
  • .NET MAUI进行UDP通信(二)
  • 14-6-3C++STL的list
  • AAAI2024论文解读|HGPROMPT Bridging Homogeneous and Heterogeneous Graphs
  • WPA_cli P2P命令详解及使用
  • 【竞技宝】LPL:IG3-1击败RNG
  • sqlite3 学习笔记
  • Visual Studio Community 2022(VS2022)安装方法
  • 项目集成RabbitMQ
  • 3097. 或值至少为 K 的最短子数组 II
  • Linux 35.6 + JetPack v5.1.4之编译器升级
  • [MoeCTF 2022]ezhtml
  • 活动回顾和预告|微软开发者社区 Code Without Barriers 上海站首场活动成功举办!
  • 使用 Redis List 和 Pub/Sub 实现简单的消息队列
  • 本地项目上传到码云
  • Ansible入门学习之基础元素介绍
  • 大数据治理实战指南:数据质量、合规与治理架构
  • leetcode_链表 234.回文链表
  • [Dialog屏幕开发] 屏幕绘制(下拉菜单)
  • deepseek v1手机端部署
  • CVPR 2024 无人机/遥感/卫星图像方向总汇(航空图像和交叉视角定位)
  • 【信息系统项目管理师-选择真题】2015下半年综合知识答案和详解
  • Baklib如何结合内容中台与人工智能技术实现数字化转型
  • JAVAweb学习日记(八) 请数据库模型MySQL
  • 自动驾驶---苏箐对智驾产品的思考