예제 #1
0
    private void SetUp()
    {
        var Data = Entity.GetComponent <KnightData>();

        TimeCount = 0;
        StateTime = Data.AttackTime;
        if (Context.CurrentAttackMode == KnightAttackMode.DoubleSecond || Context.CurrentAttackMode == KnightAttackMode.Chase)
        {
            Attack = GetAttackInfo(Data.DoubleAttackOffset, Data.DoubleAttackHitBoxSize);
        }
        else
        {
            Attack = GetAttackInfo(Data.SingleAttackOffset, Data.SingleAttackHitBoxSize);
        }

        AttackHit = false;
        if (Entity.transform.right.x > 0)
        {
            Entity.GetComponent <SpeedManager>().SelfSpeed.x = Data.AttackStepForwardSpeed;
        }
        else
        {
            Entity.GetComponent <SpeedManager>().SelfSpeed.x = -Data.AttackStepForwardSpeed;
        }
    }
예제 #2
0
 public override void OnStart()
 {
     base.OnStart();
     m_Timer       = Time.timeSinceLevelLoad + Duration.Value;
     m_AttackPoint = m_AttackStart;
     m_AttackHit   = false;
     AttackInfo    = new EnemyAttackInfo(Owner.gameObject, Direction.Right, Damage.Value, Damage.Value, Vector2.zero, Vector2.zero);
 }
예제 #3
0
 // enum debuff
 private void OnTriggerEnter2D(Collider2D collision)
 {
     if (collision.CompareTag("Player") && !isBumpAttack)
     {
         EnemyAttackInfo attack = new EnemyAttackInfo(damage, 1f, 0, null, null);
         collision.gameObject.GetComponent <PlayerAttack>().TakeDamage(attack);
     }
 }
예제 #4
0
 private void OnTriggerStay2D(Collider2D collision)
 {
     if (collision.CompareTag("Player") && isBumpAttack && !transform.parent.gameObject.GetComponent <EnemyAir>().bumped)
     {
         EnemyAttackInfo attack = new EnemyAttackInfo(damage, 1f, 0, null, null);
         collision.gameObject.GetComponent <PlayerAttack>().TakeDamage(attack);
         transform.parent.gameObject.GetComponent <EnemyAir>().bumped = true;
     }
 }
    public override bool OnHit(AttackInfo Attack)
    {
        base.OnHit(Attack);

        CurrentTakenAttack = (EnemyAttackInfo)Attack;


        bool IsInvulnerable = Invulnerable();

        EventManager.instance.Fire(new PlayerGetHit(CurrentTakenAttack, InRollInvulnerability));

        if (!IsInvulnerable)
        {
            var Data = GetComponent <CharacterData>();

            PowerSlashLoseIncrement();

            SpiritMasterGainSeal();
            UltimateAwakenGainSeal();
            OneMindLoseIncrement();

            CurrentEnergy = 0;
            GainLoseSeal(1);
            SetEnergyFull(false);
            SetAwaken(false);

            Interrupted = true;

            int Damage = CurrentTakenAttack.Damage;

            if (DamageText == null)
            {
                DamageText = (GameObject)Instantiate(Resources.Load("Prefabs/DamageText"), transform.localPosition, Quaternion.Euler(0, 0, 0));
            }

            DamageText.GetComponent <DamageText>().ActivateSelf(Damage);

            DamageText.transform.SetParent(Canvas.transform);

            CurrentHP -= Damage;

            if (CurrentHP <= 0)
            {
                EventManager.instance.Fire(new PlayerDied());

                //SceneManager.LoadScene(SceneManager.GetActiveScene().name);
                return(true);
            }
            else
            {
                return(false);
            }
        }

        return(false);
    }
예제 #6
0
    public override void OnStart()
    {
        m_Timer = Time.timeSinceLevelLoad + Duration.Value;
        GetComponent <SpriteRenderer>().sprite = AttackSprite.Value;
        m_AttackHit = false;
        bool isRight = transform.eulerAngles.y == 0f;

        AttackInfo = new EnemyAttackInfo(Owner.gameObject, Direction.Right, Damage.Value, Damage.Value, HitBoxOffset.Value, HitBoxSize.Value);
        GetComponent <SpeedManager>().SelfSpeed.x = transform.right.x * ForwardStep.Value;
    }
