예제 #1
0
    void Update()
    {
        joystickID = playerControl.joystickID;
        Rigidbody2D rb = transform.GetComponent <Rigidbody2D>();

        if (timeBtwAttack <= 0)
        {
            if (attackState == 1 || attackState == 2)
            {
                if (attackState == 1)
                {
                    attackState = 2;
                    rb.AddForce(new Vector2(currentAttack.momentum.x * Mathf.Sign(transform.localScale.x),
                                            currentAttack.momentum.y), ForceMode2D.Impulse);
                }

                Debug.Log("active");
                Collider2D[] enemiesToDamage = Physics2D.OverlapCircleAll(currentAttack.location.position, attackRange, whatIsEnemies);
                foreach (Collider2D enemyCollider in enemiesToDamage)
                {
                    PlayerControl enemy = enemyCollider.GetComponent <PlayerControl>();
                    if (enemy.team != playerControl.team && enemy.knockbackTime < currentAttack.knockbackTime - 0.2f && !enemy.isBlocking)
                    {
                        shake.StartCameraShake(0.1f, 0.2f);
                        hitSource.Play();
                        Debug.Log("hit");

                        enemy.transform.localScale = new Vector2(Mathf.Abs(enemy.transform.localScale.x) * Mathf.Sign(-transform.localScale.x), enemy.transform.localScale.y);


                        enemy.health -= currentAttack.damage;

                        if (enemy.health < enemy.breakPoint)
                        {
                            // BREAK!!!!
                            Instantiate(breakEffect);
                            hitSource.Play();
                            if (enemy.breakPoint > 0)
                            {
                                enemy.breakPoint -= 100;
                            }

                            enemy.knockbackTime = 2f;
                            enemy.GetComponent <Rigidbody2D>().AddForce(new Vector2(20 * Mathf.Sign(transform.localScale.x),
                                                                                    20), ForceMode2D.Impulse); //impulse dir
                        }
                        else
                        {
                            enemy.knockbackTime = currentAttack.knockbackTime;                                                        //stun time
                            enemy.GetComponent <Rigidbody2D>().AddForce(new Vector2(currentAttack.knockback.x * Mathf.Sign(transform.localScale.x),
                                                                                    currentAttack.knockback.y), ForceMode2D.Impulse); //impulse dir
                        }
                    }
                    else
                    {
                        missSource.Play();
                    }
                    //  enemiesToDamage[i].GetComponent<Player>().TakeDamage(damage);
                }
                Collider2D[] puffers = Physics2D.OverlapCircleAll(currentAttack.location.position, attackRange, LayerMask.GetMask("Puffer"));
                foreach (Collider2D puffer in puffers)
                {
                    PufferControl puf = puffer.GetComponent <PufferControl>();

                    if (puf.team != playerControl.team)
                    {
                        puf.team = playerControl.team;
                        hitSource.Play();
                        Debug.Log("hit");

                        puf.knockbackTime = currentAttack.knockbackTime; //stun time
                        puf.knockbackDir  = new Vector2(currentAttack.knockback.x * Mathf.Sign(transform.localScale.x),
                                                        currentAttack.knockback.y);
                        puf.GetComponent <Rigidbody2D>().AddForce(new Vector2(currentAttack.knockback.x * Mathf.Sign(transform.localScale.x),
                                                                              currentAttack.knockback.y), ForceMode2D.Impulse); //impulse dir
                    }
                }
                timeBtwAttack -= Time.deltaTime;
                if (timeBtwAttack < -currentAttack.activeTime)
                {
                    attackState   = 3;
                    timeBtwAttack = currentAttack.recoveryTime;
                }
            }

            else
            {
                attackState           = 0;
                playerControl.canMove = true;
                if (Input.GetButtonDown("Attack_" + joystickID))
                {
                    attackState = 1;

                    if (Input.GetAxis("Vertical_" + joystickID) < -0.5)
                    {
                        currentAttack = slide;
                    }
                    else if (Input.GetAxis("Vertical_" + joystickID) > 0.5)
                    {
                        currentAttack = uppercut;
                    }
                    else
                    {
                        currentAttack = neutralGround;
                    }



                    timeBtwAttack                = currentAttack.initTime;
                    playerControl.canMove        = false;
                    playerControl.animationState = currentAttack.animationState;
                }
            }
        }
        else
        {
            timeBtwAttack -= Time.deltaTime;
        }

        if (attackState != 0 && playerControl.grounded && Mathf.Abs(rb.velocity.x) > 0.1f)
        {
            rb.AddForce(Vector2.left * Mathf.Sign(rb.velocity.x) * 20);
        }

        if (playerControl.knockbackTime > 0)
        {
            attackState = 0;
        }
    }