Unity3D 一种开放世界物件序列化方案

本文探讨了在开放世界生存游戏中,如何实现物件序列化,特别是在玩家自由建筑系统中的应用。通过设计一种方案,允许对象在运行时保存位置、朝向、缩放等信息,以及扩展功能如背包数据和所有者信息。系统采用WorldObject为基础,结合扩展脚本处理不同类型的物件,如墙壁、物品箱、防御炮塔等。WorldObjectProfile负责基础数据,扩展脚本处理特定功能,实现插件式扩展。该系统强调了易于扩展和使用的特性,开发者只需关注如何扩展Profile和Object并实现IArchiveWorldObject接口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开放世界游戏,尤为生存游戏,玩家自由建筑系统是一个几乎必不可少的功能。就算不是建筑,那些循环生成的资源,也需要在保存的时候序列化到文件中去。

比如一堵墙,需要在运行时保存他的位置,朝向和缩放等。

如果是一个物品箱,还需要保存其保持的背包数据信息。所有者信息等等。

同时这个系统还要满足插件式可扩展的需求。于是乎我设计了几版序列化和 反序列化开放世界物件的方案。最终采纳了下面的方案。



UML图早已还给学校老师,姑且领会精神吧。

【1】对于任意一个需要序列化的开放世界中的物件,可以是建筑物件如墙,可以是存储箱子,可以是自动防御炮塔,等等。需要那种功能,就绑定那种物件的脚本,其中WorldObject是必须的脚本,其他的都是扩展脚本。

【2】WorldObject处理WorldObjectProfile中的基础数据,而对应的扩展脚本,处理对应的扩展数据

基本数据处理代码:

        public void Load(WorldObjectProfile profile)
        {
            GUID = profile.GUID;
            cachedTransform.position = profile.position;
            cachedTransform.eulerAngles = profile.eularAngles;
            cachedTransform.localScale = profile.localScale;
        }

        public void Save(WorldObjectProfile profile)
        {            
            profile.GUID = GUID;
            string p
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值