读取游戏数据档是游戏并不可少的一个功能,一般我们搭建Unity环境的时候, 我们会准备一些类来负责数据的读取操作. 我来介绍下我们公司读档遇到的问题.
首先是类的介绍
- BaseData 读档的父类
- BaseDataManager 读档管理类(BaseDataSecondLoad方法中读取每一个档)
- xxxx:BaseData 每一个档对应的操作类
- Load(string filePath) 方法里面具体怎么读每一个档
=。=来看下我们读档操作是怎么写的.貌似看起来没有问题. 如果环境是这样的Android+档是在AssetBundle文件里面. 很可能因为策划和程序员的操作当值档出一定问题, 假设中途有一个档出错之后就不在会读取后面的文档, 程序员也没有log可以判断到底是哪里出错了
public IEnumerator BaseDataSecondLoad() { //读取每一个档 m_PassiveSkill.Load(ResourceProvider.gameDataPath + "PassiveSkill"); yield return null; m_BasePointExploreEvent.Load(ResourceProvider.gameDataPath + "BasePointExploreEvent"); m_BasePointExploreBoss.Load(ResourceProvider.gameDataPath + "BasePointExploreBoss"); yield return null; //读取在线奖励档 m_OnlinePrize.Load(ResourceProvider.gameDataPath + "OnlinePrize"); yield return null; m_InvitationCodePrizeData.Load(ResourceProvider.gameDataPath + "InvitationCodePrize"); yield return null; }
我接下来就想到把代码改成这样
public IEnumerator BaseDataSecondLoad() { try { //读取每一个档 m_PassiveSkill.Load(ResourceProvider.gameDataPath + "PassiveSkill"); yield return null; }catch(Exception e) { //我调试的时候就能马上知道那个表出错了 Debug.Log("PassiveSkill 读取错误"); } yield return null; try { //读取每一个档 m_PassiveSkill.Load(ResourceProvider.gameDataPath + "PassiveSkill"); yield return null; }catch(Exception e) { Debug.Log("PassiveSkill 读取错误"); } yield return null; //xxxx省略 }
后来发现游戏档至少有100个, 那么我try-catch要写100多遍. 我想到了模板设计模式来利用父类简化try-catch的冗余.
BaseData定义读取档的流程
public class BaseData { public string table; public void LoadData(string filePath) { try{ LoadDataOption(); }catch(Exception e) { Debug.Log(table + "表读取错误了,请检查"); } } protected abstract void LoadDataOption(); }
每一个档实现读取自己档的方法
//技能表 public class SkillBaseData:BaseData { protected void LoadDataOption(){ //如何读取每一个档 } }
BaseDataManager 类BaseDataSecondLoad()方法就不用写try-catch 100多遍啦
public IEnumerator BaseDataSecondLoad() { SkillBaseData n = new SkillBaseData(); SkillBaseData.LoadData("路径"); yield return null; }
时间: 2024-11-14 03:37:58