// 지정된 이동 애니메이션으로 변경하기 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); }
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(); } }