예제 #7
0
    void OnCollisionEnter2D(Collision2D coll)
    {
        if (coll.gameObject.layer == SpikeLayer)
        {
            Tilemap        t           = coll.gameObject.GetComponent <Tilemap>();
            Vector3        hitPosition = Vector3.zero;
            ContactPoint2D hit         = coll.contacts[0];
            hitPosition.x = hit.point.x - 0.01f * hit.normal.x;
            hitPosition.y = hit.point.y - 0.01f * hit.normal.y;
            //충돌 위치 중심 계산


            TileBase colTile = t.GetTile(t.WorldToCell(hitPosition));

            if (colTile != null)
            {
                EnemyAttackInfo attack = new EnemyAttackInfo(spikeDamage, 0f, 0, null, null); //넉백은 따로 구현
                GetComponent <PlayerAttack>().TakeDamage(attack);

                //방향에 따른 넉백 구현
                foreach (TileBase tile in spikeTileu)
                {
                    if (colTile == tile) //spike up tile
                    {
                        // print("uuch!");
                        rb.velocity = new Vector2(rb.velocity.x, spikeKnockBacky);
                    }
                }
                foreach (TileBase tile in spikeTiled)
                {
                    if (colTile == tile) //spike down tile
                    {
                        // print("duch!");
                        rb.velocity = new Vector2(rb.velocity.x, -spikeKnockBacky);
                    }
                }
                foreach (TileBase tile in spikeTilel)
                {
                    if (colTile == tile) //spike l tile
                    {
                        // print("luch!");
                        rb.velocity = new Vector2(-spikeKnockBackx, rb.velocity.y);
                    }
                }
                foreach (TileBase tile in spikeTiler)
                {
                    if (colTile == tile) //spike r tile
                    {
                        // print("ruch!");
                        rb.velocity = new Vector2(spikeKnockBackx, rb.velocity.y);
                    }
                }
            }
        }
    }
예제 #8
0
    private void SetUp()
    {
        var Data = Entity.GetComponent <SoulWarriorData>();

        TimeCount   = 0;
        StateTime   = Data.MagicStrikeTime;
        MagicAttack = GetMagicInfo();
        Magic       = GameObject.Instantiate(Data.Magic, Context.MagicPos, Quaternion.Euler(0, 0, 0));

        AttackHit = false;
    }
예제 #9
0
    public override void OnStart()
    {
        base.OnStart();
        m_Timer           = Time.timeSinceLevelLoad + Duration.Value;
        m_StartPosition   = (Vector2)Owner.transform.position + StartOffset.Value;
        m_EnemyAttackInfo = new EnemyAttackInfo(Owner.gameObject, Direction.Right, Damage.Value, Damage.Value, Vector2.zero, HitBoxSize.Value);
        m_WaveObject      = GameObject.Instantiate(Resources.Load <GameObject>("Prefabs/Wave"));
        GameObject.Destroy(m_WaveObject, Duration.Value);

        m_WaveObject.transform.position = m_StartPosition;
        m_WaveObject.GetComponent <SpriteRenderer>().size = HitBoxSize.Value;
        m_Hit = false;
    }
예제 #10
0
    private void SetUp()
    {
        var Data = Entity.GetComponent <SoulWarriorData>();

        TimeCount = 0;
        StateTime = Data.SlashStrikeTime;
        Attack    = GetSlashInfo();
        AttackHit = false;
        if (Entity.transform.right.x > 0)
        {
            Entity.GetComponent <SpeedManager>().SelfSpeed.x = Data.AttackStepForwardSpeed;
        }
        else
        {
            Entity.GetComponent <SpeedManager>().SelfSpeed.x = -Data.AttackStepForwardSpeed;
        }
    }
