11.选角界面数据

11.开始场景-选角界面-数据准备


11.1 知识点

传统游戏开发流程中。游戏的配置一般是写到配置文件里给策划去配的。程序是负责得到配好的数据应用到游戏中。程序一应该和策划定好数据结构,程序写逻辑,策划根据数据结构配文件。

创建所有角色的数据类RoleData脚本,在创建 单个角色数据RoleInfo类。RoleInfo类内包括血量速度体积资源路径模型大小的字段,搞成xml属性可以方便点。角色的数据类RoleData包括一个单个角色数据的List。注意对比和排行榜数据类的不同。排行榜数据是要在游戏运行时动态的存储和读取的。角色数据是配置文件配置好不会改变的。

/// <summary>
/// 所有角色的数据集合
/// </summary>
public class RoleData
{
    //单个角色数据List
    public List<RoleInfo> roleList = new List<RoleInfo>();
}

/// <summary>
/// 单个角色数据
/// </summary>
public class RoleInfo
{
    [XmlAttribute]
    public int hp; //血量

    [XmlAttribute]
    public int speed;//速度

    [XmlAttribute]
    public int volume;//体积

    [XmlAttribute]
    public string resName;//资源路径

    [XmlAttribute]
    public float scale;//选角面板使用的 模型缩放大小
}

在StreamingAssets文件夹创建RoleData.xml文件,手写配置文件。

<?xml version="1.0" encoding="UTF-8"?>
<RoleData>
    <roleList>
        <RoleInfo hp="4" speed="6" volume="5" resName="Airplane/Airplane1" scale="15"/>
        <RoleInfo hp="3" speed="7" volume="4" resName="Airplane/Airplane2" scale="15"/>
        <RoleInfo hp="2" speed="8" volume="3" resName="Airplane/Airplane3" scale="15"/>
        <RoleInfo hp="10" speed="3" volume="10" resName="Airplane/Airplane4" scale="6"/>
        <RoleInfo hp="6" speed="5" volume="7" resName="Airplane/Airplane5" scale="10"/>
    </roleList>
</RoleData>

把美术资源文件的预制体飞机转存到Resource下,做成新的预制体。这样就能不影响原始资源的情况下使用自己转存的飞机资源。

在游戏数据管理器GameDataMgr脚本中关联角色的数据类RoleData变量,游戏数据管理器构造函数初始化的时候读取数据。封装一个变量记录当前选择的角色编号,封装一个暴露给外部使用的方法获取当前选择的角色数据。

public class GameDataMgr
{
    //单例模式
    private static GameDataMgr instance = new GameDataMgr();
    public static GameDataMgr Instance => instance;

    //角色数据
    public RoleData roleData;

    //当前选择的角色 编号
    public int nowSelHeroIndex = 0;

    private GameDataMgr()
    {
        //一开始 就读取 角色数据 
        roleData = XmlDataMgr.Instance.LoadData(typeof(RoleData), "RoleData") as RoleData;
    }

    #region 玩家数据相关
    /// <summary>
    /// 提供给外部 获取当前选择的 英雄数据
    /// </summary>
    /// <returns></returns>
    public RoleInfo GetNowSelHeroInfo()
    {
        return roleData.roleList[nowSelHeroIndex];
    }
    #endregion
}

可以断点查看角色数据有没有别注册读取。


11.2 知识点代码

RoleData

using System.Collections;
using System.Collections.Generic;
using System.Xml.Serialization;
using UnityEngine;

/// <summary>
/// 所有角色的数据集合
/// </summary>
public class RoleData
{
    //角色数据List
    public List<RoleInfo> roleList = new List<RoleInfo>();
}

/// <summary>
/// 单个角色数据
/// </summary>
public class RoleInfo
{
    [XmlAttribute]
    public int hp; //血量

    [XmlAttribute]
    public int speed;//速度

    [XmlAttribute]
    public int volume;//体积

    [XmlAttribute]
    public string resName;//资源路径

