private IEnumerator RepeatDamage(SkillDeployer deployer, SkillData skillData) { float attackTime = 0; do { // 1 对多个目标执行伤害 if (skillData.attackTargets != null && skillData.attackTargets.Length > 0) { for (int i = 0; i < skillData.attackTargets.Length; i++) { OnceDamage(skillData, skillData.attackTargets[i]); } } // 2 等待一个伤害间隔 yield return(new WaitForSeconds(skillData.damageInterval)); attackTime = attackTime + skillData.damageInterval; // ! 那么 damageInterval 不能为0 if (skillData.damageInterval <= 0) { YellowEvents.SendEvent(YellowEventName.error, YellowErrorText.errorSkilldamageInterval + skillData.name); skillData.damageInterval = 0.1f; } // 3 攻击完一次后,重新选取目标 skillData.attackTargets = deployer.ResetTargets(); } while (attackTime <= skillData.durationTime); }
/// <summary> /// 选择目标方法:在攻击的时候,选择{什么范围中的敌人作为}攻击的目标 /// </summary> /// <param name="skillData">技能对象</param> /// <param name="skillOwner">技能拥有者的transform</param> /// <returns>选中的目标</returns> public GameObject[] SelectTarget(SkillData skillData, SkillDeployer skillDeployer) { List <GameObject> list = new List <GameObject>(); // 1 添加技能影响范围的目标 list.AddRange(skillDeployer.enterTrigger.EnterObjs); if (list.Count <= 0) { Debug.LogError("圆形攻击目标为0"); return(null); } Transform depTf = skillDeployer.transform; // 2 从所有攻击目标中 找出攻击范围中活着的敌人 list = list.FindAll(go => Vector3.Distance(go.transform.position, depTf.position) < skillData.attackDistance && go.GetComponent <CharacterStatus>().chBase.HP > 0); if (null == list || list.Count <= 0) { return(null); } // 3 根据释放的技能,选择一个或多个敌人 switch (skillData.attackType) { case SkillAttackType.Single: GameObject obj = ArrayHelper.Min(list.ToArray(), go => Vector3.Distance(go.transform.position, depTf.position)); return(new GameObject[] { obj }); case SkillAttackType.Group: return(list.ToArray()); default: YellowEvents.SendEvent(YellowEventName.error, YellowErrorText.notSkillType); return(null); } }
protected void Start() { if (null == HitFxPos) { HitFxPos = TransformHelper.FindChild(transform, "HitFxPos"); if (null == HitFxPos) { YellowEvents.SendEvent(YellowEventName.error, YellowErrorText.notHitFxPos + gameObject.name); HitFxPos = transform; } } }
/// <summary> /// 受到伤害 /// </summary> public virtual void OnDamage(int damageVal, SkillData skillData) { // 实现 有一部分相同 有一部分不同 > 虚的 damageVal = Mathf.Max(damageVal - chBase.Defence, 0); var min = damageVal * 0.8f; var max = damageVal * 1.2f; damageVal = (int)Mathf.Max(Mathf.Floor(Random.Range(min, max)), 0); YellowEvents.SendEvent(YellowEventName.chatacterDamage, new object[] { gameObject, damageVal }); chBase.HP = Mathf.Max(chBase.HP - damageVal, 0); if (chBase.HP <= 0) { Dead(); } // 有部分不同的 在子类实现 }
public SkillData PrepareSkill(int id) { // 1 按照编号在技能列表中查找 var skillData = skills.Find(s => s.skillID == id); // 2 如果找到 同事 技能冷却结束 而且SP足够 。返回 if (skillData != null) { if (skillData.coolRemain <= 0) { if (skillData.costSP <= skillData.Owner.GetComponent <CharacterStatus>().chBase.SP) { return(skillData); } YellowEvents.SendEvent(YellowEventName.warningTip, YellowConstText.notSp); return(null); } YellowEvents.SendEvent(YellowEventName.warningTip, YellowConstText.notCool); return(null); } YellowEvents.SendEvent(YellowEventName.warningTip, YellowConstText.notKill); // 否则 返回null return(null); }
private void OnDisable() { YellowEvents.SendEvent(YellowEventName.disableStatus, gameObject); }