示例#1
0
        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);
        }
示例#2
0
        /// <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);
            }
        }
示例#3
0
 protected void Start()
 {
     if (null == HitFxPos)
     {
         HitFxPos = TransformHelper.FindChild(transform, "HitFxPos");
         if (null == HitFxPos)
         {
             YellowEvents.SendEvent(YellowEventName.error, YellowErrorText.notHitFxPos + gameObject.name);
             HitFxPos = transform;
         }
     }
 }
示例#4
0
        /// <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();
            }

            // 有部分不同的 在子类实现
        }
示例#5
0
        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);
        }
示例#6
0
 private void OnDisable()
 {
     YellowEvents.SendEvent(YellowEventName.disableStatus, gameObject);
 }