5.技能读表 技能读表概述: 技能读表,作为实现技能系统更为快捷的一种方式,被广泛应用到游戏开发中。技能配表,作为桥梁连接着游戏策划者和开发者在技能实现上的关系。在游戏技能开发中,开发者只需要根据策划人员提供的技能配表,在程序上实现对配置文件的读取功能。策划人员在游戏开发后期,如果在技能策划上做了修改,可以通过对技能配表的修改来实现对技能系统的修改。在这一过程中,绕过了开发者,便于策划对游戏后期开发的掌控,减轻了程序员的工作量。可以说技能读表不仅对技能、技能连招做出了贡献,也减轻了整个开发团队的工作量。 读表原理: 策划提供技能配表,开发人员需根据技能配表实现程序对配置文件的读取工作,玩家下达相应命令时,游戏角色执行相应技能,流程图如5-1所示。
图5-1
实现方法: 步骤1: 策划人员制作技能配表,至少包括技能配置表格和连招技能配置表格两张表,表格格式通常采用INI、TXT、CSV等,这里推荐开发者使用CSV,方便操作看着清晰。配置好的表格如Skill.csv和ContinualSkill.csv文件所示。 步骤2: 开发人员根据提供的技能配置文件,程序上实现对配置文件的读取功能。具体实现方式如下所示。 2.1:定义读取技能表后,记录技能表后,存放信息位置。 1)在类SkillData中,用数据结构用来记录表的信息,参考技能配置表Skill。
01 | private UInt32 m_iSkillID; |
02 | private Code m_eSkillKeyboard; |
03 | private string m_sSkillAnimation; |
04 | private Int32 m_iSkillDamageHp; |
05 | private string m_sSkillEffect; |
06 | private UInt32 m_iBeginKeyFrame; |
07 | private UInt32 m_iEndKeyFrame; |
08 | private UInt32 m_iBeginHurtFrame; |
09 | private UInt32 m_iEndHurtFrame; |
10 | private UInt32 m_iEndID; |
11 | private string m_sEndAnimation; |
2) 在ContinualSkillData类中,连招数据以组合方式记录信息。招数据结构,作为一个容器,存放技能表中的读入的相应数据。
1 | private UInt32 m_iContinualSkillID; |
2 | private Dictionary < UInt32, SkillData > m_vSkillData; |
3) 在ContinualSkillConfig类中,连招技能记录的一个数据。
1 | private Dictionary < UInt32, ContinualSkillData> m_vContinualSkills; |
2.2技能信息的读取过程 1)加载技能配置数据
01 | private void LoadSkillConfig() |
03 | StreamReader streamRead= new StreamReader(GenerateSkillFilePath(), System.Text.Encoding.Default); |
04 | string sLine = streamRead.ReadLine(); |
06 | while ( null != (sLine = streamRead.ReadLine())) |
08 | aryLine = sLine.Split( new char [] { '\t' }); |
09 | if (COLUMN_PER_SKILL > aryLine.Length) continue ; |
11 | UInt32 iSkillID = UInt32.Parse(aryLine[0]); |
12 | Code eSkillKeyboard = (Code) int .Parse(aryLine[1]); |
13 | string sSkillAnimation = aryLine[2]; |
14 | Int32 iSkillDamageHp = Int32.Parse(aryLine[3]); |
15 | string sSkillEffect = aryLine[4]; |
16 | UInt32 iBeginKeyFrame = UInt32.Parse(aryLine[5]); |
17 | UInt32 iEndKeyFrame = UInt32.Parse(aryLine[6]); |
18 | UInt32 iBeginHurtFrame = UInt32.Parse(aryLine[7]); |
19 | UInt32 iEndHurtFrame = UInt32.Parse(aryLine[8]); |
20 | UInt32 iEndID = UInt32.Parse(aryLine[9]); |
21 | string sEndAnimation = aryLine[10]; |
23 | if (iBeginKeyFrame >= iEndKeyFrame || iBeginHurtFrame >= iEndHurtFrame) |
25 | throw ( new ArgumentException( "ContinualSkillConfig.LoadSkillConfig" )); |
28 | SkillData skillData = new SkillData(iSkillID, eSkillKeyboard, sSkillAnimation, iSkillDamageHp, sSkillEffect, iBeginKeyFrame, iEndKeyFrame, iBeginHurtFrame, iEndHurtFrame, iEndID, sEndAnimation); |
29 | m_vSkills.Add(iSkillID, skillData); |
2)加载连续技能配置数据
01 | private void LoadContinualSkillConfig() |
03 | StreamReader streamRead = new StreamReader(GenerateContinualSkillFilePath(), System.Text.Encoding.Default); |
04 | string sLine = streamRead.ReadLine(); |
06 | while ( null != (sLine = streamRead.ReadLine())) |
08 | aryLine = sLine.Split( new char [] { '\t' }); |
09 | int iColumnNum = aryLine.Length; |
10 | if (1 >= iColumnNum) continue ; |
12 | UInt32 iContinualSkillID = UInt32.Parse(aryLine[0]); |
13 | ContinualSkillData continualSkill = GetContinualSkillData(iContinualSkillID); |
15 | for ( int ii = 1; ii < iColumnNum; ++ii) |
17 | UInt32 iSkillID = UInt32.Parse(aryLine[ii]); |
18 | SkillData skillData = GetSkillData(iSkillID); |
19 | if ( null == skillData) |
21 | throw ( new ArgumentException( "ContinualSkillConfig.LoadContinualSkillConfig" )); |
23 | continualSkill.AddSkillData(skillData); |
3)获取相对路径方式:
02 | private string GenerateSkillFilePath() |
04 | string sAssetPath = ScriptRuntime.Application.GetAssetPath(); |
05 | string sPath = sAssetPath + SKILL_RELATIVE_PATH; |
10 | private string GenerateContinualSkillFilePath() |
12 | string sAssetPath = ScriptRuntime.Application.GetAssetPath(); |
13 | string sPath = sAssetPath + CONTINUALSKILL_RELATIVE_PATH; |
2.3对外接口,当玩家发送相应指令时,用技能标示符作为索引,读取相应私有类内容,获取技能。
02 | public SkillData GetSkillData(UInt32 iSkillID) |
04 | if (m_vSkills.ContainsKey(iSkillID)) |
06 | return m_vSkills[iSkillID]; |
14 | public ContinualSkillData GetContinualSkillData(UInt32 iContinualSkillID) |
16 | if (m_vContinualSkills.ContainsKey(iContinualSkillID)) |
18 | return m_vContinualSkills[iContinualSkillID]; |
22 | ContinualSkillData continualSkill = new ContinualSkillData(iContinualSkillID); |
23 | m_vContinualSkills.Add(iContinualSkillID, continualSkill); |
24 | return continualSkill; |
|