From aaa3dd8ebb707f019e65e9bfc7446aede513b8ea Mon Sep 17 00:00:00 2001 From: wuwenbo Date: Tue, 17 Mar 2026 22:05:38 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=80=E8=83=BD=E4=BC=98=E5=85=88=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Unity/Assets/Scripts/TH1_Data/UnitData.cs | 213 +++++++++++++----- .../TH1_DataAssetsScript/SkillDataAssets.cs | 17 +- .../Scripts/TH1_Logic/Skill/SkillBase.cs | 8 + .../Scripts/TH1_Logic/Skill/SkillFactory.cs | 7 +- 4 files changed, 181 insertions(+), 64 deletions(-) diff --git a/Unity/Assets/Scripts/TH1_Data/UnitData.cs b/Unity/Assets/Scripts/TH1_Data/UnitData.cs index 458610d23..4a8637ac6 100644 --- a/Unity/Assets/Scripts/TH1_Data/UnitData.cs +++ b/Unity/Assets/Scripts/TH1_Data/UnitData.cs @@ -500,31 +500,70 @@ namespace RuntimeData // 全局通知调用 public void OnTurnStart(MapData map) { - if (IsFrozen()) return; OnSkillsTurnStart(map); } public void OnAfterTurnStart(MapData map) { - if (IsFrozen()) return; OnSkillsAfterTurnStart(map); } public void OnTurnEnd(MapData map) { - if (!IsFrozen()) OnSkillsTurnEnd(map); + OnSkillsTurnEnd(map); AP = 0; CP = 0; MP = 0; } + protected override void OnSkillsTurnStart(MapData map) + { + var isFrozen = IsFrozen(); + var copy = new List(Skills); + foreach (var skill in copy) + { + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; + skill.BeforeTurnStart(); + if (skill.IsFinished()) + { + skill.OnFinished(this, map); + Skills.Remove(skill); + continue; + } + skill.OnTurnStart(this, map); + } + } + + protected override void OnSkillsAfterTurnStart(MapData map) + { + var isFrozen = IsFrozen(); + var copy = new List(Skills); + foreach (var skill in copy) + { + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; + skill.OnAfterTurnStart(this, map); + } + } + + protected override void OnSkillsTurnEnd(MapData map) + { + var isFrozen = IsFrozen(); + var copy = new List(Skills); + foreach (var skill in copy) + { + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; + skill.OnTurnEnd(this, map); + } + } + //返回该unit的视野半径(考虑unit站在map的实机位置下的视野半径) public int GetSightRange(MapData map) { int v = 1; + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; v += skill.GetExtraSight(this,map); } if (map.GetGridDataByUnitId(this.Id, out var grid) && grid.Feature == TerrainFeature.Mountain) @@ -536,9 +575,10 @@ namespace RuntimeData public int GetSightRange(MapData map,GridData grid) { int v = 1; + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; v += skill.GetExtraSight(this,map); } if (grid.Feature == TerrainFeature.Mountain) @@ -549,9 +589,10 @@ namespace RuntimeData public int GetAttackRange(MapData mapData) { var attackRange = 0; + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; attackRange += skill.GetExtraAttackRange(mapData,this); } @@ -566,9 +607,10 @@ namespace RuntimeData //最终移动能力。 目前仅用于Kanako Sitting的情况(拥有移动力,但是无法移动) public int FinalMoveRange(MapData mapData) { + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; if (!skill.GetFinalMoveRange(this, out var finalMoveRange)) continue; return finalMoveRange; } @@ -583,9 +625,10 @@ namespace RuntimeData if (!Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(UnitFullType, out var info)) return 0; var moveRange = info.MoveRange; + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; moveRange += skill.GetExtraMoveRange(mapData,this); } @@ -596,9 +639,10 @@ namespace RuntimeData public bool CheckIsStaticExp(MapData map) { var isStaticExp = false; + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; if (skill.IsLimitSelfExp(this, map)) isStaticExp = true; } @@ -624,9 +668,10 @@ namespace RuntimeData public float GetSpecialSkillBonus(MapData mapData, SkillType skillType) { var value = 1f; + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; value *= skill.GetSpecialSkillBonus(mapData, this, skillType); } return value; @@ -667,9 +712,10 @@ namespace RuntimeData public float GetAttackAdditionParam(MapData map, UnitData target = null) { var value = 0f; + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; value += skill.GetAttackAdditionParam(map, this, target); } return value; @@ -679,9 +725,10 @@ namespace RuntimeData public float GetAttackMultiplicationParam(MapData map, UnitData target = null) { var value = 1f; + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; value *= skill.GetAttackMultiplicationParam(map, this, target); } return value; @@ -706,9 +753,10 @@ namespace RuntimeData ? info.MoveRange : 0; var add = 0; + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; add += skill.GetExtraMoveRange(mapData,this); } //var mul = GetDefenseMultiplicationParam(map); @@ -732,9 +780,10 @@ namespace RuntimeData ? info.AttackRange : 0; var add = 0; + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; add += skill.GetExtraAttackRange(mapData,this); } //var mul = GetDefenseMultiplicationParam(map); @@ -766,9 +815,10 @@ namespace RuntimeData public float GetDefenseAdditionParam(MapData map, UnitData target = null) { var value = 0f; + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; value += skill.GetDefenseAdditionParam(map, this, target); } return value; @@ -781,9 +831,10 @@ namespace RuntimeData var debuffMult = 1f; // 减益效果(<1)累乘 var isZero = 1f; + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; var t = skill.GetDefenseMultiplicationParam(map, this, target); isZero *= t; @@ -814,9 +865,10 @@ namespace RuntimeData var debuffMult = 1f; // 减益效果(<1)累乘 var isZero = 1f; + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; var t = skill.GetDefenseMultiplicationParam(map, this, target); isZero *= t; @@ -862,9 +914,10 @@ namespace RuntimeData public float GetCriticalHitRate(MapData map) { var criticalHitRate = 0f; + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; criticalHitRate += skill.GetCriticalHitRate(this, map); } return criticalHitRate; @@ -877,9 +930,10 @@ namespace RuntimeData public int GetOfficerHealth() { int ret = 0; + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; ret += skill.GetOfficerHealth(); } return ret; @@ -888,9 +942,10 @@ namespace RuntimeData //判断当前是不是officer public bool IsOfficer() { + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; if (skill.IsOfficer()) return true; } return false; @@ -898,9 +953,10 @@ namespace RuntimeData public bool IsPrepareOfficer() { + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; if (skill.IsPrepareOfficer()) return true; } return false; @@ -909,9 +965,10 @@ namespace RuntimeData public bool IsCanBeOfficer() { + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; if (skill.IsCanBeOfficer()) return true; } return false; @@ -920,9 +977,10 @@ namespace RuntimeData // 是否能移动到伟人身周 public bool IsCanMoveGiantNearbyGrid(MapData map) { + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; if (skill.IsCanMoveGiantNearbyGrid(this, map)) return true; } return false; @@ -945,9 +1003,10 @@ namespace RuntimeData // 是否能移动无人城市 public bool IsCanMoveNoUnitSelfCity(MapData map) { + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; if (skill.IsCanMoveToNoUnitSelfCity(this, map)) return true; } return false; @@ -956,9 +1015,10 @@ namespace RuntimeData // 是否可以死亡 public bool CanBeKilled(MapData map) { + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; if (!skill.IsCanBeKill(this, map)) return false; } return true; @@ -967,9 +1027,10 @@ namespace RuntimeData // 是否可以被伤害结算 public bool CanBeDamaged(MapData map, int dmg) { + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; if (skill.IsCanBeDamaged(this, map, dmg)) return true; } return false; @@ -978,9 +1039,10 @@ namespace RuntimeData // 是否经验锁定 public bool IsExpLock(MapData map) { + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; if (skill.IsLimitSelfExp(this, map)) return true; } return false; @@ -995,9 +1057,10 @@ namespace RuntimeData if (terrainType == TerrainType.ShallowSea && (landType == LandType.WaterAndAshore || landType == LandType.WaterOnly || landType == LandType.LandAndWater || landType == LandType.Fly)) return true; + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; if (skill.IsCanMoveOnTerrain(this, map, terrainType)) return true; } return false; @@ -1008,9 +1071,10 @@ namespace RuntimeData { if (featureType != TerrainFeature.Mountain) return true; + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; if (skill.IsCanMoveOnFeature(this, map,featureType)) return true; } return false; @@ -1019,9 +1083,10 @@ namespace RuntimeData //返回该unit是否能攻击所有人 public bool CanAttackAll(MapData map) { + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; if (skill.CanAttackAll(this, map)) return true; } return false; @@ -1030,9 +1095,10 @@ namespace RuntimeData //返回该unit是否隐身 public bool IsHideState(MapData map) { + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; if (skill.IsHideState()) return true; } return false; @@ -1041,9 +1107,10 @@ namespace RuntimeData //返回该unit是否能攻击 public bool IsLimitSelfAttack(MapData map) { + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; if (skill.IsLimitSelfAttack(this, map)) return true; } return false; @@ -1052,9 +1119,10 @@ namespace RuntimeData //返回该unit是否能移动 public bool IsLimitSelfMove(MapData map) { + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; if (skill.IsLimitSelfMove(this, map)) return true; } return false; @@ -1063,9 +1131,10 @@ namespace RuntimeData //返回该unit是否能攻击ground public bool IsCanAttackTargetGrid(MapData map, GridData target) { + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; if (skill.IsCanAttackTargetGrid(map,this,target)) return true; } return false; @@ -1074,9 +1143,10 @@ namespace RuntimeData //返回该unit是否能攻击Ally public bool IsCanAttackAlly() { + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; if (skill.IsCanAttackAlly()) return true; } return false; @@ -1085,9 +1155,10 @@ namespace RuntimeData //返回该unit是否能攻击ground public bool IsCanAttackTargetAlly(MapData map, UnitData target) { + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; if (!skill.IsCanAttackTargetAlly(map,this,target)) return false; } return true; @@ -1096,9 +1167,10 @@ namespace RuntimeData //返回该unit是否能反击 public bool IsLimitSelfCounterAttack(MapData map) { + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; if (skill.IsLimitSelfCounterAttack(this, map)) return true; } return false; @@ -1107,9 +1179,10 @@ namespace RuntimeData //返回目标 unit 是否能反击 public bool IsLimitTargetCounterAttack(MapData map) { + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; if (skill.IsLimitTargetCounterAttack(this, map)) return true; } return false; @@ -1117,9 +1190,10 @@ namespace RuntimeData public bool IsCanTransport() { + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; if (skill.IsCanTransport()) return true; } return false; @@ -1128,9 +1202,10 @@ namespace RuntimeData // 移动是否会失败(并不限制移动) public bool IsActiveMoveFailed(MapData map, GridData target, MoveType moveType, List path = null) { + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; if (skill.ActiveMoveFailed(this, target, map, moveType, path)) return true; } @@ -1140,10 +1215,11 @@ namespace RuntimeData // 移动后的变化 public void BeforeMove(MapData map, GridData target, MoveType moveType, List path = null) { + var isFrozen = IsFrozen(); var copy = new List(Skills); foreach (var skill in copy) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; skill.BeforeMove(this, target, map, moveType, path); } } @@ -1151,10 +1227,11 @@ namespace RuntimeData // 移动后 public void OnMove(MapData map, GridData target, MoveType moveType, List path = null) { + var isFrozen = IsFrozen(); var copy = new List(Skills); foreach (var skill in copy) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; skill.OnMove(this, target, map,moveType, path); } //赋予格子特殊效果 @@ -1168,10 +1245,11 @@ namespace RuntimeData // 成为移动目标时 public void OnBeMoveTarget(MapData map, UnitData origin, GridData target, MoveType moveType) { + var isFrozen = IsFrozen(); var copy = new List(Skills); foreach (var skill in copy) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; skill.OnBeMoveTarget(origin, this, target, map, moveType); } } @@ -1179,10 +1257,11 @@ namespace RuntimeData // 伤害结算前 public void BeforeDamagedSupportStage(MapData map, SettlementInfo info) { + var isFrozen = IsFrozen(); var copy = new List(Skills); foreach (var skill in copy) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; skill.BeforeDamagedSupportStage(map, info); } } @@ -1190,10 +1269,11 @@ namespace RuntimeData // 伤害结算前 public void BeforeDamagedTransformStage(MapData map, SettlementInfo info) { + var isFrozen = IsFrozen(); var copy = new List(Skills); foreach (var skill in copy) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; skill.BeforeDamagedTransformStage(map, info); } } @@ -1202,10 +1282,11 @@ namespace RuntimeData public void BeforeActiveAttackOther(MapData mapData, UnitData origin, UnitData target,out int addDmg) { addDmg = 0; + var isFrozen = IsFrozen(); var copy = new List(Skills); foreach (var skill in copy) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; skill.BeforeActiveAttackOther(mapData, origin, target, out var tmpAddDmg); addDmg += tmpAddDmg; } @@ -1214,10 +1295,11 @@ namespace RuntimeData // 对他人攻击后 public void AfterActiveAttackOther(MapData mapData, UnitData origin, UnitData target) { + var isFrozen = IsFrozen(); var copy = new List(Skills); foreach (var skill in copy) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; skill.AfterActiveAttackOther(mapData, origin, target); } } @@ -1225,10 +1307,11 @@ namespace RuntimeData // 受他人攻击后 public void AfterActiveAttacked(MapData mapData, UnitData origin, UnitData target) { + var isFrozen = IsFrozen(); var copy = new List(Skills); foreach (var skill in copy) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; skill.AfterActiveAttacked(mapData, origin, target); } } @@ -1236,10 +1319,11 @@ namespace RuntimeData // 对他人伤害结算前 public void BeforeDamageOther(MapData map, SettlementInfo info) { + var isFrozen = IsFrozen(); var copy = new List(Skills); foreach (var skill in copy) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; skill.BeforeDamageOther(map, info); } } @@ -1247,10 +1331,11 @@ namespace RuntimeData // 伤害结算时 public void OnDamaged(MapData mapData, SettlementInfo info) { + var isFrozen = IsFrozen(); var copy = new List(Skills); foreach (var skill in copy) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; skill.OnDamaged(mapData, info); } } @@ -1258,10 +1343,11 @@ namespace RuntimeData // 对他人伤害结算时 public void OnDamageOther(MapData mapData, SettlementInfo info) { + var isFrozen = IsFrozen(); var copy = new List(Skills); foreach (var skill in copy) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; skill.OnDamageOther(mapData, info); } } @@ -1269,10 +1355,11 @@ namespace RuntimeData // 对他人伤害结算后 public void AfterDamageOther(MapData mapData, SettlementInfo info) { + var isFrozen = IsFrozen(); var copy = new List(Skills); foreach (var skill in copy) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; skill.AfterDamageOther(mapData, info); } } @@ -1280,10 +1367,11 @@ namespace RuntimeData // 对他人治疗结算时 public void OnHealOther(MapData mapData, UnitData target,HealType healType) { + var isFrozen = IsFrozen(); var copy = new List(Skills); foreach (var skill in copy) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; skill.OnHealOther(mapData,this,target, healType); } //HeroTask(mapData)?.OnDamageOther(mapData, info); @@ -1294,12 +1382,12 @@ namespace RuntimeData //获取抵达某格所需要的movecostinfo下限,目前仅用于momijiHUnter,也就是说moveinfo>该值才 public float GetGridMoveFloor(MapData mapData, UnitData originUnit,GridData targetGrid) { - + var isFrozen = IsFrozen(); var copy = new List(Skills); float ret = 0f; foreach (var skill in copy) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; ret = Mathf.Max(ret,skill.GetGridMoveFloor(mapData,originUnit,targetGrid)); } return ret; @@ -1316,9 +1404,10 @@ namespace RuntimeData public int GetKillCount() { int ret = 0; + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; ret += skill.GetKillCount(); } return ret; @@ -1336,9 +1425,10 @@ namespace RuntimeData if (UnitFullType.UnitType == UnitType.Giant) return true; if (CarryUnitFullType.UnitType == UnitType.Giant) return true; + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; if (skill.IsTreatAsHero(map, this,unit)) return true; } return false; @@ -1347,9 +1437,10 @@ namespace RuntimeData // 判断是否只能在我方领土内移动 public bool IsLimitMoveToSelfTerrain(MapData map) { + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; if (skill.IsLimitMoveToSelfTerrain(this, map)) return true; } return false; @@ -1375,9 +1466,10 @@ namespace RuntimeData public void SetFullAPCPMP_AllSkillRefresh() { SetFullAPCPMP(); + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; skill.OnRefresh(); } } @@ -1391,9 +1483,10 @@ namespace RuntimeData public void SetOfficer() { + var isFrozen = IsFrozen(); foreach (var skill in Skills) { - if (IsFrozen()) continue; + if (isFrozen && skill.SkillPriority == SkillPriority.Normal) continue; skill.SetOfficer(); } } diff --git a/Unity/Assets/Scripts/TH1_DataAssetsScript/SkillDataAssets.cs b/Unity/Assets/Scripts/TH1_DataAssetsScript/SkillDataAssets.cs index 7779e8cd8..de837a348 100644 --- a/Unity/Assets/Scripts/TH1_DataAssetsScript/SkillDataAssets.cs +++ b/Unity/Assets/Scripts/TH1_DataAssetsScript/SkillDataAssets.cs @@ -1,4 +1,4 @@ - using System; +using System; using System.Collections.Generic; using UnityEngine; using RuntimeData; @@ -6,6 +6,7 @@ using Logic.Multilingual; using Logic.Skill; using TH1_Core.Managers; using Unity.VisualScripting; +using UnityEngine.Serialization; using UnityEngine.UI; @@ -18,7 +19,15 @@ public enum SkillViewType Positive, Max } - + + +public enum SkillPriority +{ + Normal, + Origin, +} + + [Serializable] public struct SkillViewTypeColor { @@ -164,9 +173,9 @@ public class SkillDataAssets : ScriptableObject return t.Color; return Color.black; } - } + [Serializable] public class SkillInfo { @@ -182,8 +191,10 @@ public class SkillInfo //根据不同的unittype对象,呈现不同的图标&说明 public bool HasShowList; public List SkillShowList; + public SkillPriority skillPriority; } + [Serializable] public class SkillInfoShowPack { diff --git a/Unity/Assets/Scripts/TH1_Logic/Skill/SkillBase.cs b/Unity/Assets/Scripts/TH1_Logic/Skill/SkillBase.cs index 0980694db..390e73d0b 100644 --- a/Unity/Assets/Scripts/TH1_Logic/Skill/SkillBase.cs +++ b/Unity/Assets/Scripts/TH1_Logic/Skill/SkillBase.cs @@ -562,6 +562,8 @@ namespace Logic.Skill //如果是叠层且0层的时候会不会自动消失 [MemoryPackInclude] protected bool _autoDisappear; + [MemoryPackInclude] + protected SkillPriority _skillPriority; public virtual int Level => _level; public bool HasLevel => IsLevelSkill; @@ -571,6 +573,7 @@ namespace Logic.Skill public bool ShowSkillLevel => IsLevelSkill && !NoShow; public bool ShowSkill => !IsLevelSkill || ShowSkillLevel; + public SkillPriority SkillPriority => _skillPriority; [MemoryPackConstructor] @@ -584,6 +587,11 @@ namespace Logic.Skill public abstract SkillType GetSkillType(); + public void SetSkillPriority(SkillPriority priority) + { + _skillPriority = priority; + } + public virtual bool IsAllSkillBan() { return false; diff --git a/Unity/Assets/Scripts/TH1_Logic/Skill/SkillFactory.cs b/Unity/Assets/Scripts/TH1_Logic/Skill/SkillFactory.cs index bf2ebc9cd..843620873 100644 --- a/Unity/Assets/Scripts/TH1_Logic/Skill/SkillFactory.cs +++ b/Unity/Assets/Scripts/TH1_Logic/Skill/SkillFactory.cs @@ -38,7 +38,12 @@ namespace Logic.Skill if (_skillDict.TryGetValue(skillType, out var skillClass)) { - return Activator.CreateInstance(skillClass) as SkillBase; + var skillObj = Activator.CreateInstance(skillClass) as SkillBase; + if (skillObj != null && Table.Instance.SkillDataAssets.GetSkillInfo(skillType, out var skillInfo)) + { + skillObj.SetSkillPriority(skillInfo.skillPriority); + } + return skillObj; } return null;