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