예제 #1
0
 // 상태 변화와 함께 상태에 맞는 애니메이션을 틀어줌
 public void SetState(UnitState state)
 {
     if (_state != state)
     {
         _state = state;
         anim.SetTrigger(_state.ToString());
     }
 }
예제 #2
0
파일: ActionUnit.cs 프로젝트: MrLoog/LChess
    public bool ChangeState(UnitState newState)
    {
        if (newState.Equals(State))
        {
            return(true);
        }

        UnitState oldState = State;

        if (oldState.Equals(UnitState.Attack) || oldState.Equals(UnitState.Idle))
        {
            GetComponent <NavMeshObstacle>().enabled = false;
            GetComponent <NavMeshAgent>().enabled    = true;
        }
        State = newState;
        Debug.Log(UnitID.ToString() + " Change State " + oldState.ToString() + " - " + State.ToString());
        _currentState.Disable();
        switch (State)
        {
        case UnitState.Idle:
            _currentState = _idleState;
            GetComponent <NavMeshAgent>().enabled    = false;
            GetComponent <NavMeshObstacle>().enabled = true;
            AnimateIdle();
            break;

        case UnitState.Attack:
            _currentState = _attackState;
            GetComponent <NavMeshAgent>().enabled    = false;
            GetComponent <NavMeshObstacle>().enabled = true;
            _characterAnimationEventCalls.InvokeOnAction(CharacterAnimationEventCalls.K_STATE_ATTACK_IN);
            AnimateAttack();
            break;

        case UnitState.Move:
            _currentState = _moveState;
            AnimateMove();
            break;

        case UnitState.Death:
            GetComponent <NavMeshObstacle>().enabled = false;
            GetComponent <NavMeshAgent>().enabled    = false;
            break;

        default:
            _currentState = _moveState;
            AnimateIdle();
            break;
        }
        _currentState.Enable();
        return(true);
    }
예제 #3
0
 public void SetState(UnitState newState)
 {
     SetAnim(newState.ToString());
 }
