/// <summary> /// 스테이트 머신 /// </summary> /// <param name="nextState">몬스터의 다음 상태</param> public void Set_StateMachine(MONSTER_STATE nextState) { _state = nextState; switch (nextState) { case MONSTER_STATE.IDLE: StartCoroutine(IE_Idle()); break; case MONSTER_STATE.TRACE: StartCoroutine(IE_Trace()); break; case MONSTER_STATE.ATTACK: StartCoroutine(IE_Attack()); break; case MONSTER_STATE.RETURN: StartCoroutine(IE_Return()); break; case MONSTER_STATE.DEAD: Dead(); break; } }
protected virtual void Awake() { spawnPosition = transform.position; m_nowState = MONSTER_STATE.IDLE; m_moveType = MoveType.Stay; m_Animator = GetComponentInChildren <Animator>(); DetectLayer = 1 << LayerMask.NameToLayer("Player"); StartCoroutine(ChangeState()); sc_ViewAngle = GetComponent <ViewAngle>(); sc_Health = GetComponent <Health>(); m_prevHp = sc_Health.curHP; grid = GetComponent <Grid>(); Astar = GetComponent <AStarCompleted>(); CC = GetComponent <CharacterController>(); OriginPosition = transform.position; OriginWalkSpeed = WalkSpeed; FrameCheck = 5; Animation_FrameCheck = -1; ChangeState_FrameCheck = -1; TCP_isConnected = false; SendRotation = transform.rotation; }
protected virtual void Start() { ms = MONSTER_STATE.FIND; target = GameObject.FindGameObjectWithTag("Player").transform; objectPool = GameManager.instance.GetComponent <ObjectPool>(); setter = GetComponent <AIDestinationSetter>(); setter.target = target; }
IEnumerator StateCheck() { //오브젝트 풀에 생성시 다른 스크립트의 초기화를 위해 대기 yield return(new WaitForSeconds(1.0f)); while (m_bLive) { if (m_bAppear == false) { yield return(new WaitForSeconds(0.5f)); continue; } // yield return null; if (m_bLive == false) { yield break; } float distanceToPlayer = Vector2.Distance(m_playerTransform.position, this.transform.position); if (m_animFunction.GetCurrntAnimClipName() == "hit") { yield return(null); } if (m_monsterInfo.IsCharacterDie()) { m_eState = MONSTER_STATE.DIE; } else if (distanceToPlayer < m_attackDistance) { m_eState = MONSTER_STATE.ATTACK; } else if (m_eState == MONSTER_STATE.APPEAR) { m_eState = MONSTER_STATE.MOVE; } else { m_eState = MONSTER_STATE.APPEAR; } if (m_monsterPosition != Monster_Position.Monster_Position_Ground) { m_eState = MONSTER_STATE.HIT; ResetAnim(); if (m_monsterInfo.IsCharacterDie()) { m_eState = MONSTER_STATE.DIE; } } yield return(m_secondsDelay); } }
// -------------------------------------- Send Management ------------------------------------- // 상태 변경하기 public void TCP_SendChangeState(MONSTER_STATE desiredState) { if (ChangeState_FrameCheck == 0) { switch (m_nowState) { case MONSTER_STATE.TRACE: ChangeState_FrameCheck = -2; break; case MONSTER_STATE.BATTLE: ChangeState_FrameCheck = -1; break; } try { TCPClient.m_Monster.Monster_ChangeState( Packing.STATE.FANATIC_GUN, index, (UInt64)TCPClient.PROTOCOL.M_CHANGE_STATE, m_nowState, desiredState); TCP_isConnected = true; } catch { print("Monster_ChangeState / No connection found with Server"); TCP_isConnected = false; switch (desiredState) { case MONSTER_STATE.TRACE: SetMoveType(MoveType.WalkForward); //m_moveType = MoveType.WalkForward; //print("추적 상태로"); break; case MONSTER_STATE.BATTLE: m_isAttack = false; isMoving = false; MoveTime = 0; GunAttackOnce = false; //print("전투 상태로"); break; } m_nowState = desiredState; } } }
void MonsterDie() { m_Animator.SetTrigger("IsDie"); m_bDie = true; m_NaviMesh.Stop(); m_MonsterState = MONSTER_STATE.MONSTER_DIE; GetComponent <CapsuleCollider>().enabled = false; Destroy(GetComponent <CapsuleCollider>()); Destroy(GetComponent <NavMeshAgent>()); }
private void Awake() { //몬스터 유저 찾기 2가지 방법중 //1) 어웨이크에서 유저 오브젝트를 저장 해놓고 좌표 거리계산으로 유저 찾기 << 선택 //2) 탐색 콜리전으로 크게 콜리젼만들고 콜리젼 안에 들어오면 찾기 StageManager.Inst.playerTransform = GameObject.FindGameObjectWithTag("Player").GetComponent <Transform>(); m_playerTransform = StageManager.Inst.playerTransform; m_eState = MONSTER_STATE.APPEAR; InitMonsterInfo(); InitAniamation(); m_attackDistance = m_monsterInfo.GetAttackDistance(); }
// Use this for initialization void Start() { minX = 0.0f; maxX = 50.0f; minZ = 0.0f; maxZ = 30.0f; current_state = MONSTER_STATE.walk; playerTr = GameObject.FindGameObjectWithTag("Player").transform; nav = GetComponent <UnityEngine.AI.NavMeshAgent>(); StartCoroutine(State_Control()); anim = GetComponentInChildren <Animator>(); GetNextPosition(); thisrigidBody = GetComponent <Rigidbody>(); thisColl = GetComponent <BoxCollider>(); EventManager.Instance.AddListener(EVENT_TYPE.GAME_ENEMY_DIE, this); }
void MonsterState() { switch (m_MonsterState) { case MONSTER_STATE.MONSTER_IDLE: Vector3 vDestPos = Vector3.zero; vDestPos.x = Random.Range(-50.0f, 50.0f); vDestPos.z = Random.Range(-50.0f, 50.0f); m_NaviMesh.destination = vDestPos; m_NaviMesh.Resume(); m_MonsterState = MONSTER_STATE.MONSTER_WALK; m_Animator.SetBool("IsWalk", true); break; case MONSTER_STATE.MONSTER_WALK: float fRandom = Random.Range(0.0f, 100.0f); fRandom = fRandom % 2; if (fRandom == 0) { m_MonsterState = MONSTER_STATE.MONSTER_IDLE; m_Animator.SetBool("IsWalk", false); m_NaviMesh.Stop(); } else { Vector3 vPos = Vector3.zero; vPos.x = Random.Range(-50.0f, 50.0f); vPos.z = Random.Range(-50.0f, 50.0f); m_NaviMesh.destination = vPos; m_NaviMesh.Resume(); } break; } }
public IEnumerator State_Control() // 몬스터의 상태변화를 컨트롤합니다 { while (true) { yield return(new WaitForSeconds(.1f)); switch (current_state) { case MONSTER_STATE.idle: break; case MONSTER_STATE.walk: anim.SetTrigger("walk"); rayDirection = playerTr.position - transform.position; if ((Vector3.Angle(rayDirection, transform.forward)) < 45) // 몬스터의 45도 시야안에 있고 { current_state = MONSTER_STATE.trace; // 추격한다 } if (Vector3.Distance(transform.position, tarPos) <= 0.5f) { GetNextPosition(); // 몬스터가 랜덤한위치로 이동완료했을때 다음위치를 찾는다 } nav.SetDestination(tarPos); break; case MONSTER_STATE.trace: //anim.SetTrigger("walk"); nav.SetDestination(playerTr.position); if (Vector3.Distance(transform.position, playerTr.position) < 50f) // 플레이어와 몬스터의 위치가 가까우면 { current_state = MONSTER_STATE.attack; // 어택모드 } break; case MONSTER_STATE.attack: anim.SetTrigger("attack"); //attack(); break; } } }
// Update is called once per frame void Update() { if (m_bDie) { return; } if (m_PhotonView.isMine) { m_fTime += Time.deltaTime; if (m_fTime >= 10.0f) { m_fTime = Random.Range(-1.0f, 3.0f); //MonsterState(); if (m_MonsterState == MONSTER_STATE.MONSTER_IDLE) { Vector3 vDestPos = Vector3.zero; vDestPos.x = Random.Range(-50.0f, 50.0f); vDestPos.z = Random.Range(-50.0f, 50.0f); m_NaviMesh.destination = vDestPos; m_NaviMesh.Resume(); m_MonsterState = MONSTER_STATE.MONSTER_WALK; m_Animator.SetBool("IsWalk", true); } } float fDist = Vector3.Distance(m_TrInfo.position, m_NaviMesh.destination); if (fDist <= 2.0f) { m_MonsterState = MONSTER_STATE.MONSTER_IDLE; m_Animator.SetBool("IsWalk", false); m_NaviMesh.Stop(); } } else { Vector3 vPos = m_TrInfo.position; m_TrInfo.position = Vector3.Lerp(m_TrInfo.position, m_CurrPos, Time.deltaTime * 3.0f); m_TrInfo.rotation = Quaternion.Slerp(m_TrInfo.rotation, m_CurrRot, Time.deltaTime * 3.0f); if (vPos == m_TrInfo.position) { m_MonsterState = MONSTER_STATE.MONSTER_IDLE; m_Animator.SetBool("IsWalk", false); } else { m_MonsterState = MONSTER_STATE.MONSTER_WALK; m_Animator.SetBool("IsWalk", true); } } }
void Start() { monsterState = MONSTER_STATE.BASIC; }
// 타겟 지정 // 플레이어의 classNumber를 받아서 타겟을 판별 public void Monster_SetTarget(STATE MTYPE, int index, UInt64 _Protocol, MONSTER_STATE nowState, int classNumber) { UInt64 Protocol = (UInt64)CLASS_STATE.MONSTER_STATE | (UInt64)MTYPE | _Protocol; TCPClient.Instance.PackingData(Protocol, PackingData(index, (int)nowState, classNumber)); }
// 몬스터 상태 변경 public void Monster_ChangeState(STATE MTYPE, int index, UInt64 _Protocol, MONSTER_STATE nowState, MONSTER_STATE desiredState) { UInt64 Protocol = (UInt64)CLASS_STATE.MONSTER_STATE | (UInt64)MTYPE | _Protocol; TCPClient.Instance.PackingData(Protocol, PackingData(index, (int)nowState, (int)desiredState)); }