/// <summary>
        /// 尝试攻击另一单位,damage就是攻击力
        /// </summary>
        /// <param name="self"></param>
        /// <param name="other"></param>
        /// <param name="damage"></param>
        /// <returns>有效攻击返回True,否则返回False</returns>
        public static bool TryAttackSimple(this AbstractPerson self, AbstractPerson other)
        {
            var selfAtk  = self as ITakeDamageablePerson <AbstractPerson>;
            var otherAtk = other as ITakeDamageablePerson <AbstractPerson>;

            if (null == self)
            {
                throw new Exception("自身角色为空?");
            }

            if (null == other)
            {
                return(false);
            }

            if (!self.IsAlive || !other.IsAlive)
            {
                return(false);
            }

            if (null == selfAtk || null == otherAtk)
            {
                return(false);
            }

            selfAtk.OnCauseDamage(other, self.Attack);
            otherAtk.OnTakeDamage(self, self.Attack);

            return(true);
        }
        /// <summary>
        /// 尝试攻击另一单位
        /// </summary>
        /// <param name="self">自身角色</param>
        /// <param name="other">攻击目标</param>
        /// <param name="damageScale">攻击缩放,比如技能可能造成200%伤害</param>
        /// <returns>返回是否进行了有效攻击</returns>
        /// <exception cref="Exception">self为空</exception>
        public static bool TryAttack(this AbstractPerson self, AbstractPerson other, float?damageScale = null)
        {
            var ds = damageScale ?? 1.0f;

            var selfAtk  = self as ITakeDamageablePerson <AbstractPerson, BasicDamage>;
            var otherAtk = other as ITakeDamageablePerson <AbstractPerson, BasicDamage>;

            if (null == self)
            {
                throw new Exception("自身角色为空?");
            }

            if (null == other)
            {
                return(false);
            }

            if (!self.IsAlive || !other.IsAlive)
            {
                return(false);
            }

            if (null == selfAtk || null == otherAtk)
            {
                return(false);
            }

            var damage = self.CalculateDamage(ds, other);

            selfAtk.OnCauseDamage(other, damage);

            return(true);
        }
        public virtual float OnCauseDamage(AbstractPerson causeDamageTo, BasicDamage damage)
        {
            var realDamage = causeDamageTo.OnTakeDamage(this, damage);

            if (realDamage > 0)
            {
                onCauseDamage?.Invoke(causeDamageTo, Mathf.RoundToInt(realDamage));
            }
            return(realDamage);
//            Debug.Log($"{CharacterName}对{causeDamageTo.CharacterName}造成{realDamage}伤害");
        }
示例#4
0
        public virtual void OnTakeDamage(AbstractPerson takeDamageFrom, int damage)
        {
            Debug.Log($"{CharacterName}收到来自{takeDamageFrom.CharacterName}的{damage}伤害");

            onTakeDamage?.Invoke(takeDamageFrom, damage);
            _hp -= damage;
            if (_hp <= 0)
            {
                Debug.Log(CharacterName + "该死!");
                Kill();
            }
        }
        public virtual void OnTakeDamage(AbstractPerson takeDamageFrom, int damage)
        {
            onTakeDamage?.Invoke(takeDamageFrom, damage);
            Hp -= damage;
//            Debug.Log($"{CharacterName}收到来自{takeDamageFrom.CharacterName}的{damage}伤害,当前血量:{Hp}");

            if (Hp <= 0)
            {
//                Debug.Log(CharacterName+"该死!");
                Hp = 0;
                Kill();
            }
        }
        public virtual float OnTakeDamage(AbstractPerson takeDamageFrom, BasicDamage damage)
        {
            var finalDamage = Mathf.RoundToInt(damage.Damage);

            onTakeDamage?.Invoke(takeDamageFrom, finalDamage);
            Hp -= finalDamage;
//            Debug.Log($"{CharacterName}收到来自{takeDamageFrom.CharacterName}的{finalDamage}伤害,当前血量:{Hp}");

            var realDamage = 0f;

            if (Hp <= 0)
            {
                realDamage = Hp;
//                Debug.Log(CharacterName+"该死!");
                Hp = 0;
                LogicKill();
            }
            else
            {
                realDamage = finalDamage;
            }

            return(realDamage);
        }
        public virtual void OnCauseDamage(AbstractPerson causeDamageTo, int damage)
        {
            onCauseDamage?.Invoke(causeDamageTo, damage);
//            Debug.Log($"{CharacterName}对{causeDamageTo.CharacterName}造成{damage}伤害");
        }
 public virtual void InitController(AbstractPerson self)
 {
     this.selfPerson = self;
 }
 public virtual BasicDamage CalculateDamage(float skillDamageScale, AbstractPerson receiver)
 {
     return(new BasicDamage(this, skillDamageScale, receiver));
 }