// 지정된 이동 애니메이션으로 변경하기
    void ChangeMovement()
    {
        if (isMoving)
        {
            // 움직임 스택 Pop하고 지정된 시간 세팅
            if (MoveTime < 0)
            {
                MoveAction tempMoveAction = st_MoveAction.Pop();
                MoveTime           = tempMoveAction.Time;
                startMoveTime      = Time.time;
                m_THydraActionType = tempMoveAction.THAction;
            }

            // 지정된 시간 지나면 MoveTime 초기화
            if (Time.time - startMoveTime >= MoveTime)
            {
                MoveTime = -1;

                // 지정된 움직임 끝나면 다시 재설정하도록
                if (st_MoveAction.Count == 0)
                {
                    isMoving = false;
                    //print("재설정");
                }
            }
        }
    }
    // actionType에 따른 이동 애니메이션 실행 또는 서버에게 보내기
    void PlayMovementAction(THydraActionType actionType)
    {
        float speed = 0;

        switch (actionType)
        {
        case THydraActionType.Walk_forward:
            SetMoveType(MoveType.WalkForward);
            LockRotation = false;

            if (m_CurrentStance == THydraStance.Crawl)
            {
                speed = WalkSpeed + 1;
            }
            else
            {
                speed = WalkSpeed;
            }

            break;

        case THydraActionType.Run:
            SetMoveType(MoveType.RunForward);
            LockRotation = false;

            if (isFindStone)
            {
                speed = RunSpeed;
            }
            else
            {
                if (m_CurrentStance == THydraStance.Crawl)
                {
                    speed = RunSpeed + 2;
                }
                else
                {
                    speed = RunSpeed;
                }
            }

            break;

        default:
            m_isMovementAction = false;
            return;
        }

        if (isFindStone)
        {
            MoveToStone(speed);
        }
        else
        {
            SetMoveDirection(speed);
        }

        m_isMovementAction = true;
    }
    protected override void Awake()
    {
        base.Awake();
        LockRotation         = true;
        st_MoveAction        = new Stack <MoveAction>();
        st_AttackAction      = new Stack <THAttackInfo>();
        OriginAttackDistance = AttackDistance;
        //m_battlePhase = 0;
        jumpForce = 3f;

        for (int i = 0; i < phaseCheck.Length; i++)
        {
            phaseCheck[i] = false;
        }

        // hp바 투명
        Color color = HPbar.color;

        color.a     = 0;
        HPbar.color = color;

        color              = HPBackground.color;
        hpBgrOrigin        = HPBackground.color;
        color.a            = 0;
        HPBackground.color = color;

        color         = UI_Name.color;
        color.a       = 0;
        UI_Name.color = color;

        HPbar_width = HPbar.rectTransform.rect.width;

        m_Level = MonsterLevel.Boss;

        originBattleDistance = battleDistance;

        m_desiredPosition = transform.position;
        m_desiredRotation = transform.rotation;

        m_THydraActionType = THydraActionType.Max;
        m_RecvActionType   = THydraActionType.Max;

        if (Static_Data.m_number == 1)
        {
            try
            {
                TCPClient.m_Monster.Monster_BeginInfoUpdate(Packing.STATE.TITANICHYDRA, index, sc_Health.maxHP);

                TCP_isConnected = true;
            }
            catch
            {
                TCP_isConnected = false;
            }
        }
    }
    // 서버와 연결 체크 후, 서버에 애니메이션 보내기
    // 서버연결 안되있는 경우엔 공격 애니메이션 실행
    void Check_PlayBattleAction(THydraActionType actionType)
    {
        // 이동 애니메이션 실행이면, 공격 애니메이션은 실행 안하도록 종료
        if (m_isMovementAction)
        {
            return;
        }

        // 서버 연결되있으면, 애니메이션 보내고 밑에 실행문은 실행안함.
        if (TCP_SendAnimation((int)actionType))
        {
            return;
        }

        // 공격 애니메이션 실행
        PlayBattleAction(actionType);
    }
    // 다음 페이즈로 변경 시킴
    bool PhaseCheck()
    {
        if (m_battlePhase == 2 && !phaseCheck[0] && m_CurrentStance == THydraStance.Stand)
        {
            phaseCheck[0]      = true;
            m_THydraActionType = THydraActionType.StandRoar;

            Animation_FrameCheck = Animation_FrameDelay;
            if (TCP_isConnected)
            {
                TCP_setAnimation = true;
            }

            TCP_SendBattleInfo();
            //print("페이즈2 시작");
            return(true);
        }
        else if (m_battlePhase == 3 && !phaseCheck[1] && m_CurrentStance == THydraStance.Stand)
        {
            phaseCheck[1] = true;

            st_AttackAction.Clear();
            //st_AttackAction.Push(new THAttackInfo(THydraActionType.StandRoar, 50f));
            //m_THydraActionType = THydraActionType.StandRoar;

            m_THydraActionType = THydraActionType.Groggy;

            Animation_FrameCheck = Animation_FrameDelay;
            if (TCP_isConnected)
            {
                TCP_setAnimation = true;
            }

            TCP_SendBattleInfo();
            //print("페이즈3 시작");
            return(true);
        }

        return(false);
    }
    // 현재 자세 변경 2족, 4족
    bool ChangeStance()
    {
        if (toStand && m_CurrentStance == THydraStance.Crawl)
        {
            m_THydraActionType = THydraActionType.CrawlToStand;
            m_CurrentStance    = THydraStance.Stand;
            st_AttackAction.Clear();

            ChangeStanceValue = 0;
            toStand           = false;

            Animation_FrameCheck = Animation_FrameDelay;
            if (TCP_isConnected)
            {
                TCP_setAnimation = true;
            }

            return(true);
        }
        else if (ChangeStanceValue >= 7 && m_CurrentStance == THydraStance.Stand)
        {
            m_THydraActionType = THydraActionType.StandToCrawl; // 4족 변경 액션
            m_CurrentStance    = THydraStance.Crawl;            // 현재 자세 4족으로 변경
            st_AttackAction.Clear();                            // 액션스택을 비운다. 지정된 공격 패턴 초기화

            Animation_FrameCheck = Animation_FrameDelay;
            if (TCP_isConnected)
            {
                TCP_setAnimation = true;
            }

            return(true);
        }

        return(false);
    }