예제 #11
0
    private void m_ExplodePlayerToHit()
    {
        if (!m_HitOnce)
        {
            Collider2D hit = Physics2D.OverlapCircle(transform.position,
                                                     0.5f,
                                                     PlayerLayer);
            if (hit != null)
            {
                // Hit Player
                bool isRight = transform.position.x < hit.gameObject.transform.position.x;

                EnemyAttackInfo attackInfo = new EnemyAttackInfo(Owner, isRight ? Direction.Right : Direction.Left, Damage, Damage, BladeHitBoxSize, BladeHitBoxOffset);
                hit.gameObject.GetComponent <IHittable>().OnHit(attackInfo);
                m_HitOnce = true;
            }
        }
    }
예제 #12
0
    /* void FixedUpdate()
     * {
     *   Vector2 dir = rb.transform.position;
     *   float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
     *   transform.rotation = Quaternion.AngleAxis(angle, Vector3.forward);
     * }*/

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.CompareTag("Player"))
        {
            EnemyAttackInfo attack = new EnemyAttackInfo(damage, knockBackMultiplier, 0, null, null);
            collision.gameObject.GetComponent <PlayerAttack>().TakeDamage(attack);
        }

        if ((vanishLayer == (vanishLayer | 1 << collision.gameObject.layer)))
        {
            Destroy(gameObject);
        }

        if (stopLayer == (stopLayer | 1 << collision.gameObject.layer))
        {
            GetComponent <Rigidbody2D>().velocity = Vector2.zero;
            GetComponent <Collider2D>().enabled   = false;

            StartCoroutine(WaitVanish(10f));
        }
    }
예제 #13
0
    private bool HitPlayer(EnemyAttackInfo Attack)
    {
        Vector2      AttackMiddlePoint = (m_AttackStart + m_AttackPoint) / 2f;
        float        distance          = Vector2.Distance(m_AttackStart, m_AttackPoint);
        float        angle             = Vector2.Angle(Vector2.right, m_AttackPoint - m_AttackStart);
        RaycastHit2D Hit = Physics2D.BoxCast(AttackMiddlePoint, new Vector2(distance, HitboxHeight.Value), angle, transform.right, 0, PlayerLayer);

        if (Hit)
        {
            Attack.Dir = Direction.Right;
            if (AIUtility.GetXDiff(Hit.collider.gameObject, gameObject) < 0)
            {
                Attack.Dir = Direction.Left;
            }
            Hit.collider.gameObject.GetComponent <IHittable>().OnHit(Attack);
            return(true);
        }
        else
        {
            return(false);
        }
    }
예제 #14
0
    public static bool HitPlayer(Vector2 Pivot, EnemyAttackInfo Attack, LayerMask PlayerLayer)
    {
        Vector2 Offset    = Attack.HitBoxOffset;
        Vector2 Direction = Vector2.right;

        if (Attack.Dir == global::Direction.Left)
        {
            Offset.x  = -Offset.x;
            Direction = Vector2.left;
        }

        RaycastHit2D Hit = Physics2D.BoxCast(Pivot + Offset, Attack.HitBoxSize, 0, Direction, 0, PlayerLayer);

        if (Hit)
        {
            Hit.collider.gameObject.GetComponent <IHittable>().OnHit(Attack);
            return(true);
        }
        else
        {
            return(false);
        }
    }
예제 #15
0
    private bool HitPlayer(EnemyAttackInfo Attack)
    {
        Vector2 Offset = Attack.HitBoxOffset;

        Offset.x = transform.right.x * Offset.x;

        RaycastHit2D Hit = Physics2D.BoxCast(m_StartPosition, Attack.HitBoxSize, 0, transform.right, 0, PlayerLayer);

        if (Hit)
        {
            Attack.Dir = Direction.Right;
            if (AIUtility.GetXDiff(Hit.collider.gameObject, Owner.gameObject) > 0)
            {
                Attack.Dir = Direction.Left;
            }

            Hit.collider.gameObject.GetComponent <IHittable>().OnHit(Attack);
            return(true);
        }
        else
        {
            return(false);
        }
    }
예제 #16
0
 public void TakeDamage(EnemyAttackInfo attack)
 {
     lifeStoneManager.DestroyStone((int)Mathf.Ceil(attack.damage));
 }
예제 #17
0
 public PlayerGetHit(EnemyAttackInfo attack, bool inroll)
 {
     EnemyAttack = attack;
     PlayerInRollInvulnerability = inroll;
 }