本节将实现从游戏主菜单点击新游戏,创建存档并进入自定义角色场景的功能。

首先在主菜单界面根据当前本地是否存在存档决定是否显示继续游戏的UI(我这里UI复杂点有多个,和课程稍有不同)。

	//UI类
    public override void Init()
    {
        startButton.onClick.AddListener(StartButtonClick);
        quitButton.onClick.AddListener(quitButtonClick);

        //如果当前没有存档,应该隐藏继续游戏按钮
        if (!DataManager.HaveArchive)
        {
            foreach (Button item in continueButtons)
            {
                item.gameObject.SetActive(false);
            }
        }
    }

HaveArchive标记量表示当前是否有存档,由DataManager提供,通过静态类的静态构造函数将在其成员第一次被访问时执行的特性,调用框架中的存档管理器给一个存档号,查找当前是否有存档,在本案例中目前是单存档,所以用默认的存档索引号0(存档系统的实现可阅读框架文档https://developer.unity.cn/projects/62e9d0d1edbc2a001ec7cea7)。

	//DataManager类
    static DataManager()
    {
        LoadSaveData();
    }


    public static bool HaveArchive {get; private set;}
    private static void LoadSaveData()
    {
        SaveItem saveItem = SaveManager.GetSaveItem(0);
        HaveArchive = saveItem != null;
    }

接下在做开始游戏的事件触发。

    //UI类
    public void StartButtonClick()
    {
        Close();
        //创建存档进行游戏-》进入自定义角色场景
        GameManager.Instance.CreateNewArchiveAndEnterGame();

    }

存档和对应的场景切换应受到GameManager管理。

	//GameManager类
    public void CreateNewArchiveAndEnterGame()
    {
        //初始化存档
        DataManager.CreateArchive();
        //进入自定义角色场景
        SceneManager.LoadScene("CreateCharacter");
    }

在DataManager中,由于目前是全局唯一单存档,所以要覆盖之前的存档(先清除再写入),这里直接清除全部存档即可(或者对应清除0)。

    public static void CreateArchive()
    {
        if (HaveArchive)
        {
            //清除全部存档
            SaveManager.DeleteAllSaveItem();
        }
        //创建一个存档
        SaveManager.CreateSaveItem();
        InitCustomCharacterData();
        SaveCustomCharacterData();
    }

这里对框架中存档部分进行简单的介绍,有助于理解,实际我们在调用SaveManager.CreateSaveItem的时候会向SaveManagerData(用来记录当前存档ID和所有存档项SaveItem,游戏运行开始时已自动创建并写入本地)添加一条SaveItem记录,SaveItem里面存了每个存档的ID和创建时间,此时会更新SaveManagerData写入本地保存。

alt

但到这一步数据实际上是没有的,相当于只创建了存档的记录,存档管理器可以根据存档的ID到对应的文件夹下去找数据,为此我们还要初始化数据,再把数据写入到本地文件。

alt

清除存档并创建存档后,我们要对存档数据进行初始化InitCustomCharacterData(给一个默认值),并将初始化后的数据SaveObject(默认不传参为0,即单存档)写入本地保存(这一步必须,否则存档中只有记录没有数据),完整的存档才算创建完毕。

所以创建存档实际上分两步,先创建SaveManagerData中的SaveItem记录,再根据SaveItem的ID(本例中单存档默认为0)将默认数据写入本地。

alt

    //自定义角色的数据
    public static CustomCharacterData CustomCharacterData;
    public static void InitCustomCharacterData()
    {
        CustomCharacterData = new CustomCharacterData();
        CustomCharacterData.CustomPartDataDic = new Serialization_Dic<int, CustomCharacterPartData>();
        CustomCharacterData.CustomPartDataDic.Dictionary.Add((int)CharacterParType.Face, new CustomCharacterPartData()
        {
            Index = 1,
            Size = 1,
            Height = 0
        });
        CustomCharacterData.CustomPartDataDic.Dictionary.Add((int)CharacterParType.Hair, new CustomCharacterPartData()
        {
            Index = 1,
            Color1 = Color.white.ConverToSerializatioColor()
        });
        CustomCharacterData.CustomPartDataDic.Dictionary.Add((int)CharacterParType.Cloth, new CustomCharacterPartData()
        {
            Index = 1,
            Color1 = Color.white.ConverToSerializatioColor(),
            Color2 = Color.black.ConverToSerializatioColor()
        });
    }

    public static void SaveCustomCharacterData()
    {
        SaveManager.SaveObject(CustomCharacterData);
    }

记得删除原来自定义角色场景里场景管理器为了测试多余的存档初始化逻辑。

alt

在Game窗口的游戏流程(主菜单->创建存档进入自定义角色界面)。

alt