    [XmlAttribute]
    public float scale;//选角面板使用的 模型缩放大小
}

RoleData.xml

<?xml version="1.0" encoding="UTF-8"?>
<RoleData>
    <roleList>
        <RoleInfo hp="4" speed="6" volume="5" resName="Airplane/Airplane1" scale="15"/>
        <RoleInfo hp="3" speed="7" volume="4" resName="Airplane/Airplane2" scale="15"/>
        <RoleInfo hp="2" speed="8" volume="3" resName="Airplane/Airplane3" scale="15"/>
        <RoleInfo hp="10" speed="3" volume="10" resName="Airplane/Airplane4" scale="6"/>
        <RoleInfo hp="6" speed="5" volume="7" resName="Airplane/Airplane5" scale="10"/>
    </roleList>
</RoleData>

GameDataMgr

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameDataMgr
{
    //单例模式
    private static GameDataMgr instance = new GameDataMgr();
    public static GameDataMgr Instance => instance;

    //音乐相关数据
    public MusicData musicData;
    //排行榜数据
    public RankData rankData;
    //角色数据
    public RoleData roleData;

    //当前选择的角色 编号
    public int nowSelHeroIndex = 0;

    private GameDataMgr()
    {
        //就是获取本地硬盘中存储的 音乐数据
        musicData = XmlDataMgr.Instance.LoadData(typeof(MusicData), "MusicData") as MusicData;
        //一开始 就读取本地的 排行榜数据
        rankData = XmlDataMgr.Instance.LoadData(typeof(RankData), "RankData") as RankData;
        //一开始 就读取 角色数据 
        roleData = XmlDataMgr.Instance.LoadData(typeof(RoleData), "RoleData") as RoleData;
    }

    #region 音乐音效相关

    //保存音乐相关数据的方法
    public void SaveMusicData()
    {
        XmlDataMgr.Instance.SaveData(musicData, "MusicData");
    }

    //开关背景音乐的方法
    public void SetMusicIsOpen(bool isOpen)
    {
        //改数据
        musicData.musicIsOpen = isOpen;
        //真正改变背景音乐的开关
        BKMusic.Instance.SetBKMusicIsOpen(isOpen);
    }

    //开关音效的方法
    public void SetSoundIsOpen(bool isOpen)
    {
        //改数据
        musicData.SoundIsOpen = isOpen;
        //真正改变音效的开关
    }

    //设置背景音乐的音效 0~1
    public void SetMusicValue(float value)
    {
        //改数据
        musicData.musicValue = value;
        //真正的改变背景音乐的大小
        BKMusic.Instance.SetBKMusicValue(value);
    }

    //设置音效的音效 0~1
    public void SetSoundValue(float value)
    {
        //改数据
        musicData.soundValue = value;
    }

    #endregion

    #region 排行榜相关

    /// <summary>
    /// 添加排行榜数据,包括玩家名和通关时间。
    /// </summary>
    /// <param name="name">玩家名</param>
    /// <param name="time">通关时间</param>

    public void AddRankData(string name, int time)
    {
        //单条数据
        RankInfo rankInfo = new RankInfo();
        rankInfo.name = name;
        rankInfo.time = time;
        rankData.rankList.Add(rankInfo);

        //排序,按时间从大到小排序。
        rankData.rankList.Sort((a, b) =>
        {
            if (a.time > b.time)
                return -1;
            return 1;
        });

        //移除大于20条的内容。
        if (rankData.rankList.Count > 20)
            rankData.rankList.RemoveAt(20);

        //保存数据。
        XmlDataMgr.Instance.SaveData(rankData, "RankData");
    }

    #endregion

    #region 玩家数据相关
    /// <summary>
    /// 提供给外部 获取当前选择的 英雄数据
    /// </summary>
    /// <returns></returns>
    public RoleInfo GetNowSelHeroInfo()
    {
        return roleData.roleList[nowSelHeroIndex];
    }
    #endregion
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