From 5bfd1103410659fbb523ad25f0e34413fe032ed2 Mon Sep 17 00:00:00 2001 From: chenxin <chenxin6991@163.com> Date: Sat, 05 Dec 2020 18:19:06 +0800 Subject: [PATCH] 水精灵概率触发冰冻 --- Assets/UI/Frost.png.meta | 118 ++++++++++ Assets/Scripts/TowerDefense/Affectors/AttackAffector.cs | 20 - Assets/Scripts/TowerDefense/Agents/Agent.cs | 124 ++++++---- Assets/Scripts/TowerDefense/Level/EndlessBuff/EndlessBuffManager.cs | 3 Assets/Scripts/TowerDefense/UI/FreezeBreath.cs | 40 +++ Assets/Scripts/TowerDefense/Level/EndlessBuff/FrostTimeAdd.cs.meta | 11 + Assets/Scripts/TowerDefense/Level/EndlessBuff/FrostDamageAdd.cs.meta | 11 + Assets/UI/Frost.png | 0 Assets/Scripts/TowerDefense/UI/TextMoveDoTween.cs | 19 + Assets/Scenes/Levels/Battle/Endless2D.unity | 2 Assets/Scripts/TowerDefense/Towers/Projectiles/BallisticAttack.cs | 66 +++++ Assets/Scripts/TowerDefense/UI/HUD/EndlessGameUI.cs | 17 + Assets/Scripts/TowerDefense/Level/EndlessBuff/FrostProbabilityAdd.cs | 29 ++ Assets/Prefabs/UI/FrostWord.prefab | 94 ++++++++ Assets/Scripts/Enum/EndlessBuffEffectType.cs | 9 Assets/Prefabs/UI/FrostWord.prefab.meta | 7 Assets/Scripts/TowerDefense/Level/EndlessBuff/FrostTimeAdd.cs | 34 +++ Assets/StreamingAssets/Table/endless_buff.json | 2 Assets/Scripts/TowerDefense/Level/EndlessBuff/FrostDamageAdd.cs | 29 ++ Assets/Scripts/TowerDefense/Level/EndlessBuff/FrostProbabilityAdd.cs.meta | 11 + 20 files changed, 562 insertions(+), 84 deletions(-) diff --git a/Assets/Prefabs/UI/FrostWord.prefab b/Assets/Prefabs/UI/FrostWord.prefab new file mode 100644 index 0000000..efd0ea7 --- /dev/null +++ b/Assets/Prefabs/UI/FrostWord.prefab @@ -0,0 +1,94 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &3257525538472116254 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3059469595041567074} + - component: {fileID: 598523906858100597} + - component: {fileID: 8715720225615642531} + - component: {fileID: 8223785166565473932} + m_Layer: 5 + m_Name: FrostWord + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3059469595041567074 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3257525538472116254} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 102, y: 42} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &598523906858100597 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3257525538472116254} + m_CullTransparentMesh: 0 +--- !u!114 &8715720225615642531 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3257525538472116254} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 074adf71b94a0ce44aaee741a68eca58, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &8223785166565473932 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3257525538472116254} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f34b2e8d82a07c541958be6bda6fd604, type: 3} + m_Name: + m_EditorClassIdentifier: + bloodText: {fileID: 0} + SlowDownWord: {fileID: 0} + CritWord: {fileID: 0} + FrostWord: {fileID: 8715720225615642531} diff --git a/Assets/Prefabs/UI/FrostWord.prefab.meta b/Assets/Prefabs/UI/FrostWord.prefab.meta new file mode 100644 index 0000000..9d063ad --- /dev/null +++ b/Assets/Prefabs/UI/FrostWord.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f2e6cecab2d55754b97f3ecafba0569c +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/Levels/Battle/Endless2D.unity b/Assets/Scenes/Levels/Battle/Endless2D.unity index 78e090f..1781b49 100644 --- a/Assets/Scenes/Levels/Battle/Endless2D.unity +++ b/Assets/Scenes/Levels/Battle/Endless2D.unity @@ -6846,6 +6846,8 @@ type: 3} CritWord: {fileID: 8715720225615642531, guid: d50687f6a62a08745981a9e471357e9c, type: 3} + FrostWord: {fileID: 8715720225615642531, guid: f2e6cecab2d55754b97f3ecafba0569c, + type: 3} TowerUpgradeEffectPrefab: {fileID: 6847503030253729540, guid: f8ec855cfd7e13a4ebb2f2cbb8bbc480, type: 3} TowerAppearEffectPrefab: {fileID: 1600692593755992933, guid: 3ac90252c12eda44094c4979e1677cbf, diff --git a/Assets/Scripts/Enum/EndlessBuffEffectType.cs b/Assets/Scripts/Enum/EndlessBuffEffectType.cs index 0ede021..d2a6126 100644 --- a/Assets/Scripts/Enum/EndlessBuffEffectType.cs +++ b/Assets/Scripts/Enum/EndlessBuffEffectType.cs @@ -39,5 +39,14 @@ // 减少木属性强化子弹的蓄力时间 DecreaseWoodChargeTime, + + // 增加水精灵冰冻小怪的概率,水精灵普通攻击和技能都有概率造成冰冻,小怪被冰冻后不能移动 + FrostProbabilityAdd, + + // 增加水精灵冰冻伤害,小怪被冰冻后有额外伤害 + FrostDamageAdd, + + // 增加水精灵冰冻时间 + FrostTimeAdd, } } \ No newline at end of file diff --git a/Assets/Scripts/TowerDefense/Affectors/AttackAffector.cs b/Assets/Scripts/TowerDefense/Affectors/AttackAffector.cs index 57b8806..42120af 100644 --- a/Assets/Scripts/TowerDefense/Affectors/AttackAffector.cs +++ b/Assets/Scripts/TowerDefense/Affectors/AttackAffector.cs @@ -456,22 +456,6 @@ if (towerPtr && towerPtr.FreezeBreathCtrl) { Damager damager = projectile.gameObject.GetComponent<Damager>(); - float finalDamage = damager.damage; - - List<EndlessBuffConfig> list = EndlessBuffManager.instance.GetBuffListByEffectType(EndlessBuffEffectType.AttackAdd, towerPtr.ElfId); - float ratio = 0; - float add = 0; - - if (list.Count > 0) - { - for (int i = 0; i < list.Count; ++i) - { - ratio += list[i].Config.buff_effect[1]; - add += list[i].Config.buff_effect[2]; - } - } - - finalDamage += (ratio / 100f) * finalDamage + add; if (inFreezeBreath <= 0) { @@ -488,7 +472,7 @@ towerPtr.PlayFreezeBreathEffect(true); towerPtr.FreezeBreathCtrl.ReleaseCount = 1; towerPtr.FreezeBreathCtrl.PlayFreezeEffect(waveLineID); - towerPtr.FreezeBreathCtrl.ReleaseFreeze(waveLineID, finalDamage, damager.alignmentProvider); + towerPtr.FreezeBreathCtrl.ReleaseFreeze(waveLineID, towerPtr, damager.alignmentProvider); } } else @@ -501,7 +485,7 @@ if (interval == time * (towerPtr.FreezeBreathCtrl.DamageCount - towerPtr.FreezeBreathCtrl.ReleaseCount - 1) + offset && towerPtr.FreezeBreathCtrl.ReleaseCount < towerPtr.FreezeBreathCtrl.DamageCount) { ++towerPtr.FreezeBreathCtrl.ReleaseCount; - towerPtr.FreezeBreathCtrl.ReleaseFreeze(waveLineID, finalDamage, damager.alignmentProvider); + towerPtr.FreezeBreathCtrl.ReleaseFreeze(waveLineID, towerPtr, damager.alignmentProvider); } if (inFreezeBreath <= 0) diff --git a/Assets/Scripts/TowerDefense/Agents/Agent.cs b/Assets/Scripts/TowerDefense/Agents/Agent.cs index a78f418..36e7f02 100644 --- a/Assets/Scripts/TowerDefense/Agents/Agent.cs +++ b/Assets/Scripts/TowerDefense/Agents/Agent.cs @@ -222,10 +222,43 @@ /// </summary> protected bool isSlowDown; + private bool isFrost; + /// <summary> /// 是否处于冰冻状态 /// </summary> - protected bool isFrost; + /// <value></value> + public bool IsFrost + { + get { return isFrost; } + set + { + if (!isFrost) + { + if (value) + { + EndlessGameUI.instance.FloatFrostWord(transform.position); + PlaySlowDownEffect(); + CanMove = false; + } + } + else + { + if (!value) + { + StopSlowDownEffect(); + CanMove = true; + } + } + + isFrost = value; + } + } + + /// <summary> + /// 冰冻剩余时间,< 0时解除冰冻,冰冻期间不会被再次冰冻 + /// </summary> + public float FrostRemainTime { get; set; } /// <summary> /// 中毒粒子特效 @@ -243,15 +276,9 @@ public ParticleSystem SlowDownParticle; /// <summary> - /// 冰冻特效 - /// </summary> - public ParticleSystem FrostParticle; - - /// <summary> /// 被火技能攻击特效 /// </summary> public ParticleSystem FireSkillParticle; - /// <summary> /// 降低移动速度. @@ -570,14 +597,6 @@ protected virtual void SetAgentStopBuff(buffinfo binfo) { MoveStopTime = binfo.last / 1000; - - if (!isFrost) - { - isFrost = true; - - if (FrostParticle != null) - FrostParticle.Play(); - } } /// <summary> @@ -685,12 +704,10 @@ poisonAttid = 0; poisonTimes = 0; timeToPoisonHurt = 0; - isFrost = false; + IsFrost = false; bInDeathAct = false; ChangeState(AgentActionState.Move); configuration.ClearShieldWall(); - - StopFrostParticle(); if (WoodAimCount > 0) WoodAimCount = 0; @@ -710,12 +727,6 @@ // 停止DoTween动画. transform.DOKill(); Destroy(gameObject); - } - - private void StopFrostParticle() - { - if (FrostParticle != null) - FrostParticle.Stop(); } /// <summary> @@ -908,6 +919,21 @@ MoveStopTime = 0.0f; } + private void PlaySlowDownEffect() + { + if (SlowDownParticle != null) + SlowDownParticle.Play(); + } + + private void StopSlowDownEffect() + { + if (SlowDownParticle != null && !isSlowDown && !IsFrost) + { + SlowDownParticle.Stop(); + SlowDownParticle.Clear(); + } + } + /// <summary> /// 根据帧间的时间,来更新Agent的位置信息,其它信息直接删除. /// 1: @@ -915,46 +941,19 @@ /// <param name="deltaTime"></param> protected void updateAgentPos(float deltaTime) { - if ((!m_CurrentNode) || (!m_NextNode)) - return; - - // 是否处于停止状态. - if (MoveStopTime > 0) - { - MoveStopTime -= Time.deltaTime; - if (MoveStopTime <= 0) - { - StopFrostParticle(); - MoveStopTime = 0; - } - else - return; - } - - if (fMoveSpeed == 0) - { - Debug.Log("当前的移动为零:" + fMoveSpeed); - return; - } + if (!m_CurrentNode || !m_NextNode || fMoveSpeed <= 0.0001f) return; float finalSpeed = fMoveSpeed * (1 - speedSlowRate); if (speedSlowRate > 0 && !isSlowDown) { isSlowDown = true; - - if (SlowDownParticle != null) - SlowDownParticle.Play(); + PlaySlowDownEffect(); } else if (speedSlowRate == 0 && isSlowDown) { isSlowDown = false; - - if (SlowDownParticle != null) - { - SlowDownParticle.Stop(); - SlowDownParticle.Clear(); - } + StopSlowDownEffect(); } Vector3 curPos = m_NavMeshAgent.transform.position; @@ -1075,6 +1074,7 @@ { UpdateAction(); HandleShieldWall(); + HandleFrost(); // 处理死亡状态了,不必再移动: if (bInDeathAct || !CanMove) return; @@ -1090,6 +1090,22 @@ updatePoison(Time.deltaTime); } + private void HandleFrost() + { + if (IsFrost) + { + if (FrostRemainTime > 0f) + { + FrostRemainTime -= Time.deltaTime; + + if (FrostRemainTime <= 0f) + IsFrost = false; + } + else + IsFrost = false; + } + } + protected virtual void Update() { diff --git a/Assets/Scripts/TowerDefense/Level/EndlessBuff/EndlessBuffManager.cs b/Assets/Scripts/TowerDefense/Level/EndlessBuff/EndlessBuffManager.cs index 652447f..65a1071 100644 --- a/Assets/Scripts/TowerDefense/Level/EndlessBuff/EndlessBuffManager.cs +++ b/Assets/Scripts/TowerDefense/Level/EndlessBuff/EndlessBuffManager.cs @@ -37,6 +37,9 @@ new FireRateAdd(), new SkillLevelUp(), new DecreaseWoodChargeTime(), + new FrostProbabilityAdd(), + new FrostDamageAdd(), + new FrostTimeAdd() }; } diff --git a/Assets/Scripts/TowerDefense/Level/EndlessBuff/FrostDamageAdd.cs b/Assets/Scripts/TowerDefense/Level/EndlessBuff/FrostDamageAdd.cs new file mode 100644 index 0000000..0b31e1a --- /dev/null +++ b/Assets/Scripts/TowerDefense/Level/EndlessBuff/FrostDamageAdd.cs @@ -0,0 +1,29 @@ +/** + * 13.增加水精灵冰冻伤害 + * @Author: chenxin + * @Date: 2020-12-05 16:26:52 + */ +namespace KTGMGemClient +{ + public class FrostDamageAdd : EndlessBuff + { + /// <summary> + /// 获得冰冻伤害增加(千分比) + /// </summary> + /// <param name="elfId"></param> + /// <returns></returns> + public float GetFrostDamageAdd(int elfId) + { + float ret = 0f; + + for (int i = 0; i < BuffList.Count; ++i) + { + if (!IsEffective(BuffList[i], elfId)) continue; + + ret += BuffList[i].Config.buff_effect[1] / 1000f; + } + + return ret; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/TowerDefense/Level/EndlessBuff/FrostDamageAdd.cs.meta b/Assets/Scripts/TowerDefense/Level/EndlessBuff/FrostDamageAdd.cs.meta new file mode 100644 index 0000000..dad1890 --- /dev/null +++ b/Assets/Scripts/TowerDefense/Level/EndlessBuff/FrostDamageAdd.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1989b6d565d1b4448a03c6d1990891d7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/TowerDefense/Level/EndlessBuff/FrostProbabilityAdd.cs b/Assets/Scripts/TowerDefense/Level/EndlessBuff/FrostProbabilityAdd.cs new file mode 100644 index 0000000..b62e46f --- /dev/null +++ b/Assets/Scripts/TowerDefense/Level/EndlessBuff/FrostProbabilityAdd.cs @@ -0,0 +1,29 @@ +/** + * 12.增加水精灵冰冻小怪的概率 + * @Author: chenxin + * @Date: 2020-12-05 16:26:20 + */ +namespace KTGMGemClient +{ + public class FrostProbabilityAdd : EndlessBuff + { + /// <summary> + /// 获得冰冻概率 + /// </summary> + /// <param name="elfId">精灵id</param> + /// <returns></returns> + public float GetFrostProbaility(int elfId) + { + float ret = 0f; + + for (int i = 0; i < BuffList.Count; ++i) + { + if (!IsEffective(BuffList[i], elfId)) continue; + + ret += BuffList[i].Config.buff_effect[1] / 1000f; + } + + return ret; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/TowerDefense/Level/EndlessBuff/FrostProbabilityAdd.cs.meta b/Assets/Scripts/TowerDefense/Level/EndlessBuff/FrostProbabilityAdd.cs.meta new file mode 100644 index 0000000..f2615f0 --- /dev/null +++ b/Assets/Scripts/TowerDefense/Level/EndlessBuff/FrostProbabilityAdd.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d646272b865278e43940747659f5b397 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/TowerDefense/Level/EndlessBuff/FrostTimeAdd.cs b/Assets/Scripts/TowerDefense/Level/EndlessBuff/FrostTimeAdd.cs new file mode 100644 index 0000000..95cbb52 --- /dev/null +++ b/Assets/Scripts/TowerDefense/Level/EndlessBuff/FrostTimeAdd.cs @@ -0,0 +1,34 @@ +/** + * 14.增加水精灵冰冻时间 + * @Author: chenxin + * @Date: 2020-12-05 16:27:29 + */ +namespace KTGMGemClient +{ + public class FrostTimeAdd : EndlessBuff + { + /// <summary> + /// 默认冰冻时间 + /// </summary> + public static readonly float DefaultFrostTime = 2f; + + /// <summary> + /// 获得冰冻时间 + /// </summary> + /// <param name="elfId"></param> + /// <returns></returns> + public float GetFrostTime(int elfId) + { + float ret = 0f; + + for (int i = 0; i < BuffList.Count; ++i) + { + if (!IsEffective(BuffList[i], elfId)) continue; + + ret += BuffList[i].Config.buff_effect[1]; + } + + return ret + DefaultFrostTime; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/TowerDefense/Level/EndlessBuff/FrostTimeAdd.cs.meta b/Assets/Scripts/TowerDefense/Level/EndlessBuff/FrostTimeAdd.cs.meta new file mode 100644 index 0000000..9dc7170 --- /dev/null +++ b/Assets/Scripts/TowerDefense/Level/EndlessBuff/FrostTimeAdd.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 64857f832e43bdf43b6d7837092c3dd9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/TowerDefense/Towers/Projectiles/BallisticAttack.cs b/Assets/Scripts/TowerDefense/Towers/Projectiles/BallisticAttack.cs index 4a4c89c..bb293f6 100644 --- a/Assets/Scripts/TowerDefense/Towers/Projectiles/BallisticAttack.cs +++ b/Assets/Scripts/TowerDefense/Towers/Projectiles/BallisticAttack.cs @@ -1,9 +1,7 @@ using ActionGameFramework.Health; -using System; using TowerDefense.Agents; using TowerDefense.UI.HUD; using UnityEngine; -using System.Collections.Generic; using KTGMGemClient; namespace TowerDefense.Towers.Projectiles @@ -81,9 +79,9 @@ /// 判断本次伤害是否暴击 /// </summary> /// <returns></returns> - private bool IsCrit() + public static bool IsCrit(int elfId) { - elf_info info = ElfInfoData.GetDataById(TowerPtr.ElfId); + elf_info info = ElfInfoData.GetDataById(elfId); float crit = 0f; if (info != null) @@ -92,7 +90,7 @@ CritProbabilityAdd critProbabilityAdd = (CritProbabilityAdd)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.CritProbabilityAdd); if (critProbabilityAdd != null) - crit = critProbabilityAdd.GetCrit(TowerPtr.ElfId, crit); + crit = critProbabilityAdd.GetCrit(elfId, crit); float random = UnityEngine.Random.Range(0, 1f); @@ -103,11 +101,11 @@ /// 获取暴击伤害增加比率 /// </summary> /// <returns></returns> - private float GetCritDamageRate() + public static float GetCritDamageRate(int elfId) { CritDamageAdd critDamageAdd = (CritDamageAdd)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.CritDamageAdd); - return critDamageAdd == null ? 0 : critDamageAdd.GetCritDamageRate(TowerPtr.ElfId); + return critDamageAdd == null ? 0 : critDamageAdd.GetCritDamageRate(elfId); } /// <summary> @@ -124,17 +122,19 @@ if (EndlessBuffManager.instanceExists) basicDamage += EndlessBuffManager.instance.ProcessEndlessBuffAttack(basicDamage, TowerPtr.ElfId); - bool crit = IsCrit(); + bool crit = IsCrit(TowerPtr.ElfId); if (crit) { float basicCritDamageRate = info != null ? info.b_critdmg / 1000f : 0f; - basicDamage *= 1 + basicCritDamageRate + GetCritDamageRate(); + basicDamage *= 1 + basicCritDamageRate + GetCritDamageRate(TowerPtr.ElfId); } // 玉米强化子弹10倍伤害 if (isEnhancedBullet) basicDamage *= 10f; + + bool needFrost = HandleWaterFrost(TowerPtr.ElfId, (enemy as Agent), ref basicDamage); int deathCount = 0; @@ -170,6 +170,16 @@ } } + if (!enemy.isDead && needFrost) + { + (enemy as Agent).IsFrost = true; + (enemy as Agent).FrostRemainTime = FrostTimeAdd.DefaultFrostTime; + FrostTimeAdd frostTimeAdd = (FrostTimeAdd)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.FrostTimeAdd); + + if (frostTimeAdd != null) + (enemy as Agent).FrostRemainTime = frostTimeAdd.GetFrostTime(TowerPtr.ElfId); + } + // 播放受击动画: if (!enemy.isDead && enemy.liveID == tid) { @@ -182,6 +192,44 @@ } /// <summary> + /// 处理水精灵冰冻 + /// </summary> + /// <param name="elfId"></param> + /// <param name="enemy"></param> + /// <param name="basicDamage"></param> + /// <returns>是否需要冰冻,如果直接被打死就无所谓了,也不要飘字</returns> + public static bool HandleWaterFrost(int elfId, Agent enemy, ref float basicDamage) + { + bool needFrost = false; + + if (elfId != 201) return needFrost; + + // 处理冰冻状态中的额外伤害 + if (enemy.IsFrost) + { + FrostDamageAdd frostDamageAdd = (FrostDamageAdd)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.FrostDamageAdd); + + if (frostDamageAdd != null) + basicDamage *= (1 + frostDamageAdd.GetFrostDamageAdd(elfId)); + } + else + { + FrostProbabilityAdd frostProbabilityAdd = (FrostProbabilityAdd)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.FrostProbabilityAdd); + + if (frostProbabilityAdd != null) + { + float probaility = frostProbabilityAdd.GetFrostProbaility(elfId); + float random = UnityEngine.Random.Range(0, 1); + + if (random <= probaility) + needFrost = true; + } + } + + return needFrost; + } + + /// <summary> /// 处理塔位的属性攻击 /// </summary> /// <param name="enemy"></param> diff --git a/Assets/Scripts/TowerDefense/UI/FreezeBreath.cs b/Assets/Scripts/TowerDefense/UI/FreezeBreath.cs index 28b05e4..e661dee 100644 --- a/Assets/Scripts/TowerDefense/UI/FreezeBreath.cs +++ b/Assets/Scripts/TowerDefense/UI/FreezeBreath.cs @@ -1,5 +1,4 @@ using UnityEngine.UI; -using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; @@ -8,6 +7,8 @@ using TowerDefense.Agents; using Core.Health; using TowerDefense.UI.HUD; +using TowerDefense.Towers; +using TowerDefense.Towers.Projectiles; /** * 水精灵技能-冷冻气息控制脚本 @@ -83,7 +84,7 @@ /// </summary> /// <param name="waveLineId">哪条兵线</param> /// <param name="damage">伤害值</param> - public void ReleaseFreeze(int waveLineId, float damage, IAlignmentProvider alignmentProvider) + public void ReleaseFreeze(int waveLineId, Tower tower, IAlignmentProvider alignmentProvider) { WaveLineAgentInsMgr[] agentInsMgrs = AgentInsManager.instance.GetWaveLineList(); WaveLineAgentInsMgr waveLineAgentInsMgr = agentInsMgrs[waveLineId]; @@ -110,6 +111,8 @@ if (agent.AgentType == SpawnAgentType.Normal) { + float damage = GetFinalDamage(tower, agent); + bool needFrost = BallisticAttack.HandleWaterFrost(201, agent, ref damage); agent.addSpeedSlowRate(0.15f); agent.PlayOnHitImmediately(); EndlessGameUI.instance.FloatSlowDownWord(agent.position); @@ -117,6 +120,15 @@ if (agent.isDead) ++deathCount; + else if (needFrost) + { + agent.IsFrost = true; + agent.FrostRemainTime = FrostTimeAdd.DefaultFrostTime; + FrostTimeAdd frostTimeAdd = (FrostTimeAdd)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.FrostTimeAdd); + + if (frostTimeAdd != null) + agent.FrostRemainTime = frostTimeAdd.GetFrostTime(201); + } } else if (agent.AgentType == SpawnAgentType.BubbleBomb) EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.EndlessBossSkillBubbleBombGetHit, (agent as BubbleBombAgent).Id); @@ -126,6 +138,30 @@ EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.EndlessOneTimeKillCount, deathCount); } + private float GetFinalDamage(Tower tower, Agent agent) + { + if (tower == null || agent == null) return 0; + + int elfId = 201; + // 基础伤害 = elf_info 基础攻击力 * elf_upgrade 攻击比率 / 1000f + float basicDamage = ElfInfoData.GetBasicDamage(elfId, tower.currentLevel); + elf_info info = ElfInfoData.GetDataById(elfId); + + // 处理PVE无尽模式,buff增加的伤害 + if (EndlessBuffManager.instanceExists) + basicDamage += EndlessBuffManager.instance.ProcessEndlessBuffAttack(basicDamage, elfId); + + bool crit = BallisticAttack.IsCrit(elfId); + + if (crit) + { + float basicCritDamageRate = info != null ? info.b_critdmg / 1000f : 0f; + basicDamage *= 1 + basicCritDamageRate + BallisticAttack.GetCritDamageRate(elfId); + } + + return basicDamage; + } + public void PlayFreezeEffect(int waveLineId) { WaveLineAgentInsMgr[] agentInsMgrs = AgentInsManager.instance.GetWaveLineList(); diff --git a/Assets/Scripts/TowerDefense/UI/HUD/EndlessGameUI.cs b/Assets/Scripts/TowerDefense/UI/HUD/EndlessGameUI.cs index ac3e2a0..d4374be 100644 --- a/Assets/Scripts/TowerDefense/UI/HUD/EndlessGameUI.cs +++ b/Assets/Scripts/TowerDefense/UI/HUD/EndlessGameUI.cs @@ -133,6 +133,11 @@ public Image CritWord; /// <summary> + /// 冰冻飘字 + /// </summary> + public Image FrostWord; + + /// <summary> /// 购买塔防按钮上的Text. /// </summary> protected TextMeshProUGUI towerPriceText; @@ -2052,6 +2057,18 @@ obj.GetComponent<TextMoveDoTween>().FloatCritWord(screenPos.x, screenPos.y); } + /// <summary> + /// 冰冻飘字 + /// </summary> + /// <param name="worldPos"></param> + public void FloatFrostWord(Vector3 worldPos) + { + Vector3 screenPos = m_Camera.WorldToScreenPoint(worldPos); + GameObject obj = Instantiate(FrostWord.gameObject); + obj.GetComponent<Transform>().SetParent(GameObject.Find("MainUI/TextPanel").GetComponent<Transform>(), false); + obj.GetComponent<TextMoveDoTween>().FloatFrostWord(screenPos.x, screenPos.y); + } + private void Start() { // 获取相应的放置区域。 diff --git a/Assets/Scripts/TowerDefense/UI/TextMoveDoTween.cs b/Assets/Scripts/TowerDefense/UI/TextMoveDoTween.cs index 268a687..9d9466d 100644 --- a/Assets/Scripts/TowerDefense/UI/TextMoveDoTween.cs +++ b/Assets/Scripts/TowerDefense/UI/TextMoveDoTween.cs @@ -12,6 +12,8 @@ public Image CritWord; + public Image FrostWord; + private float scaleOffect = 1.5f; /// <summary> @@ -92,6 +94,23 @@ sequence.AppendCallback(() => { DestroyWord(); }); } + public void FloatFrostWord(float x, float y) + { + Vector3 pos = FrostWord.transform.position; + pos.x = x; + pos.y = y; + pos.z = 0; + FrostWord.transform.position = pos; + + Sequence sequence = DOTween.Sequence(); + FrostWord.color = new Color(1f, 1f, 1f, 0.8f); + sequence.Join(DOTween.To(() => FrostWord.transform.position, (Vector3 v) => FrostWord.transform.position = v, + new Vector3(FrostWord.transform.position.x + 70 + UnityEngine.Random.Range(-15, 15), FrostWord.transform.position.y + 70 + UnityEngine.Random.Range(-15, 15), FrostWord.transform.position.z), 0.2f)); + sequence.Append(DOTween.To(() => FrostWord.color, (Color v) => FrostWord.color = v, new Color(1f, 1f, 1f, 1f), 0.2f).SetEase(Ease.OutQuart)); + sequence.Append(DOTween.To(() => FrostWord.color, (Color v) => FrostWord.color = v, new Color(1f, 1f, 1f, 0f), 0.3f).SetDelay(1f)); + sequence.AppendCallback(() => { DestroyWord(); }); + } + private void WordMove(Graphic graphic, bool crit = false) { //获得Text的rectTransform,和颜色,并设置颜色微透明 diff --git a/Assets/StreamingAssets/Table/endless_buff.json b/Assets/StreamingAssets/Table/endless_buff.json index 7a87e65..2d1f724 100644 --- a/Assets/StreamingAssets/Table/endless_buff.json +++ b/Assets/StreamingAssets/Table/endless_buff.json @@ -1 +1 @@ -[["1","低级火灵之力",[2,1],[1,10,0],"-1","增加全体火精灵10%攻击力","6","8",10001,1,"99"],["2","低级水灵之力",[2,2],[1,12,0],-1,"增加全体水精灵12%攻击力",6,8,10002,1,"99"],["3","低级木灵之力",[2,3],[1,15,0],-1,"增加全体木精灵15%攻击力",6,8,10003,1,"99"],["4","攻击力增加",[1,0],[1,8,0],"-1","增加全体8%攻击力","0",5,"10005","1","99"],["5","意外收获",[0],[2,200,0],0,"增加200金币","0","5","10007","1","99"],["6","精灵魔盒",[0],[3,2,200],0,"随机获得一个2级精灵","2","4",10006,"1","10"],["7","暴击增加",[1,0],[5,50,0],-1,"全体暴击率+5%","0","3","10021","1","3"],["8","爆伤增加",[1,0],[6,80,0],-1,"全体暴击伤害+8%","0","3","10022","1","2"],["9","火灵之力",[2,1],[1,20,0],-1,"增加全体火精灵20%攻击力",9,12,10001,2,"99"],["10","水灵之力",[2,2],[1,24,0],-1,"增加全体水精灵24%攻击力",9,12,10002,2,"99"],["11","木灵之力",[2,3],[1,30,0],-1,"增加全体木精灵30%攻击力",9,12,10003,2,"99"],["12","精灵之力",[1,0],[1,50,0],2,"2波增加全体精灵50%攻击力","99",99,"10005",2,1],["13","飞来横财",[0],[2,400,0],0,"增加400金币","6","8","10008","2","99"],["14","超级精灵魔盒",[0],[3,3,400],0,"随机获得一个3级精灵","5","7",10006,"2","10"],["15","暴击增加",[1,0],[5,100,0],-1,"全体暴击率+10%","4","7","10021","2","3"],["16","爆伤增加",[1,0],[6,150,0],-1,"全体暴击伤害+15%","4","7","10022","2","2"],["17","攻速增加",[1,0],[4,0.1,0.5],"-1","全体攻速+10%","0","5","10023","2","1"],["18","弹夹扩容",[3,301],[7,2,0],-1,"玉米精灵高能子弹+1",6,99,"10016","2","1"],["19","爆裂狂怒",[3,101],[9,7,0],-1,"火鸟精灵充能后攻速+35%",6,99,"10026","2","1"],["20","高级火灵之力",[2,1],[1,30,0],-1,"增加全体火精灵30%攻击力",13,"16","10001",3,"99"],["21","高级水灵之力",[2,2],[1,35,0],-1,"增加全体水精灵35%攻击力",13,"16","10002",3,"99"],["22","高级木灵之力",[2,3],[1,40,0],-1,"增加全体木精灵40%攻击力",13,"16","10003",3,"99"],["23","特级火灵之力",[2,1],[1,40,0],-1,"增加全体火精灵40%攻击力","17","99","10001","4","0"],["24","特级水灵之力",[2,2],[1,50,0],-1,"增加全体水精灵50%攻击力","17","99","10002","4","0"],["25","特级木灵之力",[2,3],[1,60,0],-1,"增加全体木精灵60%攻击力","17","99","10003","4","0"],["26","狂暴之力",[1,0],[1,65,0],2,"2波内增加全体精灵65%攻击力","99",99,10005,3,1],["27","攻速增加_水",[2,2],[4,0.25,0.5],-1,"水精灵攻速+25%","6",99,"10019",3,"2"],["28","攻速增加_火",[2,1],[4,0.3,0.5],-1,"火精灵攻速+30%",6,99,"10013",3,"2"],["29","攻速增加_木",[2,3],[4,0.2,0.5],-1,"木精灵攻速+20%",6,99,"10017",3,"2"],["30","暴击_木",[3,301],[5,300,0],-1,"木系精灵暴击率+30%",6,99,"10015",3,"2"],["31","暴怒_木",[3,301],[6,350,0],-1,"木系精灵暴击伤害+35%",6,99,"10014",3,"2"],["32","暴击_火",[3,101],[5,150,0],-1,"火系精灵暴击率+15%",6,99,"10012",3,"3"],["33","暴怒_火",[3,101],[6,200,0],-1,"火系精灵暴击伤害+20%",6,99,"10011",3,"2"],["34","暴击_水",[3,201],[5,300,0],-1,"水系精灵暴击率+30%",6,99,"10019",3,"2"],["35","暴怒_水",[3,201],[6,350,0],-1,"水系精灵暴击伤害+35%",6,99,"10020",3,"2"],["36","超级弹夹",[3,301],[7,3,0],-1,"玉米精灵高能子弹+2","9",99,"10016","4","1"],["37","超级爆裂狂怒",[3,101],[9,9,0],-1,"火鸟精灵充能后攻速+60%","9",99,"10026","4","1"],["38","技能提升",[4,0],[10,1,0],-1,"全体技能等级+1",6,99,"10005",3,"4"],["39","快速蓄能",[3,301],[11,0.3,0.8],-1,"玉米精灵蓄力时间-30%","7",99,"10018","4","3"],["40","中大奖",[0],[2,800,0],0,"增加800金币","9",99,"10010","3","99"],["41","特级精灵魔盒",[0],[3,4,800],0,"随机获得一个4级精灵","11","99","10006","4","2"]] \ No newline at end of file +[["1","低级火灵之力",[2,1],[1,10,0],"-1","增加全体火精灵10%攻击力","6","8",10001,1,"99"],["2","低级水灵之力",[2,2],[1,12,0],-1,"增加全体水精灵12%攻击力",6,8,10002,1,"99"],["3","低级木灵之力",[2,3],[1,15,0],-1,"增加全体木精灵15%攻击力",6,8,10003,1,"99"],["4","攻击力增加",[1,0],[1,8,0],"-1","增加全体8%攻击力","0",5,"10005","1","99"],["5","意外收获",[0],[2,200,0],0,"增加200金币","0","5","10007","1","99"],["6","精灵魔盒",[0],[3,2,200],0,"随机获得一个2级精灵","2","4",10006,"1","10"],["7","暴击增加",[1,0],[5,50,0],-1,"全体暴击率+5%","0","3","10021","1","3"],["8","爆伤增加",[1,0],[6,80,0],-1,"全体暴击伤害+8%","0","3","10022","1","2"],["9","火灵之力",[2,1],[1,20,0],-1,"增加全体火精灵20%攻击力",9,12,10001,2,"99"],["10","水灵之力",[2,2],[1,24,0],-1,"增加全体水精灵24%攻击力",9,12,10002,2,"99"],["11","木灵之力",[2,3],[1,30,0],-1,"增加全体木精灵30%攻击力",9,12,10003,2,"99"],["12","精灵之力",[1,0],[1,50,0],2,"2波增加全体精灵50%攻击力","99",99,"10005",2,1],["13","飞来横财",[0],[2,400,0],0,"增加400金币","6","8","10008","2","99"],["14","超级精灵魔盒",[0],[3,3,400],0,"随机获得一个3级精灵","5","7",10006,"2","10"],["15","暴击增加",[1,0],[5,100,0],-1,"全体暴击率+10%","4","7","10021","2","3"],["16","爆伤增加",[1,0],[6,150,0],-1,"全体暴击伤害+15%","4","7","10022","2","2"],["17","攻速增加",[1,0],[4,0.1,0.5],"-1","全体攻速+10%","0","5","10023","2","1"],["18","弹夹扩容",[3,301],[7,2,0],-1,"玉米精灵高能子弹+1",6,99,"10016","2","1"],["19","爆裂狂怒",[3,101],[9,7,0],-1,"火鸟精灵充能后攻速+35%",6,99,"10026","2","1"],["20","高级火灵之力",[2,1],[1,30,0],-1,"增加全体火精灵30%攻击力",13,"16","10001",3,"99"],["21","高级水灵之力",[2,2],[1,35,0],-1,"增加全体水精灵35%攻击力",13,"16","10002",3,"99"],["22","高级木灵之力",[2,3],[1,40,0],-1,"增加全体木精灵40%攻击力",13,"16","10003",3,"99"],["23","特级火灵之力",[2,1],[1,40,0],-1,"增加全体火精灵40%攻击力","17","99","10001","4","0"],["24","特级水灵之力",[2,2],[1,50,0],-1,"增加全体水精灵50%攻击力","17","99","10002","4","0"],["25","特级木灵之力",[2,3],[1,60,0],-1,"增加全体木精灵60%攻击力","17","99","10003","4","0"],["26","狂暴之力",[1,0],[1,65,0],2,"2波内增加全体精灵65%攻击力","99",99,10005,3,1],["27","攻速增加_水",[2,2],[4,0.25,0.5],-1,"水精灵攻速+25%","6",99,"10019",3,"2"],["28","攻速增加_火",[2,1],[4,0.3,0.5],-1,"火精灵攻速+30%",6,99,"10013",3,"2"],["29","攻速增加_木",[2,3],[4,0.2,0.5],-1,"木精灵攻速+20%",6,99,"10017",3,"2"],["30","暴击_木",[3,301],[5,300,0],-1,"木系精灵暴击率+30%",6,99,"10015",3,"2"],["31","暴怒_木",[3,301],[6,350,0],-1,"木系精灵暴击伤害+35%",6,99,"10014",3,"2"],["32","暴击_火",[3,101],[5,150,0],-1,"火系精灵暴击率+15%",6,99,"10012",3,"3"],["33","暴怒_火",[3,101],[6,200,0],-1,"火系精灵暴击伤害+20%",6,99,"10011",3,"2"],["34","暴击_水",[3,201],[5,300,0],-1,"水系精灵暴击率+30%",6,99,"10019",3,"2"],["35","暴怒_水",[3,201],[6,350,0],-1,"水系精灵暴击伤害+35%",6,99,"10020",3,"2"],["36","超级弹夹",[3,301],[7,3,0],-1,"玉米精灵高能子弹+2","9",99,"10016","4","1"],["37","超级爆裂狂怒",[3,101],[9,9,0],-1,"火鸟精灵充能后攻速+60%","9",99,"10026","4","1"],["38","技能提升",[4,0],[10,1,0],-1,"全体技能等级+1",6,99,"10005",3,"4"],["39","快速蓄能",[3,301],[11,0.3,0.8],-1,"玉米精灵蓄力时间-30%","7",99,"10018","4","3"],["40","中大奖",[0],[2,800,0],0,"增加800金币","9",99,"10010","3","99"],["41","特级精灵魔盒",[0],[3,4,800],0,"随机获得一个4级精灵","11","99","10006","4","2"],[42,"寒气_水",[3,201],[12,120,0],0,"水精灵任意攻击冰冻概率+12%",4,"99","10011",3,"3"],[43,"冻伤_水",[3,201],[13,300,0],0,"水精灵对冰冻的敌人伤害+30%",6,"99","10011",3,4],[44,"冰冻延时",[3,201],[14,1,0],0,"水精灵冰冻时间+1秒",7,"99","10011",3,3]] \ No newline at end of file diff --git a/Assets/UI/Frost.png b/Assets/UI/Frost.png new file mode 100644 index 0000000..e93fde9 --- /dev/null +++ b/Assets/UI/Frost.png Binary files differ diff --git a/Assets/UI/Frost.png.meta b/Assets/UI/Frost.png.meta new file mode 100644 index 0000000..b1b2cf8 --- /dev/null +++ b/Assets/UI/Frost.png.meta @@ -0,0 +1,118 @@ +fileFormatVersion: 2 +guid: 074adf71b94a0ce44aaee741a68eca58 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: 4 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: -- Gitblit v1.9.1