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

学习游戏制作记录(保存装备物品技能树和删除存档文件)8.26

1.保存库存物品

创建SerializbleDictionary脚本:

[System.Serializable]
public class SerializbleDictionary<Tkey, TValue> : Dictionary<Tkey, TValue>, ISerializationCallbackReceiver//手动实现字典序列化
{
[SerializeField] private List<Tkey> keys = new List<Tkey>();
[SerializeField] private List<TValue> values = new List<TValue>();
public void OnBeforeSerialize()
{


        keys.Clear();
values.Clear();

        foreach (KeyValuePair<Tkey, TValue> pairs in this)
{
keys.Add(pairs.Key);
values.Add(pairs.Value);
}
}

    public void OnAfterDeserialize()
{
this.Clear();

        if (keys.Count != values.Count)
{
Debug.Log("Not Equie");
}

        for (int i = 0; i < keys.Count; i++)
{
this.Add(keys[i], values[i]);
}
}

}

 GameData脚本:

 public SerializbleDictionary<string, int> Inventory;//使用字典序列

 public GameData()
{
this.currency = 0;

     Inventory =new SerializbleDictionary<string, int>();
}

Inventory脚本:


    [Header("Data Base")]
private List<InventoryItem> LoadedItems =new List<InventoryItem>();//待加载的物品

    private void AddStartingItem()
{
if(LoadedItems.Count>0)//初始化物品,是否要加载
{
foreach(InventoryItem item in LoadedItems)
{
for(int i = 0;i<item.stackSize;i++)
{
AddItem(item.data);
}
}

            return;
}


        for (int i = 0; i < startingItem.Count; i++)
{
if(startingItem[i] != null)
AddItem(startingItem[i]);
}
}

    public void LoadDate(GameData gameData)//加载函数
{
foreach(KeyValuePair<string,int> pair in gameData.Inventory)
{
foreach(var item in  GetItemDataBase())在保存的序列里搜索
{
if(item!=null&&item.ItemID==pair.Key)
{
InventoryItem itemToLoad =new InventoryItem(item);

                    itemToLoad.stackSize = pair.Value;

                    LoadedItems.Add(itemToLoad);//添加
}
}
}
}

    public void SaveDate(ref GameData gameData)
{
gameData.Inventory.Clear();

        foreach (KeyValuePair<ItemData, InventoryItem> pair in inventoryItemsDictionary)
{
gameData.Inventory.Add(pair.Key.ItemID, pair.Value.stackSize);//添加到字典序列
}
}

    private List<ItemData> GetItemDataBase()//获取保存的序列
{
List<ItemData> itemDatas = new List<ItemData>();
string[] assestsName = AssetDatabase.FindAssets("", new[] { "Assets/Data/Equipment" });

        foreach(string SQName  in assestsName)
{
var SQpath =AssetDatabase.GUIDToAssetPath(SQName);
var itemData= AssetDatabase.LoadAssetAtPath<ItemData>(SQpath);

            itemDatas.Add(itemData);
}

        return itemDatas;
}

2.保存材料和已经装备的物品

 GameData脚本:

    public List<string> equipmentId;//已装备物品的id

Inventory脚本:

    public List<ItemData_Equipment> loadedEquipments;//已装备物品的列表

    private void AddStartingItem()
{
foreach(ItemData_Equipment item in loadedEquipments)//初始化已经装备的物品
{
EquipItem(item);
}


        if(LoadedItems.Count>0)
{
foreach(InventoryItem item in LoadedItems)
{
for(int i = 0;i<item.stackSize;i++)
{
AddItem(item.data);
}
}

            return;
}


        for (int i = 0; i < startingItem.Count; i++)
{
if(startingItem[i] != null)
AddItem(startingItem[i]);
}
}

    public void SaveDate(ref GameData gameData)
{
gameData.Inventory.Clear();
gameData.equipmentId.Clear();

        foreach (KeyValuePair<ItemData, InventoryItem> pair in inventoryItemsDictionary)
{
gameData.Inventory.Add(pair.Key.ItemID, pair.Value.stackSize);
}

        foreach (KeyValuePair<ItemData,InventoryItem>pair in stashItemsDictionary)//保存材料
{
gameData.Inventory.Add(pair.Key.ItemID,pair.Value.stackSize);
}

        foreach(KeyValuePair<ItemData_Equipment,InventoryItem> pair in equipmentDictionary)//保存装备的物品
{
gameData.equipmentId.Add(pair.Key.ItemID);
}
}

    public void LoadDate(GameData gameData)
{
foreach(KeyValuePair<string,int> pair in gameData.Inventory)
{
foreach(var item in  GetItemDataBase())
{
if(item!=null&&item.ItemID==pair.Key)
{
InventoryItem itemToLoad =new InventoryItem(item);

                    itemToLoad.stackSize = pair.Value;

                    LoadedItems.Add(itemToLoad);
}
}
}

        foreach(string loadedItemID in gameData.equipmentId)//将已保存的装备添加到列表中
{
foreach(var item in GetItemDataBase())
{
if(item!=null && item.ItemID==loadedItemID)
{
loadedEquipments.Add(item as ItemData_Equipment);
}
}
}
}

