using System; using Common.Utility.CombatEvent; using Excel2Json; using Fort23.UTool; using GameLogic.Combat.CombatTool; using GameLogic.Combat.Skill; using UnityEngine; namespace GameLogic.Combat.Hero { public class CombatHeroSkillControl : IDisposable { private BetterList allSkill = new BetterList(); /// /// 技能指令,0表示没有技能; /// private BetterList SkillCommands = new BetterList(); /// /// 当前能使用的技能 /// public SkillBasic currUseSkill; private CombatHeroEntity _combatHeroEntity; /// /// 普攻 /// public SkillBasic NormalAttack; public float NormalAttCd; public float NormalAttSpeedScale; public void Init(CombatHeroEntity combatHeroEntity) { _combatHeroEntity = combatHeroEntity; int[] skillId = _combatHeroEntity.CurrCombatHeroInfo.skillId; if (skillId != null) { for (int i = 0; i < skillId.Length; i++) { SkillConfig skillConfig = ConfigComponent.Instance.Get(skillId[i]); AddSkill(skillConfig); } } } public void AddSkill(SkillConfig skillConfig) { SkillBasic skillBasic = SkillScriptManager.Instance.CreateSkillBasic(skillConfig); allSkill.Add(skillBasic); skillBasic.InitSkill(_combatHeroEntity); if (skillConfig.SkillType == 1) { NormalAttack = skillBasic; NormalAttack.ActiveTimeLineGroupName = "attack"; SetNormalAttCd(); } } public void AddCommandSkill(SkillBasic skill) { SkillCommands.Add(skill); } public void RemoveCommandSkill(SkillBasic skill) { SkillCommands.Remove(skill); } public void ClearCommandSkill() { SkillCommands.Clear(); } public void UseSkill(SkillBasic skill) { CombatUseSkillEventData combatUseSkillEventData = CombatUseSkillEventData.Create(); combatUseSkillEventData.useSkill = skill; CombatEventManager.Instance.Dispatch(CombatEventType.UseSkill, combatUseSkillEventData); currUseSkill = skill; skill.UseSkill(); if (skill.SelfSkillConfig.SkillType == 1) { SetNormalAttCd(); } } /// /// 判断是否有技能可释放 /// /// public SkillBasic CanReleaseSkill() { // if (_combatHeroEntity.IsControl()) // { // return null; // } SkillBasic skillBasic = null; for (int i = 0; i < SkillCommands.size; i++) { skillBasic = SkillCommands[i]; } return skillBasic; } public void Update(float t) { for (int i = 0; i < allSkill.size; i++) { SkillBasic skillBasic = allSkill[i]; skillBasic.CombatUpdate(i); skillBasic.ReduceCd(t); } NormalAttCd -= t; if (NormalAttCd <= 0 && !SkillCommands.Contains(NormalAttack)) { AddCommandSkill(NormalAttack); } } public void SetNormalAttCd() { if (NormalAttack == null) { return; } string timeLineName = "attack"; float maxTime = _combatHeroEntity.combatHeroTimeLineControl.TimeLineData.GetTimeLineEventLogicGroupForTime( timeLineName, null); float attackSpeed = _combatHeroEntity.CurrCombatHeroInfo.attSpeed.Value; float cd = 1.0f / attackSpeed; float attSpeed = (float)1; if (cd < maxTime) { attSpeed = maxTime / cd; } NormalAttSpeedScale = attSpeed; // Debug.Log(NormalAttSpeedScale); NormalAttCd = cd; } public void Dispose() { for (int i = 0; i < allSkill.size; i++) { SkillBasic skillBasic = allSkill[i]; skillBasic.Dispose(); } allSkill.Clear(); SkillCommands.Clear(); _combatHeroEntity = null; NormalAttack = null; currUseSkill = null; } } }