예제 #4
0
    void Update()
    {
        if (Time.deltaTime > 0)
        {
            if (playerUnit)
            {
                if (life <= 0)
                {
                    currentState = UnitState.DIE;
                }
                Vector3      airPos    = transform.position;
                RaycastHit2D hitGround = Physics2D.Raycast(transform.position, transform.right, attackRange, 1 << LayerMask.NameToLayer("Enemy"));
                RaycastHit2D hitAir;
                Debug.Log(currentState.ToString());
                if (currentState != UnitState.DIE)
                {
                    if (attackCount < attackCD)
                    {
                        attackCount += Time.deltaTime;
                    }

                    switch (type)
                    {
                    case UnitType.SOLDIER:
                    case UnitType.TANK:
                        if (hitGround.collider)
                        {
                            currentState = UnitState.ATTACK;
                            atkPos       = hitGround.point;
                        }
                        else
                        {
                            currentState = UnitState.MOVE_FORWARD;
                        }

                        break;

                    case UnitType.PLANE:
                        airPos.x += 1;
                        airPos.y -= 3.5f;
                        hitAir    = Physics2D.Raycast(airPos, transform.right, attackRange, 1 << LayerMask.NameToLayer("Enemy"));

                        if (hitGround.collider)
                        {
                            currentState = UnitState.ATTACK;
                            if (hitAir.collider)
                            {
                                if (hitAir.distance < hitGround.distance)
                                {
                                    atkPos = hitAir.point;
                                }
                                else
                                {
                                    atkPos = hitGround.point;
                                }
                            }
                            else
                            {
                                atkPos = hitGround.point;
                            }
                        }
                        else if (hitAir.collider)
                        {
                            currentState = UnitState.ATTACK;
                            atkPos       = hitAir.point;
                        }
                        else
                        {
                            currentState = UnitState.MOVE_FORWARD;
                        }

                        break;

                    case UnitType.ARCHER:
                        airPos.x += 1;
                        airPos.y  = 0;
                        hitAir    = Physics2D.Raycast(airPos, transform.right, attackRange, 1 << LayerMask.NameToLayer("Enemy"));
                        if (hitGround.collider)
                        {
                            currentState = UnitState.ATTACK;
                            if (hitAir.collider)
                            {
                                if (hitAir.distance < hitGround.distance)
                                {
                                    atkPos = hitAir.point;
                                    ground = false;
                                }
                                else
                                {
                                    atkPos = hitGround.point;
                                    ground = true;
                                }
                            }
                            else
                            {
                                atkPos = hitGround.point;
                                ground = true;
                            }
                        }
                        else if (hitAir.collider)
                        {
                            currentState = UnitState.ATTACK;
                            atkPos       = hitAir.point;
                            ground       = false;
                        }
                        else
                        {
                            currentState = UnitState.MOVE_FORWARD;
                        }
                        break;
                    }
                }

                switch (currentState)
                {
                case UnitState.MOVE_FORWARD:
                    Vector3 move = Vector3.zero;
                    move.x              = -moveSpeed * Time.deltaTime;
                    transform.position += move;
                    switch (type)
                    {
                    case UnitType.TANK:
                        anim.Play("TankPlayerWalk");
                        break;

                    case UnitType.SOLDIER:
                        anim.Play("WarriorPlayerWalk");
                        break;

                    case UnitType.PLANE:
                        anim.Play("Fly2Player");
                        break;

                    case UnitType.ARCHER:
                        anim.SetBool("Walk", true);
                        break;
                    }
                    break;

                case UnitState.ATTACK:
                    if (attackCount >= attackCD)
                    {
                        GameObject bullet = null;
                        switch (type)
                        {
                        case UnitType.TANK:
                            bullet = ObjectPooling.instance.SpawnFromPool("FlyBullet", transform.position, Quaternion.identity);
                            bullet.GetComponent <Bullet>().SetBullet(atkPos, damage, false);
                            anim.Play("TankPlayerAttack");
                            break;

                        case UnitType.SOLDIER:
                            bullet = ObjectPooling.instance.SpawnFromPool("FlyBullet", transform.position, Quaternion.identity);
                            bullet.GetComponent <Bullet>().SetBullet(atkPos, damage, false);
                            anim.Play("WarriorPlayerAttack");
                            break;

                        case UnitType.PLANE:
                            bullet = ObjectPooling.instance.SpawnFromPool("FlyBullet", transform.position, Quaternion.identity);
                            bullet.GetComponent <Bullet>().SetBullet(atkPos, damage, true);
                            anim.Play("Fly2PlayerAttack");
                            break;

                        case UnitType.ARCHER:
                            bullet = ObjectPooling.instance.SpawnFromPool("ArcherBullet", transform.position, Quaternion.identity);
                            bullet.GetComponent <Bullet>().SetBullet(atkPos, damage, true);
                            if (ground)
                            {
                                anim.SetTrigger("AttackGround");
                            }
                            else
                            {
                                anim.SetTrigger("AttackAir");
                            }
                            break;
                        }

                        bullet.tag  = "PlayerBullet";
                        attackCount = 0;
                    }
                    break;

                case UnitState.DIE:
                    gameObject.SetActive(false);
                    break;
                }
            }
            else
            {
                if (life <= 0)
                {
                    currentState = UnitState.DIE;
                }
                Vector3      airPos    = transform.position;
                RaycastHit2D hitGround = Physics2D.Raycast(transform.position, transform.right, attackRange, 1 << LayerMask.NameToLayer("Player"));
                RaycastHit2D hitAir;


                if (currentState != UnitState.DIE)
                {
                    if (attackCount < attackCD)
                    {
                        attackCount += Time.deltaTime;
                    }

                    switch (type)
                    {
                    case UnitType.SOLDIER:
                    case UnitType.TANK:
                        if (hitGround.collider)
                        {
                            currentState = UnitState.ATTACK;
                            atkPos       = hitGround.point;
                        }
                        else
                        {
                            currentState = UnitState.MOVE_FORWARD;
                        }

                        break;

                    case UnitType.PLANE:
                        airPos.x += 1;
                        airPos.y -= 3.5f;
                        hitAir    = Physics2D.Raycast(airPos, transform.right, attackRange, 1 << LayerMask.NameToLayer("Player"));

                        if (hitGround.collider)
                        {
                            currentState = UnitState.ATTACK;
                            if (hitAir.collider)
                            {
                                if (hitAir.distance < hitGround.distance)
                                {
                                    atkPos = hitAir.point;
                                }
                                else
                                {
                                    atkPos = hitGround.point;
                                }
                            }
                            else
                            {
                                atkPos = hitGround.point;
                            }
                        }
                        else if (hitAir.collider)
                        {
                            currentState = UnitState.ATTACK;
                            atkPos       = hitAir.point;
                        }
                        else
                        {
                            currentState = UnitState.MOVE_FORWARD;
                        }

                        break;

                    case UnitType.ARCHER:
                        airPos.x += 1;
                        airPos.y  = 0;
                        hitAir    = Physics2D.Raycast(airPos, transform.right, attackRange, 1 << LayerMask.NameToLayer("Player"));
                        if (hitGround.collider)
                        {
                            currentState = UnitState.ATTACK;
                            if (hitAir.collider)
                            {
                                if (hitAir.distance < hitGround.distance)
                                {
                                    atkPos = hitAir.point;
                                    ground = false;
                                }
                                else
                                {
                                    atkPos = hitGround.point;
                                    ground = true;
                                }
                            }
                            else
                            {
                                atkPos = hitGround.point;
                                ground = true;
                            }
                        }
                        else if (hitAir.collider)
                        {
                            currentState = UnitState.ATTACK;
                            atkPos       = hitAir.point;
                            ground       = false;
                        }
                        else
                        {
                            currentState = UnitState.MOVE_FORWARD;
                        }

                        break;
                    }
                }

                switch (currentState)
                {
                case UnitState.MOVE_FORWARD:
                    Vector3 move = Vector3.zero;
                    move.x              = moveSpeed * Time.deltaTime;
                    transform.position += move;
                    switch (type)
                    {
                    case UnitType.TANK:
                        break;

                    case UnitType.SOLDIER:
                        break;

                    case UnitType.PLANE:
                        break;

                    case UnitType.ARCHER:
                        break;
                    }
                    break;

                case UnitState.ATTACK:
                    if (attackCount >= attackCD)
                    {
                        GameObject bullet = null;
                        switch (type)
                        {
                        case UnitType.TANK:
                        case UnitType.SOLDIER:
                            bullet = ObjectPooling.instance.SpawnFromPool("FlyBullet", transform.position, Quaternion.identity);
                            bullet.GetComponent <Bullet>().SetBullet(atkPos, damage, false);
                            break;

                        case UnitType.PLANE:
                            bullet = ObjectPooling.instance.SpawnFromPool("FlyBullet", transform.position, Quaternion.identity);
                            bullet.GetComponent <Bullet>().SetBullet(atkPos, damage, true);
                            break;

                        case UnitType.ARCHER:
                            bullet = ObjectPooling.instance.SpawnFromPool("ArcherBullet", transform.position, Quaternion.identity);
                            bullet.GetComponent <Bullet>().SetBullet(atkPos, damage, true);
                            break;
                        }
                        bullet.tag  = "EnemyBullet";
                        attackCount = 0;
                    }
                    break;

                case UnitState.DIE:
                    gameObject.SetActive(false);
                    break;
                }
            }
        }
    }