コード例 #1
0
    //统计CanBeFighted中的信息,包括统计相关、受击次数、毛伤害总和、最大打断类型
    protected virtual void SetStatistic()
    {
        hasSetStatistic = true;
        if (!hasBeenInitialized)
        {
            Debug.LogError("在Defence中,没有初始化该组件!");
        }

        AttackInterruptType localMaxInterrupt = AttackInterruptType.NONE;
        int localDamageSum = 0;

        if (attackedCheck.hasBeenAttacked())
        {
            foreach (AttackContent attack in attackedCheck.GetAttackedList())
            {
                if ((int)localMaxInterrupt < (int)attack.interruptType)
                {
                    localMaxInterrupt = attack.interruptType;
                }
                localDamageSum += attack.damage;
            }
        }

        maxInterrupt = localMaxInterrupt;
        damageSum    = localDamageSum;
        attackNum    = attackedCheck.getAttackNum();
    }
コード例 #2
0
 /// <summary>
 /// 对一个能够战斗的目标造成伤害,作为底层私有函数被调用
 /// </summary>
 /// <param name="target">造成伤害的目标</param>
 /// <param name="damage">造成输入数值的伤害</param>
 /// <param name="interruptType">攻击打断类型,默认为无打断</param>
 /// <returns>返回造成了多少伤害,具体用法有待进一步讨论</returns>
 public int Attack(CanBeFighted target, int damage, AttackInterruptType interruptType = AttackInterruptType.NONE, ElementAbilityManager.Element element = ElementAbilityManager.Element.NULL)
 {
     if (!isInitialized)
     {
         Debug.LogError("在" + gameObject.name + "物体中,CanFight组件未初始化!");
     }
     return(target.BeAttacked(gameObject, damage, interruptType, element));
 }
コード例 #3
0
    //private CanBeFightedManager magener;

    /// <summary>
    /// 被攻击时调用,将攻击信息记录到受击信息数组中去
    /// </summary>
    /// <param name="who">伤害来源</param>
    /// <param name="damage">造成的伤害,并不判定是否合法</param>
    /// <returns>返回具体造成的伤害</returns>
    public virtual int BeAttacked(GameObject who, int damage, AttackInterruptType interruptType, ElementAbilityManager.Element element = ElementAbilityManager.Element.NULL)
    {
        if (!isImmune)
        {
            if (attackListPointer >= ATTACK_LIST_MAX_SIZE)
            {
                Debug.LogError("在" + gameObject.name + "物体中,在一帧中beAttacked数量超过上限" + ATTACK_LIST_MAX_SIZE);
                attackListPointer = 0;
            }
            isAttacked = true;
            beAttackedList[attackListPointer] = new AttackContent(who, damage, interruptType);
            attackListPointer++;
            Debug.Log(gameObject.name + "收到了来自" + who.name + "的攻击,栈顶指针为" + attackListPointer);

            return(damage);
        }
        return(0);
    }
コード例 #4
0
    /// <summary>
    /// 判断攻击类型,并触发机关
    /// </summary>
    /// <param name="who"></param>
    /// <param name="damage"></param>
    /// <param name="interruptType"></param>
    /// <param name="element"></param>
    /// <returns></returns>
    public override int BeAttacked(GameObject who, int damage, AttackInterruptType interruptType, ElementAbilityManager.Element element = ElementAbilityManager.Element.NULL)
    {
        if (element == ElementAbilityManager.Element.Fire)
        {
            mechanism.Trigger(Mechanism.TiggerType.Fire);
        }
        else if (element == ElementAbilityManager.Element.Ice)
        {
            mechanism.Trigger(Mechanism.TiggerType.Ice);
        }
        else if (element == ElementAbilityManager.Element.Wind)
        {
            mechanism.Trigger(Mechanism.TiggerType.Wind);
        }
        else if (element == ElementAbilityManager.Element.Thunder)
        {
            mechanism.Trigger(Mechanism.TiggerType.Thunder);
        }

        return(0);
    }
コード例 #5
0
    /// <summary>
    /// 范围性攻击,实现方法为输入表示范围的Collier2D,检测范围内的每个拥有CanBeFighted的敌人,调用BeAttacked
    /// </summary>
    /// <param name="area">表示攻击范围的collier2d, 应该为trigger态</param>
    /// <param name="damage">该次范围攻击造成了多少伤害</param>
    /// <param name="interruptType">该次攻击为何种打断类型</param>
    /// <returns>返回攻击到的敌人对象的CanBeFighted组件的数组</returns>
    public CanBeFighted[] AttackArea(Collider2D area, int damage, AttackInterruptType interruptType = AttackInterruptType.NONE, ElementAbilityManager.Element element = ElementAbilityManager.Element.NULL)
    {
        //输入范围需要Trigger才行
        if (!area.isTrigger)
        {
            Debug.LogError("在" + gameObject.name + "释放范围攻击时,输入的collider2d并不是trigger态");
            return(null);
        }

        Collider2D[] enemies       = new Collider2D[ENMEIES_MAX_NUM_ONEATTACK];
        int          enemiesNumber = area.OverlapCollider(filter, enemies);

        if (enemiesNumber != 0)
        {
            Debug.Log("攻击碰到敌人");

            CanBeFighted[] enemiesAttacked = new CanBeFighted[enemiesNumber];
            CanBeFighted   enemyBody;
            //对碰到的敌人进行以下操作,如果敌人有CanBeFighted组件,则施加攻击,否则报错

            for (int i = 0; i < enemiesNumber; i++)
            {
                if (enemies[i].TryGetComponent <CanBeFighted>(out enemyBody))
                {
                    Attack(enemyBody, damage, AttackInterruptType.NONE, element);
                    enemiesAttacked[i] = enemyBody;
                }
                else
                {
                    Debug.LogError("在" + gameObject.name +
                                   "释放范围攻击时,这些物体被检测为敌人,但是没有CanBeFighted组件" + enemies[i].gameObject.name);
                }
            }
            return(enemiesAttacked);
        }

        return(null);
    }
コード例 #6
0
 public AttackContent(GameObject who, int damage, AttackInterruptType interruptType)
 {
     this.who           = who;
     this.damage        = damage;
     this.interruptType = interruptType;
 }