Пример #7
0
 public MoveAction(THydraActionType _Action, float _Time)
 {
     THAction = _Action;
     Time     = _Time;
 }
    // actionType에 따른 공격 애니메이션 실행
    void PlayBattleAction(THydraActionType actionType)
    {
        switch (actionType)
        {
        case THydraActionType.StandToCrawl:         // 2족 -> 4족 변경
            m_isAttack = true;
            isMoving   = false;
            SetMoveType(MoveType.Stay);
            TCP_setAnimation = false;
            m_desiredSpeed   = 0;

            m_Animator.SetTrigger("StandToCrawl_Roar");

            break;

        case THydraActionType.CrawlToStand:         // 4족 -> 2족 변경
            m_isAttack = true;
            isMoving   = false;
            SetMoveType(MoveType.Stay);
            TCP_setAnimation = false;
            m_desiredSpeed   = 0;

            m_Animator.SetTrigger("CrawlToStand");

            break;

        case THydraActionType.StandRoar:
            m_isAttack = true;
            isMoving   = false;
            SetMoveType(MoveType.Stay);
            TCP_setAnimation = false;
            m_desiredSpeed   = 0;

            m_Animator.SetTrigger("StandRoar");

            break;

        case THydraActionType.Groggy:
            m_isAttack = true;
            isMoving   = false;
            SetMoveType(MoveType.Stay);
            TCP_setAnimation = false;
            m_desiredSpeed   = 0;
            LockRotation     = true;

            m_Animator.SetTrigger("Groggy");
            break;

        case THydraActionType.Attack1:              // 두팔 번갈아가며 휘두르기
            m_isAttack = true;
            isMoving   = false;
            SetMoveType(MoveType.Stay);
            TCP_setAnimation = false;
            m_desiredSpeed   = 0;
            LockRotation     = false;

            currentDamageValue = 25f;
            currentAttackType  = 1;

            m_Animator.SetInteger("Attack", (int)AnimBattleSTATE.Attack1);

            break;

        case THydraActionType.Attack2:              // 두팔 모아서 아래로 찍기
            m_isAttack = true;
            isMoving   = false;
            SetMoveType(MoveType.Stay);
            TCP_setAnimation = false;
            m_desiredSpeed   = 0;
            LockRotation     = false;

            currentDamageValue = 25f;
            currentAttackType  = 2;

            m_Animator.SetInteger("Attack", (int)AnimBattleSTATE.Attack2);

            break;

        case THydraActionType.Attack3:              // 러쉬 어택, 몸통박치기
            m_isAttack = true;
            isMoving   = false;
            SetMoveType(MoveType.Stay);
            TCP_setAnimation = false;
            m_desiredSpeed   = 0;
            LockRotation     = false;

            currentDamageValue = 25f;
            currentAttackType  = 2;

            m_Animator.SetInteger("Attack", (int)AnimBattleSTATE.Attack3);

            break;

        case THydraActionType.Attack4:              // 돌던지기
            m_isAttack = true;
            isMoving   = false;
            SetMoveType(MoveType.Stay);
            TCP_setAnimation = false;
            m_desiredSpeed   = 0;
            LockRotation     = false;

            battleDistance = originBattleDistance;

            currentDamageValue = 20f;
            currentAttackType  = 1;

            m_Animator.SetInteger("Attack", (int)AnimBattleSTATE.Attack4);

            break;

        case THydraActionType.Attack5:              // 4족 , 짧게 점프해서 때리기
            m_isAttack = true;
            isMoving   = false;
            SetMoveType(MoveType.Stay);
            TCP_setAnimation = false;
            m_desiredSpeed   = 0;
            LockRotation     = false;

            currentDamageValue = 30f;
            currentAttackType  = 2;

            m_Animator.SetInteger("Attack", (int)AnimBattleSTATE.Attack5);

            break;

        case THydraActionType.Attack6:              // 4족 , 길게 점프해서 때리기
            m_isAttack = true;
            isMoving   = false;
            SetMoveType(MoveType.Stay);
            TCP_setAnimation = false;
            m_desiredSpeed   = 0;
            LockRotation     = false;

            currentDamageValue = 30f;
            currentAttackType  = 2;

            m_Animator.SetInteger("Attack", (int)AnimBattleSTATE.Attack6);

            break;

        case THydraActionType.Max:
            break;
        }

        m_RecvActionType = THydraActionType.Max;
    }
 public THAttackInfo(THydraActionType _ActionType, float _AttackDistance)
 {
     m_ActionType     = _ActionType;
     m_AttackDistance = _AttackDistance;
 }
    // 타겟과 거리에 따라서 동작 변경
    protected override void CheckAttackDistance()
    {
        // 공격 실행 아닐때에만
        if (m_isAttack || TCP_setAnimation)
        {
            return;
        }

        // 전투 유지거리 벗어나면 추적 상태로
        if (TargetDistance > battleDistance)
        {
            if (ChangeState_FrameCheck == -2)
            {
                ChangeState_FrameCheck = 0;
            }

            // 어그로 수치에 따라 타겟 변경
            if (TCP_isConnected)
            {
                if (m_Player_aggroValue > m_Other_aggroValue)
                {
                    Target = GameManager.Instance.ClientPlayer;
                    //print("타겟 클라이언트 플레이어로 지정");
                }
                else if (m_Player_aggroValue < m_Other_aggroValue)
                {
                    Target = GameManager.Instance.OtherPlayer;
                    //print("타겟 아더 플레이어로 지정");
                }

                SetTarget_FrameCheck = 0;
                TCP_SendTarget();
                m_Player_aggroValue = 0;
                m_Other_aggroValue  = 0;
                //print("타겟 변경 실행");
            }

            TCP_SendChangeState(MONSTER_STATE.TRACE);
            //print("추적 상태로");
        }
        // 전투 거리 내에 타겟 존재
        else if (TargetDistance <= battleDistance)
        {
            // 페이즈 변경 시 특정 동작 실행
            if (PhaseCheck())
            {
                return;
            }

            // 4족 또는 2족으로 자세 변경
            if (ChangeStance())
            {
                return;
            }

            // 공격 동작 세팅
            SetAttackAction();
            // 돌던지는 공격이면, 먼저 돌을 찾으러 이동
            if (st_AttackAction.Peek().m_ActionType == THydraActionType.Attack4)
            {
                battleDistance = 50f;

                if (FindStone())
                {
                    m_THydraActionType = THydraActionType.Run;
                    if (Vector3.Distance(Stone.position, transform.position) <= 3)
                    {
                        Stone.GetComponent <StoneMove>().OffCollider();
                        if (Vector3.Distance(Stone.position, transform.position) <= 2)
                        {
                            // 서버연결되있는 경우, 돌 찾음.
                            if (TCP_isConnected)
                            {
                                TCPClient.m_Monster.Monster_BattleInfo(
                                    Packing.STATE.TITANICHYDRA,
                                    index,
                                    (UInt64)TCPClient.PROTOCOL.M_FINDSTONE,
                                    0);
                            }
                            else
                            {
                                isFindStone = false;
                            }
                        }
                        else
                        {
                            return;
                        }
                    }
                    else
                    {
                        return;
                    }
                }
            }

            // 공격 사정거리 지정하기
            AttackDistance = st_AttackAction.Peek().m_AttackDistance;

            // 사정거리 안에 들어오면 공격 동작 수행
            if (TargetDistance <= AttackDistance)
            {
                // 공격 동작 수행하도록 현재 액션타입에 공격 지정
                m_THydraActionType   = st_AttackAction.Pop().m_ActionType;
                Animation_FrameCheck = Animation_FrameDelay;

                if (TCP_isConnected)
                {
                    TCP_setAnimation = true;
                }
                return;
            }

            // 움직임 세팅
            SetMovement();
            ChangeMovement();
        }
    }