From 80dddf17d8edba62f002d1237a604a509669340e Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期二, 29 七月 2025 16:59:04 +0800
Subject: [PATCH] 125 【战斗】战斗系统
---
Main/System/Battle/Skill/SkillBase.cs | 242 ++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 224 insertions(+), 18 deletions(-)
diff --git a/Main/System/Battle/Skill/SkillBase.cs b/Main/System/Battle/Skill/SkillBase.cs
index 6c8a691..64964ac 100644
--- a/Main/System/Battle/Skill/SkillBase.cs
+++ b/Main/System/Battle/Skill/SkillBase.cs
@@ -1,26 +1,244 @@
using System.Collections.Generic;
using UnityEngine;
+using System;
+using DG.Tweening;
+using Spine;
public class SkillBase
{
+ protected H0604_tagUseSkillAttack tagUseSkillAttack;
+
protected SkillConfig skillConfig;
protected bool isFinished = false;
- public SkillBase(SkillConfig _skillCfg)
+ protected BattleField battleField = null; // 鎴樺満
+
+ protected RectTransform targetNode = null; // 鐩爣鑺傜偣
+
+ protected BattleObject caster = null; // 鏂芥硶鑰�
+
+ protected bool startCounting = false;
+
+ protected bool pauseState = false;
+
+ protected int curFrame = 0;
+
+ protected List<GameNetPackBasic> packList;
+
+ protected SkillBase otherSkill;
+
+ public SkillBase(BattleObject _caster, SkillConfig _skillCfg, H0604_tagUseSkillAttack vNetData, List<GameNetPackBasic> _packList, BattleField _battleField = null)
{
+ caster = _caster;
skillConfig = _skillCfg;
- }
+ tagUseSkillAttack = vNetData;
+ battleField = _battleField;
+ packList = _packList;
+
+ }
public virtual void Run()
+ {
+ if (startCounting)
+ {
+ curFrame++;
+ }
+ }
+
+ protected virtual void OnActiveSkillFrame()
+ {
+
+ }
+
+ protected virtual void OnStartSkillFrame()
+ {
+
+ }
+
+ protected virtual void OnEndSkillFrame()
{
}
- public virtual void Cast(BattleObject _caster, BattleField battleField, List<Dictionary<int, List<int>>> damageList)
+ public void Pause()
{
- Debug.LogError("SkillBase Cast should be overridden by derived class");
+ pauseState = startCounting;
+ startCounting = false;
+ }
+
+ public void Resume()
+ {
+ startCounting = pauseState;
+ }
+
+ // 0路绉诲姩鍒拌窛绂荤洰鏍噉鐮侊紝鐨勮窛绂婚噴鏀撅紙鍙厤缃紝9999鍗冲師鍦伴噴鏀撅紝璐熸暟鍒欐槸绉诲姩鍒颁汉鐗╄儗闈紝浜虹墿瑕佽浆韬級
+ // 1路绉诲姩鍒拌窛绂婚樀瀹逛綅缃畁鐮佺殑璺濈锛堝2鍙蜂綅锛�5鍙蜂綅锛夐噴鏀撅紙鍗虫垬鍦轰腑澶绫伙級
+ public virtual void Cast()
+ {
+ // 楂樹寒鎵�鏈夋湰娆℃妧鑳界浉鍏崇殑鐩爣
+ HighLightAllTargets();
+
+ // 璺濈閰嶆垚璐熸暟瑕佽浆韬� TurnBack
+
+ switch (skillConfig.castMode)
+ {
+ case SkillCastMode.Self:
+ PlayCastAnimation(() => DoSkillLogic(OnSkillFinished));
+ break;
+ case SkillCastMode.Enemy:
+ MoveToTarget(caster.GetEnemyCamp(), skillConfig.CastIndexNum, _onComplete: () => TurnBack(() => PlayCastAnimation(() => DoSkillLogic(() => { BackToOrigin(OnSkillFinished); }))));
+ break;
+ case SkillCastMode.Target:
+ // 鐩爣鏄晫鏂逛富鐩爣
+ BattleObject mainTarget = battleField.battleObjMgr.GetBattleObject((int)tagUseSkillAttack.AttackID);
+ if (mainTarget == null)
+ {
+ Debug.LogError("鐩爣涓虹┖ mainTarget == null AttackID : " + tagUseSkillAttack.AttackID);
+ OnSkillFinished();
+ return;
+ }
+ MoveToTarget(mainTarget.Camp, mainTarget.teamHero.positionNum, _onComplete: () => TurnBack(() => PlayCastAnimation(() => DoSkillLogic(() => { BackToOrigin(OnSkillFinished); }))));
+ break;
+ case SkillCastMode.Allies:
+ MoveToTarget(caster.Camp, skillConfig.CastIndexNum, _onComplete: () => TurnBack(() => PlayCastAnimation(() => DoSkillLogic(() => { BackToOrigin(OnSkillFinished); }))));
+ break;
+ // case SkillCastMode.DashCast:
+ // DashToTarget(() => BackToOrigin(OnSkillFinished));
+ // break;
+ default:
+ Debug.LogError("鏆傛椂涓嶆敮鎸佸叾浠栫殑鏂瑰紡閲婃斁 鏈夐渶姹傝鑱旂郴绛栧垝");
+ break;
+ }
+ }
+
+ // 鍐插埡鐨勬妧鑳� 鍔ㄤ綔 璺熺Щ鍔� 鏄悓鏃惰繘琛岀殑 绉诲姩鍒扮洰鏍囩殑涓�鐬棿灏辫杩涜鎶�鑳介�昏緫
+ // protected void DashToTarget(Action _onComplete)
+ // {
+ // TrackEntry entry = PlayCastAnimation();
+ // BattleObject mainTarget = battleField.battleObjMgr.GetBattleObject((int)tagUseSkillAttack.AttackID);
+ // if (mainTarget == null)
+ // {
+ // Debug.LogError("鐩爣涓虹┖ mainTarget == null AttackID : " + tagUseSkillAttack.AttackID);
+ // _onComplete?.Invoke();
+ // return;
+ // }
+
+ // // 鍋氫竴涓井寰殑鎻愬墠
+ // MoveToTarget(mainTarget.Camp, mainTarget.teamHero.positionNum, entry.AnimationEnd - 0.05f, () => DoSkillLogic(_onComplete));
+ // }
+
+ // 杩欓噷鍏跺疄鏄妧鑳藉悗鎽囩粨鏉熺殑鍦版柟
+ protected virtual void DoSkillLogic(Action _onComplete = null)
+ {
+
+ }
+
+ protected TrackEntry PlayCastAnimation(Action onComplete = null)
+ {
+ // 鎾斁鏂芥硶鍔ㄤ綔
+ return caster.motionBase.PlaySkillAnimation(skillConfig, onComplete,
+ OnStartSkillFrame,//鏀诲嚮鍓嶆憞缁撴潫
+ OnActiveSkillFrame);//鏀诲嚮涓憞缁撴潫
+ }
+
+ public void MoveToTarget(BattleCamp camp, int index, float duration = 0.2f, Action _onComplete = null)
+ {
+ // GetTargetNode();
+ targetNode = battleField.GetTeamNode(camp, index);
+
+ Vector2 offset = new Vector2(skillConfig.CastDistance, 0);
+ RectTransform selfRect = caster.heroGo.transform as RectTransform;
+ 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.heroGo.transform as RectTransform;
+ Vector2 targetAnchoredPos = Vector2.zero;
+ var tween = selfRect.DOAnchorPos(targetAnchoredPos, 0.2f)
+ .SetEase(Ease.Linear)
+ .OnComplete(() =>
+ {
+ // 杞垚姝g‘鏂瑰悜
+ caster.heroGo.transform.localScale = Vector3.one;
+ _onComplete?.Invoke();
+ });
+
+ battleField.battleTweenMgr.OnPlayTween(tween);
+ }
+
+ protected void HighLightAllTargets()
+ {
+ // 楂樹寒鎵�鏈夌洰鏍�
+ HashSet<BattleObject> highlightList = new HashSet<BattleObject>(battleField.battleObjMgr.GetBattleObjList(tagUseSkillAttack));
+ highlightList.Add(caster);
+
+
+
+ // 鎶婅繖浜汢O鍏ㄩ珮浜� 鎴栬�呰鎶婇櫎浜嗚繖浜涚殑閮芥斁鍦ㄩ伄缃╁悗闈�
+ // YYL TODO
+ }
+
+ // 鍛戒腑鐩爣鍚庣殑鍥炶皟 姝e父鏄互鍚勬妧鑳界殑鏂瑰紡鏉ュ鐞嗙殑
+ protected virtual void OnHitTargets(int _hitIndex, List<H0604_tagUseSkillAttack.tagSkillHurtObj> hitList)
+ {
+ for (int i = 0; i < hitList.Count; i++)
+ {
+ H0604_tagUseSkillAttack.tagSkillHurtObj hurt = hitList[i];
+
+ BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
+ if (target == null)
+ {
+ Debug.LogError("鐩爣涓虹┖ target == null ObjId : " + hurt.ObjID);
+ continue;
+ }
+
+ // 浼ゅ缁撶畻
+ int[] damageDivide = skillConfig.DamageDivide[_hitIndex];
+
+ List<long> damageList = new List<long>();
+
+ long totalDamage = GeneralDefine.GetFactValue(hurt.HurtHP, hurt.HurtHPEx);
+
+ for (int j = 0; j < damageDivide.Length; j++)
+ {
+ long damage = totalDamage * damageDivide[j] / 10000;
+ damageList.Add(damage);
+ }
+
+ OnHitEachTarget(target, damageList, ref hurt);
+ }
+ }
+
+ protected virtual void OnHitEachTarget(BattleObject target, List<long> damageList, ref H0604_tagUseSkillAttack.tagSkillHurtObj hurt)
+ {
+ target.Hurt(damageList, hurt.AttackType);
+
+ // 鍑讳腑鐩爣鐨勬椂鍊�,涓嶇杩戞垬杩滅▼ 閮界‘璁や竴涓嬫槸鍚︽湁鐖嗙偢鐗规晥 鐒跺悗鎾斁
+ if (skillConfig.ExplosionEffectId > 0)
+ {
+ // 鎾斁鐖嗙偢鐗规晥
+ target.battleField.battleEffectMgr.PlayEffect(
+ target.ObjID,
+ skillConfig.ExplosionEffectId,
+ target.heroGo.transform
+ );
+ }
}
public virtual bool IsFinished()
@@ -33,20 +251,8 @@
isFinished = true;
}
-#if UNITY_EDITOR
- public virtual List<BattleObject> GetTargetList(BattleObject _caster, BattleField battleField)
+ public void OnSkillFinished()
{
- SkillTargetType targetType = SkillTargetType.Enemy;
- SkillTargetRangeType rangeType = SkillTargetRangeType.LowestHP;
-
- List<BattleObject> affectList = battleField.battleObjMgr.GetTargetList(_caster, targetType, rangeType);
- return affectList;
+ isFinished = true;
}
-
- public virtual List<Dictionary<int, List<int>>> GetDamageList(BattleObject _caster, BattleField battleField)
- {
- Debug.LogError("SkillBase GetDamageList should be overridden by derived class");
- return null;
- }
-#endif
}
\ No newline at end of file
--
Gitblit v1.8.0