3.保存技能树

UI_SkillTreeSlot脚本:

public class UI_SkillTreeSlot : MonoBehaviour,IPointerEnterHandler, IPointerExitHandler,ISaveManager实现ISaveManager接口

    public void LoadDate(GameData gameData)
{
if(gameData.skilltree.TryGetValue(skillName,out bool value))//加载bool
unlocked = value;
}

    public void SaveDate(ref GameData gameData)
{
if(gameData.skilltree.TryGetValue(skillName,out bool value))
{
gameData.skilltree.Remove(skillName);
gameData.skilltree.Add(skillName, unlocked);
}
else
{
gameData.skilltree.Add(skillName, unlocked);
}
}

Skill脚本:

    protected virtual void Start()
{
player = PlayerManage.instance.player;

        CheckUnlocked();
}

    protected virtual void CheckUnlocked()//每个技能单独重写
{

    }

以Blackhole_Skill脚本为例:

    protected override void CheckUnlocked()
{

        UnlockBlackHole();///调用解锁函数
}

4.删除保存的文档

FileDataHandler 脚本:

    public void Delete()
{
string fullPath = Path.Combine(dataDirPath, FileName);

        if(File.Exists(fullPath))//检测是否存在
{
File.Delete(fullPath);
}
}

SaveManager脚本:

    [ContextMenu("Delete save data")]//右击脚本可以看到选项直接调用函数
private void DeletSavedData()
{
dataHandler = new FileDataHandler(Application.persistentDataPath, fileName);
dataHandler.Delete();
}

http://www.dtcms.com/a/351217.html

相关文章:

  • 【软考论文】论静态测试方法及其应用
  • 系统设计中的幂等性
  • QPSK调制解调通信仿真程序调试与分析
  • UbuntuV24.04安装mpdecimal库(libmpdec),从源码编译
  • 广告推荐模型3:域感知因子分解机(Field-aware Factorization Machine, FFM)
  • 机器人 - 无人机基础(6) - 状态估计(ing)
  • 1 线性模型
  • 支持向量机(SVM)
  • Java 大视界 -- Java 大数据机器学习模型在金融市场波动预测与资产配置动态调整中的应用
  • 网站开发用什么语言好
  • CentOS扩容非LVM分区
  • PortSwigger靶场之Blind SQL injection with out-of-band interaction通关秘籍
  • Redis--2
  • 在 TencentOS 3 上部署 OpenTenBase:从底层原理到生产级实践的深度指南
  • DBeaver下载安装使用
  • 支持向量机(SVM)算法总结
  • 大数据毕业设计选题:基于大数据的用户贷款行为数据分析系统Spark SQL核心技术
  • 迷你版Shell:源码详解与行为解析
  • 【Linux 34】Linux-主从复制
  • 嵌入式学习日记(34)HTTP协议
  • 支持向量机核心知识总结
  • 读懂支持向量机(SVM)
  • CI/CD 全链路实践:从 Git 基础到 Jenkins + GitLab 企业级部署
  • Flask 之上下文详解:从原理到实战
  • IDEA-Maven和Tomcat乱码问题
  • 2025改版:npm 新淘宝镜像域名地址
  • Uniapp(Vue2)Api请求封装
  • 企业级集群部署gpmall商城:MyCat+ZooKeeper+Kafka 环境部署与商城应用上线流程
  • VxWorks 核心数据结构详解 【消息队列、环形缓冲区、管道、FIFO、双缓冲区、共享内存】
  • Debian Buster 软件源失效问题