Unity2D学习笔记 | 《勇士传说》教程 | (六)

目录

(一)存档点对象制作

(二)保存数据与加载数据

(三)存储数值与场景

(四)游戏结束画面制作

(五)序列化数据保存

(一)存档点对象制作

        希望互动切换存档点图片,逻辑与互动宝箱相同。

        为存档点制作特效,需要使用场景的后处理来更改画面效果。首先开启并设置Global Light,如果开启后场景中物体都变黑,则检查光源的Sorting Layer并调整为Everything。

        要应用后处理,需在选中的场景中创建Volume,控制对应范围的画面效果,使后处理生效则需要在主相机中启动后处理。在Volume的组件中添加想要设置的效果,各个组件的效果可以查看URP的中文文档。使用Global Volume更改整个场景,再用其他Volume实现不同区域的效果。Volume中的Blend Distance影响了3D坐标下的处理距离,如果相机位置超出了影响距离,则此Volume的效果不会起作用。

        为物体添加Sort Group组件可将其与子物体一同进行图层堆叠判断。

(二)保存数据与加载数据

        在Save和Load时,需要处理的数据可能分散在多个物体中,如玩家、宝箱和每个敌人,对于这些物体都需要实现加载方法且具体实现不同,就可以用接口的写法让这些对象都拥有各自保存和加载的方法。接口需包括必要的方法:注册方法,用于将需要保存的物体注册到管理脚本中;注销方法,用于物体被销毁的同时在管理类中注销此物体;获得存储数据的方法以及读取数据的方法。此外还可以通过为接口添加一个特定返回值的方法来提醒实现类包含某些特定值。

        DataManager作为管理数据存储的管理脚本,需要持续性跨场景或跨脚本调用,除了SO写法外,由于DataManager在整个游戏中只会出现一个,因此也可以采用单例模式的写法来实现(单例模式少用,多了会乱)。在DataManager中首先实现注册和注销的方法,传入需存储的接口类型来记录对象,这样通过注册来统计需要操作的对象的写法称作观察者模式,便于统一通知。

        新版的c#允许在接口中进行函数实现。在接口中实现注册和注销对DataManager单例的调用。已经在接口实现了的方法在实现类中不会出现,因此要调用需要实例化=this来强制执行。

        存储的数据则单独在一个Data类中编写,采用字典键值对保存数据,并在Save和Load时按照Data类整体进行。各个对象的数据以GUID全局唯一标识符作为索引,使用OnValidate()方法会在编辑器模式下,对数据变化做出反应,所以在其中使用System.Guid.NewGuid().ToString()生成ID的话,就可以在挂载脚本时自动生成对象ID。

        实现存储方法时,需要判断Data中是否已经存在此ID的数据,若已存在就更改,反之添加。所有数据统一存储到在DataManager中实例化的Data类。当触发存档事件时,DataManager遍历列表通知注册者保存数据。同理,实现读取方法则遍历列表还原每个对象的坐标。

        最后,每个继承了接口的类都需要完成:实现接口方法,包括生成ID,保存和读取;在OnEnable和OnDisable中实现注册与注销;添加ID生成脚本。

(三)存储数值与场景

        增加存储数据的类型,可以扩充Data类,增加用于存储数据的字典类型变量。   

        当因为类加载顺序导致空指针报错时,可以在类名前加上[DefaultExecutionOrder(xxx)]来设置默认执行顺序,如果还是报错则尝试将没有找到的脚本重新挂载,因为unity默认对后挂载的脚本先执行。

        由于前面场景加载使用的是SO类来实现的,不易被序列化,因此改为将SO场景传给Data类,再在Data类的方法中将其序列化为json字符串。像这样SceneLoader调用Data的订单方法,而不关心Data执行操作的具体过程的结构成为工厂模式。JsonUtility.ToJson可以将object转换为Json格式,而反序列化时则用ScriptableObject.CreateInstance<GameSceneSO>()生成原本的场景变量,并用JsonUtility.FromJsonOverwrite(sceneToSave, newScene)来反序列化json文件为GameSceneSO。

        在加载场景的同时从Data中提出玩家坐标作为加载坐标,以防坐标加载混乱。

(四)游戏结束画面制作

        在mainCanvas上创建一个Panel蒙板来制作游戏结束画面。使用player身上的死亡事件来激活游戏结束画面。

        当按下重新开始按钮时,激活读取数据事件,有DataManager监听事件并开始读取通知。而UImanager则监听控制游戏结束界面停止激活。玩家控制脚本也需要监听游戏载入事件来清空死亡状态,防止读档后仍然倒地。

        返回主菜单的按键类似,创建返回菜单的事件并让SceneLoader来订阅,由按钮来激活。此外在读档事件中对玩家死亡和UI状态的控制也要在返回菜单状态中处理。

        主菜单的继续游戏按钮则可以直接启动加载数据的事件来实现读档继续效果。

(五)序列化数据保存

        此步将数据制作成文件保存。使用Newtonsoft.Json工具来完成这一步。

        以Application.persistentDataPath作为存档的存储位置,存放在C:/Users/xxxx/AppData/LocalLow/CompanyName/ProductName本地位置。接下来使用JsonConvert.SerializeObject()方法可以将整个类转换为json数据流。最后使用Directory.CreateDirectory()创建文件夹并将数据流写入存档。

        同理在读取文件后,对字符串反序列化得到原本的数据类。由于游戏刚开始时没有在地图上互动过存档点,因此在游戏开始时读取一次文件存档即可。

        之前保存坐标所使用的Vector3数据类型不可被序列化,因此可以为其单独创建一个类SerializeVector3来保存。

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学习Unity3D时,以下是一些重要的笔记: 1. Unity3D基础知识: - 游戏对象(Game Objects)和组件(Components):了解游戏对象的层次结构和组件的作用。 - 场景(Scenes)和摄像机(Cameras):学会如何创建场景并设置摄像机视角。 - 材质(Materials)和纹理(Textures):掌握如何创建和应用材质和纹理。 - 动画(Animations):学习如何创建和控制游戏对象的动画。 2. 脚本编程: - C#语言基础:了解C#语言的基本语法和面向对象编程概念。 - Unity脚本编写:学习如何编写脚本来控制游戏对象的行为和交互。 - 常见组件和功能:掌握常见的Unity组件和功能,如碰撞器(Colliders)、刚体(Rigidbodies)、触发器(Triggers)等。 3. 游戏开发流程: - 设计游戏关卡:了解如何设计游戏场景和关卡,包括布局、道具、敌人等。 - 游戏逻辑实现:将游戏规则和玩家交互转化为代码实现。 - UI界面设计:学习如何设计游戏中的用户界面,包括菜单、计分板等。 - 游戏优化和调试:优化游戏性能,解决常见的错误和问题。 4. 学习资源: - Unity官方文档和教程:官方提供了大量的文档和教程,逐步引导你学习Unity3D。 - 在线教程和视频教程:网上有很多免费和付费的Unity教程和视频教程,可根据自己的需求选择学习。 - 社区论坛和博客:加入Unity开发者社区,与其他开发者交流并获取帮助。 通过系统地学习这些内容,你将能够掌握Unity3D的基础知识并开始开发自己的游戏项目。记得不断实践和尝试,不断提升自己的技能!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值