From 8f983d0dab26becb6b85dbbb616fde21c3ad8f02 Mon Sep 17 00:00:00 2001 From: yyl <yyl> Date: 星期三, 20 八月 2025 18:40:23 +0800 Subject: [PATCH] 125 【战斗】战斗系统 --- Main/System/Battle/Skill/SkillBase.cs | 359 +++++++++++++++++++++++++++++++---------------------------- 1 files changed, 191 insertions(+), 168 deletions(-) diff --git a/Main/System/Battle/Skill/SkillBase.cs b/Main/System/Battle/Skill/SkillBase.cs index a0604ba..d74d76d 100644 --- a/Main/System/Battle/Skill/SkillBase.cs +++ b/Main/System/Battle/Skill/SkillBase.cs @@ -9,6 +9,8 @@ public class SkillBase { + protected SkillEffect skillEffect; + protected HB427_tagSCUseSkill tagUseSkillAttack; protected SkillConfig skillConfig; @@ -68,7 +70,6 @@ - public void Pause() { pauseState = startCounting; @@ -80,119 +81,231 @@ startCounting = pauseState; } + // 0路绉诲姩鍒拌窛绂荤洰鏍噉鐮侊紝鐨勮窛绂婚噴鏀撅紙鍙厤缃紝9999鍗冲師鍦伴噴鏀撅紝璐熸暟鍒欐槸绉诲姩鍒颁汉鐗╄儗闈紝浜虹墿瑕佽浆韬級 // 1路绉诲姩鍒拌窛绂婚樀瀹逛綅缃畁鐮佺殑璺濈锛堝2鍙蜂綅锛�5鍙蜂綅锛夐噴鏀撅紙鍗虫垬鍦轰腑澶绫伙級 public virtual void Cast() { + Debug.LogError(GetType().Name + " Skill Cast Start"); // 楂樹寒鎵�鏈夋湰娆℃妧鑳界浉鍏崇殑鐩爣 HighLightAllTargets(); // 璺濈閰嶆垚璐熸暟瑕佽浆韬� TurnBack - + Debug.LogError(GetType().Name + " Skill CastMode : " + skillConfig.castMode); switch (skillConfig.castMode) { case SkillCastMode.Self: - PlayCastAnimation(() => DoSkillLogic(OnSkillFinished)); + CastImpl(); break; case SkillCastMode.Enemy: - MoveToTarget(caster.GetEnemyCamp(), skillConfig, _onComplete: () => TurnBack(() => PlayCastAnimation(() => DoSkillLogic(() => { BackToOrigin(OnSkillFinished); })))); + CastToEnemy(); break; case SkillCastMode.Target: - // 鐩爣鏄晫鏂逛富鐩爣 - if (tagUseSkillAttack.HurtCount <= 0) - { - Debug.LogError("鎶�鑳芥敾鍑诲寘娌℃湁鐩爣 HurtCount <= 0"); - OnSkillFinished(); - return; - } - - var mainHurt = tagUseSkillAttack.HurtList[0]; - - BattleObject mainTarget = battleField.battleObjMgr.GetBattleObject((int)mainHurt.ObjID); - if (mainTarget == null) - { - Debug.LogError("鐩爣涓虹┖ mainTarget == null ObjID : " + mainHurt.ObjID); - OnSkillFinished(); - return; - } - MoveToTarget(mainTarget.Camp, mainTarget, _onComplete: () => TurnBack(() => PlayCastAnimation(() => DoSkillLogic(() => { BackToOrigin(OnSkillFinished); })))); + CastToTarget(); break; case SkillCastMode.Allies: - MoveToTarget(caster.Camp, skillConfig, _onComplete: () => TurnBack(() => PlayCastAnimation(() => DoSkillLogic(() => { BackToOrigin(OnSkillFinished); })))); + CastToAllies(); break; // case SkillCastMode.DashCast: // DashToTarget(() => BackToOrigin(OnSkillFinished)); // break; default: - Debug.LogError("鏆傛椂涓嶆敮鎸佸叾浠栫殑鏂瑰紡閲婃斁 鏈夐渶姹傝鑱旂郴绛栧垝" + skillConfig.SkillID); + Debug.LogError("鏆傛椂涓嶆敮鎸佸叾浠栫殑鏂瑰紡閲婃斁 鏈夐渶姹傝鑱旂郴绛栧垝 鎶�鑳絠d:" + skillConfig.SkillID + " cast position " + skillConfig.CastPosition); OnSkillFinished(); break; } } - // 杩欓噷鍏跺疄鏄妧鑳藉悗鎽囩粨鏉熺殑鍦版柟 - protected virtual void DoSkillLogic(Action _onComplete = null) + protected void MoveToTarget(RectTransform target, Vector2 offset, float duration, Action onComplete = null) { - - } - - protected TrackEntry PlayCastAnimation(Action onComplete = null) - { - // 鎾斁鏂芥硶鍔ㄤ綔 - return caster.motionBase.PlaySkillAnimation(skillConfig, onComplete, - OnStartSkillFrame,//鏀诲嚮鍓嶆憞缁撴潫 - OnActiveSkillFrame);//鏀诲嚮涓憞缁撴潫 - } - - public void MoveToTarget(BattleCamp camp, BattleObject target, float duration = 0.2f, Action _onComplete = null) - { - targetNode = battleField.GetTeamNode(camp, target); - - Vector2 offset = new Vector2(skillConfig.CastDistance, 0); - RectTransform selfRect = caster.heroRectTrans; - RectTransform targetRect = targetNode; - - var tweener = BattleUtility.MoveToTarget(selfRect, targetRect, offset, duration, _onComplete); + caster.motionBase.PlayAnimation(MotionName.run, true); + var tweener = BattleUtility.MoveToTarget(caster.heroRectTrans, target, offset, duration, () => + { + caster.motionBase.PlayAnimation(MotionName.idle, true); + onComplete?.Invoke(); + }); battleField.battleTweenMgr.OnPlayTween(tweener); } - public void MoveToTarget(BattleCamp camp, SkillConfig skillCfg, float duration = 0.2f, Action _onComplete = null) - { - targetNode = battleField.GetTeamNode(camp, skillCfg); - - Vector2 offset = new Vector2(skillConfig.CastDistance, 0); - RectTransform selfRect = caster.heroRectTrans; - RectTransform targetRect = targetNode; - - var tweener = BattleUtility.MoveToTarget(selfRect, targetRect, offset, duration, _onComplete); - battleField.battleTweenMgr.OnPlayTween(tweener); - } - - public void TurnBack(Action _onComplete) + protected void TurnBack(Action _onComplete, float forward) { if (skillConfig.CastDistance < 0) { // 杞韩 - caster.heroGo.transform.localScale = new Vector3(-1, 1, 1); + Vector3 scale = caster.heroGo.transform.localScale; + scale.x = Mathf.Abs(scale.x) * forward; + caster.heroGo.transform.localScale = scale; } _onComplete?.Invoke(); } - public void BackToOrigin(Action _onComplete = null) + protected void CastToEnemy() { - RectTransform selfRect = caster.heroRectTrans; - Vector2 targetAnchoredPos = Vector2.zero; - var tween = selfRect.DOAnchorPos(targetAnchoredPos, 0.2f) - .SetEase(Ease.Linear) - .OnComplete(() => - { - // 杞垚姝g‘鏂瑰悜 - caster.heroGo.transform.localScale = Vector3.one; - _onComplete?.Invoke(); - }); + const float moveTime = 0.5f; - battleField.battleTweenMgr.OnPlayTween(tween); + RectTransform target = battleField.GetTeamNode(caster.GetEnemyCamp(), skillConfig); + + MoveToTarget(target, new Vector2(skillConfig.CastDistance, 0), moveTime, () => + { + // 鍒颁綅缃浆韬�(涓嶄竴瀹氶潪瑕佽浆韬� 浣嗘槸娴佺▼瑕佸啓) + TurnBack(() => + { + // 鍒拌揪鐩爣浣嶇疆 + CastImpl(() => + { + TurnBack( + () => + { + // 鍥炲埌鍘熸潵鐨勪綅缃� + MoveToTarget(battleField.GetTeamNode(caster.Camp, caster.teamHero.positionNum), Vector2.zero, moveTime, () => + { + TurnBack(null, 1f); + caster.motionBase.PlayAnimation(MotionName.idle, true); + }); + } + , -1f); + }); + }, -1f); + }); } + + + + protected void CastToTarget() + { + // 鐩爣鏄晫鏂逛富鐩爣 + if (tagUseSkillAttack.HurtCount <= 0) + { + Debug.LogError("鎶�鑳芥敾鍑诲寘娌℃湁鐩爣 HurtCount <= 0"); + OnSkillFinished(); + return; + } + + var mainHurt = tagUseSkillAttack.HurtList[0]; + + BattleObject mainTarget = battleField.battleObjMgr.GetBattleObject((int)mainHurt.ObjID); + if (mainTarget == null) + { + Debug.LogError("鐩爣涓虹┖ mainTarget == null ObjID : " + mainHurt.ObjID); + OnSkillFinished(); + return; + } + // MoveToTarget(mainTarget.Camp, mainTarget, _onComplete: () => TurnBack(() => CastImpl(() => DoSkillLogic(() => { BackToOrigin(OnSkillFinished); })))); + } + + protected void CastToAllies() + { + // MoveToTarget(caster.Camp, skillConfig, _onComplete: () => TurnBack(() => CastImpl(() => DoSkillLogic(() => { BackToOrigin(OnSkillFinished); })))); + } + + protected TrackEntry CastImpl(Action onComplete = null) + { + // 鎾斁鏂芥硶鍔ㄤ綔 + return caster.motionBase.PlaySkillAnimation(skillConfig, this, onComplete);//鏀诲嚮涓憞缁撴潫 + } + + // 鎶�鑳藉紑濮� + public virtual void OnSkillStart() + { + skillEffect = SkillEffectFactory.CreateSkillEffect( + caster, + skillConfig, + tagUseSkillAttack + ); + if (skillEffect != null) + { + skillEffect.Play(OnHitTargets); + } + } + + // 鎶�鑳藉墠鎽囧抚缁撴潫 + public virtual void OnStartSkillFrameEnd() + { + + } + + /// <summary> + /// 涓憞寮�濮� times=绗嚑娆″惊鐜� 浠�0寮�濮� + /// </summary> + /// <param name="times"></param> + public virtual void OnMiddleFrameStart(int times) + { + + } + + public virtual void OnMiddleFrameEnd(int times, int hitIndex) + { + + } + + /// <summary> + /// 鍚庢憞寮�濮� + /// </summary> + public virtual void OnFinalFrameStart() + { + + } + + /// <summary> + /// 鍚庢憞缁撴潫 + /// </summary> + public virtual void OnFinalFrameEnd() + { + + } + + + + // public void MoveToTarget(BattleCamp camp, BattleObject target, float duration = 0.2f, Action _onComplete = null) + // { + // targetNode = battleField.GetTeamNode(camp, target); + + // Vector2 offset = new Vector2(skillConfig.CastDistance, 0); + // RectTransform selfRect = caster.heroRectTrans; + // RectTransform targetRect = targetNode; + + // var tweener = BattleUtility.MoveToTarget(selfRect, targetRect, offset, duration, _onComplete); + // battleField.battleTweenMgr.OnPlayTween(tweener); + // } + + // public void MoveToTarget(BattleCamp camp, SkillConfig skillCfg, float duration = 0.2f, Action _onComplete = null) + // { + // targetNode = battleField.GetTeamNode(camp, skillCfg); + + // Vector2 offset = new Vector2(skillConfig.CastDistance, 0); + // RectTransform selfRect = caster.heroRectTrans; + // RectTransform targetRect = targetNode; + + // var tweener = BattleUtility.MoveToTarget(selfRect, targetRect, offset, duration, _onComplete); + // battleField.battleTweenMgr.OnPlayTween(tweener); + // } + + // public void TurnBack(Action _onComplete) + // { + // if (skillConfig.CastDistance < 0) + // { + // // 杞韩 + // caster.heroGo.transform.localScale = new Vector3(-1, 1, 1); + // } + // _onComplete?.Invoke(); + // } + + // public void BackToOrigin(Action _onComplete = null) + // { + // RectTransform selfRect = caster.heroRectTrans; + // Vector2 targetAnchoredPos = Vector2.zero; + // var tween = selfRect.DOAnchorPos(targetAnchoredPos, 0.2f) + // .SetEase(Ease.Linear); + + // tween.onComplete += () => + // { + // // 杞垚姝g‘鏂瑰悜 + // caster.heroGo.transform.localScale = Vector3.one; + // _onComplete?.Invoke(); + // }; + + // battleField.battleTweenMgr.OnPlayTween(tween); + // } protected void HighLightAllTargets() { @@ -225,7 +338,7 @@ long totalDamage = GeneralDefine.GetFactValue(hurt.HurtHP, hurt.HurtHPEx); // 淇濊瘉鎵�鏈夊垎閰嶉」鍔犺捣鏉ョ瓑浜巘otalDamage锛岄伩鍏嶅洜鏁撮櫎瀵艰嚧鐨勮宸� - List<long> damageList = DivideDamageToList(damageDivide, totalDamage); + List<long> damageList = BattleUtility.DivideDamageToList(damageDivide, totalDamage); OnHitEachTarget(target, totalDamage, damageList, ref hurt); } @@ -235,7 +348,7 @@ protected void HandleDead() { - var deadPackList = FindDeadPack(); + var deadPackList = BattleUtility.FindDeadPack(packList); CheckAfterDeadhPack(); // 澶勭悊鎺夎惤鍖� 鎻愬墠distribute涔嬪悗 PackManager鎵嶆湁鎺夎惤鐗� 鎵�浠ヤ笉璺焌ssignexp涓�鏍穌istribute @@ -276,13 +389,14 @@ } // 鍒嗗彂姝讳骸鍖� + battleField.OnObjsDead(deadPackList); foreach (var deadPack in deadPackList) { - PackageRegedit.Distribute(deadPack); packList.Remove(deadPack); } deadPackList.Clear(); } + // 鍒嗛厤鎺夎惤 @@ -327,32 +441,7 @@ return expAssign; } - /// <summary> - /// 淇濊瘉鎵�鏈夊垎閰嶉」鍔犺捣鏉ョ瓑浜巘otalDamage锛岄伩鍏嶅洜鏁撮櫎瀵艰嚧鐨勮宸� - /// </summary> - protected List<long> DivideDamageToList(int[] damageDivide, long totalDamage) - { - List<long> fixedDamageList = new List<long>(); - long assigned = 0; - int count = damageDivide.Length; - for (int i = 0; i < count; i++) - { - long damage; - if (i == count - 1) - { - // 鏈�鍚庝竴涓垎閰嶉」淇涓哄墿浣� - damage = totalDamage - assigned; - } - else - { - damage = (totalDamage * damageDivide[i] + 5000) / 10000; // 鍥涜垗浜斿叆 - assigned += damage; - } - fixedDamageList.Add(damage); - } - return fixedDamageList; - } protected virtual void OnHitEachTarget(BattleObject target, long totalDamage, List<long> damageList, ref HB427_tagSCUseSkill.tagSCUseSkillHurt hurt) { @@ -368,57 +457,6 @@ target.heroGo.transform ); } - } - - protected HB423_tagMCTurnFightObjReborn FindRebornPack(BattleObject target) - { - HB423_tagMCTurnFightObjReborn rebornPack = null; - for (int i = 0; i < packList.Count; i++) - { - var pack = packList[i]; - if (pack is HB423_tagMCTurnFightObjReborn) - { - rebornPack = pack as HB423_tagMCTurnFightObjReborn; - if (rebornPack.ObjID == target.ObjID) - { - return rebornPack; - } - } - else if (pack is CustomHB426CombinePack) - { - var combinePack = pack as CustomHB426CombinePack; - if (combinePack.startTag.Tag.StartsWith("Skill_")) - { - break; // 鎵惧埌鎶�鑳藉寘灏变笉闇�瑕佸啀澶勭悊浜� - } - } - } - return null; - } - - protected List<HB422_tagMCTurnFightObjDead> FindDeadPack() - { - List<HB422_tagMCTurnFightObjDead> deadPacks = new List<HB422_tagMCTurnFightObjDead>(); - for (int i = 0; i < packList.Count; i++) - { - var pack = packList[i]; - // 瀵绘壘姝讳骸鍖� 鎵惧埌姝讳骸鍖呬箣鍚庤鎵炬帀钀藉寘 涓嶈兘瓒呰繃鎶�鑳藉寘 - if (pack is HB422_tagMCTurnFightObjDead) - { - var deadPack = pack as HB422_tagMCTurnFightObjDead; - deadPacks.Add(deadPack); - } - else if (pack is CustomHB426CombinePack) - { - // 鎵炬浜″寘涓嶈瓒婅繃鎶�鑳藉寘 - var combinePack = pack as CustomHB426CombinePack; - if (combinePack.startTag.Tag.StartsWith("Skill_")) - { - break; - } - } - } - return deadPacks; } protected void CheckAfterDeadhPack() @@ -487,7 +525,8 @@ public void OnSkillFinished() { - while (packList.Count > 0) + Debug.LogError(GetType().Name + " Skill Finished"); + if (packList.Count > 0) { var pack = packList[0]; packList.RemoveAt(0); @@ -506,21 +545,5 @@ } isFinished = true; - } - - - protected virtual void OnActiveSkillFrame() - { - - } - - protected virtual void OnStartSkillFrame() - { - - } - - protected virtual void OnEndSkillFrame() - { - } } \ No newline at end of file -- Gitblit v1.8.0