예제 #1
0
파일: Kelvin.cs 프로젝트: parkovski/scifi
 protected override void OnInitialize()
 {
     eAttacks[0] = new IceBallAttack(this, iceballPrefab);
     eAttacks[1] = new FireBallAttack(this);
     eAttacks[2] = new NetworkAttack(new TelegraphAttack(this, telegraph));
     spriteFlip  = new CompoundSpriteFlip(gameObject, defaultDirection);
 }
예제 #2
0
    private void Update()
    {
        float empSpd = spd;

        if (hp <= 0)
        {
            hpFill.material.SetFloat("_Progress", 0);
        }
        else
        {
            hpFill.material.SetFloat("_Progress", hp / maxHP);
        }
        for (int i = 0; i < equipedItems.Count; i++)
        {
            switch (equipedItems[i])
            {
            case ItemType.Mask1:
                empSpd = empSpd + empSpd * 0.2f;
                break;

            case ItemType.Mask2:
                empSpd = empSpd + empSpd * 0.5f;
                break;

            case ItemType.Mask3:
                empSpd = empSpd + empSpd * 1f;
                break;

            case ItemType.Heart1:
                healElap1 += Time.deltaTime;
                if (healElap1 >= 1 && maxHP > hp * 0.005f)
                {
                    hp       += hp * 0.005f;
                    healElap1 = 0;
                }
                break;

            case ItemType.Heart2:
                healElap2 += Time.deltaTime;
                if (healElap2 >= 1 && maxHP > hp * 0.01f)
                {
                    hp       += hp * 0.01f;
                    healElap2 = 0;
                }
                break;

            case ItemType.Heart3:
                healElap2 += Time.deltaTime;
                if (healElap2 >= 1 && maxHP > hp * 0.03f)
                {
                    hp       += hp * 0.03f;
                    healElap3 = 0;
                }
                break;
            }
        }


        movementDir = new Vector2(jsMove.Direction.x, jsMove.Direction.z);
        // move anim
        if (Vector2.Distance(movementDir, Vector2.zero) > 0.01f)
        {
            if (Mathf.Abs(movementDir.x) > Mathf.Abs(movementDir.y))
            {
                if (movementDir.x > 0) // 오른쪽
                {
                    preDir = movementDir;
                    animator.SetBool("Idle", false);
                    animator.SetBool("DownMove", false);
                    animator.SetBool("LeftMove", false);
                    animator.SetBool("RightMove", true);
                    animator.SetBool("UpMove", false);
                }
                else if (movementDir.x <= 0) // 왼쪽
                {
                    preDir = movementDir;
                    animator.SetBool("Idle", false);
                    animator.SetBool("DownMove", false);
                    animator.SetBool("LeftMove", true);
                    animator.SetBool("RightMove", false);
                    animator.SetBool("UpMove", false);
                }
            }
            else
            {
                if (movementDir.y > 0) // 위쪽
                {
                    preDir = movementDir;
                    animator.SetBool("Idle", false);
                    animator.SetBool("DownMove", false);
                    animator.SetBool("LeftMove", false);
                    animator.SetBool("RightMove", false);
                    animator.SetBool("UpMove", true);
                }
                else if (movementDir.y <= 0)
                {
                    preDir = movementDir;
                    animator.SetBool("Idle", false);
                    animator.SetBool("DownMove", true);
                    animator.SetBool("LeftMove", false);
                    animator.SetBool("RightMove", false);
                    animator.SetBool("UpMove", false);
                }
            }
        }
        else
        {
            animator.SetBool("Idle", true);
            animator.SetBool("DownMove", false);
            animator.SetBool("LeftMove", false);
            animator.SetBool("RightMove", false);
            animator.SetBool("UpMove", false);
        }

        transform.Translate(movementDir.normalized * empSpd * Time.deltaTime);

        #region normalAttack
        // 기본공격
        if (attackSkills[(int)AttackType.DefaulAttack].isActive)
        {
            NormalAttack normalAttack = attackSkills[(int)AttackType.DefaulAttack].skill as NormalAttack;
            normalAttack.elapsedTime += Time.deltaTime;
            if (normalAttack.elapsedTime > normalAttack.attackDelay)
            {
                //Actor target=    Actor.FindActor((Actor actor) =>
                //{
                //    if (Vector2.Distance(actor.transform.position, transform.position) < normalAttack.attackRange)
                //    {
                //        return true;
                //    }
                //    return false;
                //});

                Actor target   = null;
                float bestDist = 100;
                foreach (var act in allActors)
                {
                    if (act.Value == this || act.Value.isActiveAndEnabled == false)
                    {
                        continue;
                    }
                    float dist = Vector2.Distance(transform.position, act.Value.transform.position);
                    if (dist < bestDist)
                    {
                        target   = act.Value;
                        bestDist = dist;
                    }
                }
                if (target != null && Vector2.Distance(target.transform.position, transform.position) < normalAttack.attackRange)
                {
                    normalAttack.Attack(target, firePos.position);
                    normalAttack.elapsedTime = 0;
                }
            }
        }
        #endregion
        if (attackSkills[(int)AttackType.FireBall].isActive)
        {
            FireBallAttack fireBallAttack = attackSkills[(int)AttackType.FireBall].skill as FireBallAttack;
            fireBallAttack.elapsedTime += Time.deltaTime;
            if (fireBallAttack.elapsedTime > fireBallAttack.AttackDelay)
            {
                fireBallAttack.Attack(firePos.position);
                fireBallAttack.elapsedTime = 0;
            }
        }
        if (attackSkills[(int)AttackType.MagicBall].isActive)
        {
            MagicBallAttack magicBallAttack = attackSkills[(int)AttackType.MagicBall].skill as MagicBallAttack;
            magicBallAttack.elapsedTime += Time.deltaTime;
            if (magicBallAttack.elapsedTime > magicBallAttack.AttackDelay)
            {
                Actor[] target     = new Actor[magicBallAttack.attackCount];
                float   bestDist   = 100;
                int     foundCnt   = 0;
                bool    isAttacked = false;
                foreach (var act in allActors)
                {
                    if (foundCnt >= magicBallAttack.attackCount)
                    {
                        break;
                    }
                    if (act.Value == this || act.Value.isActiveAndEnabled == false)
                    {
                        continue;
                    }
                    float dist = Vector2.Distance(transform.position, act.Value.transform.position);
                    if (dist < magicBallAttack.attackDistance)
                    {
                        target[foundCnt++] = act.Value;
                    }
                }
                for (int i = 0; i < target.Length; i++)
                {
                    if (target[i] != null)
                    {
                        magicBallAttack.Attack(target[i], firePos.position);
                        isAttacked = true;
                    }
                }
                if (isAttacked)
                {
                    magicBallAttack.elapsedTime = 0;
                }
            }
        }
        if (attackSkills[(int)AttackType.Cycle].isActive)
        {
            CycleMagic cycleMagic = attackSkills[(int)AttackType.Cycle].skill as CycleMagic;
            cycleMagic.Attack();
            //fireFallAttack.elapsedTime += Time.deltaTime;
            //if (fireFallAttack.elapsedTime > fireFallAttack.attackDelay)
            //{
            //    for (int i = 0; i < fireFallAttack.attackCount; i++)
            //    {
            //        int randX = UnityEngine.Random.Range(-2, 2);
            //        int randY = UnityEngine.Random.Range(-2, 2);
            //        Vector3 distPos = new Vector3(transform.position.x + randX, transform.position.y + randY);
            //        fireFallAttack.Attack(distPos);
            //    }
            //    fireFallAttack.elapsedTime = 0;
            //}
        }
    }