public void InitFSM() { CachEntityAnimation(); m_FSMSystem = new FSMSystem(this); MonsterMoveState moveState = new MonsterMoveState(); m_FSMSystem.AddState(moveState); MonsterIdleState idleState = new MonsterIdleState(); m_FSMSystem.AddState(idleState); m_MonsterAttackState = new MonsterAttackState(); m_FSMSystem.AddState(m_MonsterAttackState); m_MonsterBeAttackState = new MonsterBeAttackState(); m_FSMSystem.AddState(m_MonsterBeAttackState); MonsterDieState dieState = new MonsterDieState(); m_FSMSystem.AddState(dieState); MonsterStandState standState = new MonsterStandState(); m_FSMSystem.AddState(standState); m_MonsterBeHitFlyState = new MonsterBeHitFlyState(); m_FSMSystem.AddState(m_MonsterBeHitFlyState); MonsterBeAdsorbState monsterBeAdsorbState = new MonsterBeAdsorbState(); m_FSMSystem.AddState(monsterBeAdsorbState); m_FSMSystem.AddState(new MonsterBeHordeState()); m_FSMSystem.PerformTransition(Transition.MonsterToIdle); }
private void Start() { moveState = MonsterMoveState.IDLE; navagent.speed = defaultSpeed; outgoingStopDist = stopDistance; outGoingIdleTime = idleDuration; outgoingRange = fovRange; }
private void Seek() { if (IsPlayerVisible(transform.position, playerTransform.position, outgoingRange)) { navagent.speed = chaseSpeed; moveState = MonsterMoveState.CHASING; } else if (Vector3.Distance(transform.position, destination) < outgoingStopDist) { navagent.isStopped = true; moveState = MonsterMoveState.IDLE; } }
private void Chase() { if (IsPlayerVisible(transform.position, playerTransform.position, outgoingRange)) { SetDestination(playerTransform.position); } else if (Vector3.Distance(transform.position, destination) > outgoingRange) { navagent.speed = defaultSpeed; navagent.isStopped = true; moveState = MonsterMoveState.IDLE; } }
private void Seek() { if (PlayerVisible(transform.position, playerTransform.position, outgoingRange)) { DisableWallPhase(false); navagent.speed = chaseSpeed; moveState = MonsterMoveState.CHASING; } else if (Vector3.Distance(transform.position, destination) < outgoingStopDist) { navagent.isStopped = true; moveState = MonsterMoveState.IDLE; outgoingStopDist = Random.Range(minStopDist, maxStopDist); SetDestination(waypoints[Random.Range(0, waypoints.Length)].GetComponent <Transform>().position); } }
private void Idle() { outGoingIdleTime -= Time.deltaTime; if (outGoingIdleTime <= 0f) { navagent.isStopped = false; moveState = MonsterMoveState.SEEKING; outGoingIdleTime = idleDuration; } else if (IsPlayerVisible(transform.position, playerTransform.position, outgoingRange)) { navagent.isStopped = false; navagent.speed = chaseSpeed; moveState = MonsterMoveState.CHASING; outGoingIdleTime = idleDuration; } }
private void Chase() { if (PlayerVisible(transform.position, playerTransform.position, outgoingRange)) { SetDestination(playerTransform.position); if (moveState == MonsterMoveState.CHASING && navagent.speed <= maxSpeed) { navagent.speed += speedMultiplier * Time.deltaTime; } } else if (Vector3.Distance(transform.position, destination) > outgoingRange) { navagent.speed = defaultSpeed; navagent.isStopped = true; moveState = MonsterMoveState.IDLE; } }
private void Awake() { GameObject[] minionWPs = GameObject.FindGameObjectsWithTag("MinionWaypoint").ToArray(); GameObject[] bossWPs = GameObject.FindGameObjectsWithTag("Waypoint").ToArray(); moveState = MonsterMoveState.IDLE; navagent = GetComponent <NavMeshAgent>(); playerTransform = GameObject.FindGameObjectWithTag("Player").GetComponent <Transform>(); phaseableWalls = GameObject.FindGameObjectsWithTag("Phaseable").ToArray(); waypoints = minionWPs.Concat(bossWPs).ToArray(); idleCounter = Random.Range(minIdle, maxIdle); navagent.speed = defaultSpeed; outgoingStopDist = minStopDist; outgoingMinIdle = minIdle; outgoingMaxIdle = maxIdle; outgoingRange = fovRange; monstersPosition = transform.position; monstersLastPosition = monstersPosition; }
private void Stuck() { stepCounter -= Time.deltaTime; if (stepCounter <= 0f) { monstersPosition = transform.position; if (Vector3.Distance(monstersPosition, monstersLastPosition) < 0.05f) { SetDestination(waypoints[Random.Range(0, waypoints.Length)].GetComponent <Transform>().position); moveState = MonsterMoveState.SEEKING; navagent.speed = defaultSpeed; } else { monstersLastPosition = transform.position; stepCounter = 3f; } } }
private void Idle() { idleCounter -= Time.deltaTime; if (idleCounter <= 0f) { if (!insideWall) { DisableWallPhase(Random.Range(0f, 1f) >= 0.5f ? true : false); } navagent.isStopped = false; moveState = MonsterMoveState.SEEKING; idleCounter = Random.Range(outgoingMinIdle, outgoingMaxIdle); } else if (PlayerVisible(transform.position, playerTransform.position, outgoingRange)) { DisableWallPhase(false); navagent.isStopped = false; navagent.speed = chaseSpeed; moveState = MonsterMoveState.CHASING; idleCounter = Random.Range(outgoingMinIdle, outgoingMaxIdle); } }
//public void SetArrowBehaviour(ArrowBehaviour arrowBehaviour) //{ // this.m_ArrowBehaviour = arrowBehaviour; //} public void EntityMove(SMsgActionMove_SCS sMsgActionMove) { monsterMoveNodes.Add(new Vector3(sMsgActionMove.floatX / 10.0f, 0.1f, sMsgActionMove.floatY / -10.0f)); if (m_FSMSystem.CurrentStateID == StateID.MonsterBeHitFly || m_FSMSystem.CurrentStateID == StateID.MonsterStand || m_FSMSystem.CurrentStateID == StateID.MonsterBeAttacked || m_FSMSystem.CurrentStateID == StateID.MonsterAttack) { TraceUtil.Log(SystemModel.Common, TraceLevel.Error, "wrong node"); return; } if (this.RoleDataModel.SMsg_Header.uidEntity == sMsgActionMove.uidEntity && MonsterBehaviour.UsePathSmooth) { m_currentNode = sMsgActionMove; Vector2 lastPos = new Vector2(m_lastNode.floatX, m_lastNode.floatY); Vector2 currentPos = new Vector2(ThisTransform.position.x * 10.0f, ThisTransform.position.z * (-10.0f)); if (m_currentNode.fSpeed > 0.1f) //Vector2.Distance( currentPos , lastPos) > 0.1f && lastPos != Vector2.zero) { if (m_FSMSystem.CurrentStateID == StateID.MonsterIdle) { m_smooth.Init(ThisTransform.position, ThisTransform.TransformDirection(Vector3.forward) * WalkSpeed, new Vector3(sMsgActionMove.floatX / 10.0f, 0, -sMsgActionMove.floatY / 10.0f), new Vector3(sMsgActionMove.fDirectX, 0, -sMsgActionMove.fDirectY) * sMsgActionMove.fSpeed / 10.0f, ConfigDefineManager.TIME_MOVE_SYNC_FOWARD); nodes.Clear(); for (int i = 0; i <= 10; i++) { Vector3 nodepos = m_smooth.GetCurrentPos(0.1f * i); nodes.Add(new Vector3(nodepos.x, 1, nodepos.z)); } m_FSMSystem.PerformTransition(Transition.MonsterToMove); MonsterMoveState state = (MonsterMoveState)m_FSMSystem.CurrentState; state.ResetSmooth(ConfigDefineManager.TIME_MOVE_SYNC_FOWARD); } else if (m_FSMSystem.CurrentStateID == StateID.MonsterMove) { MonsterMoveState state = (MonsterMoveState)m_FSMSystem.CurrentState; state.ResetSmooth(ConfigDefineManager.TIME_MOVE_SYNC_FOWARD); m_smooth.Init(ThisTransform.position, ThisTransform.TransformDirection(Vector3.forward) * WalkSpeed, new Vector3(sMsgActionMove.floatX / 10.0f, 0, -sMsgActionMove.floatY / 10.0f), new Vector3(sMsgActionMove.fDirectX, 0, -sMsgActionMove.fDirectY) * sMsgActionMove.fSpeed / 10.0f, ConfigDefineManager.TIME_MOVE_SYNC_FOWARD); nodes.Clear(); for (int i = 0; i <= 10; i++) { Vector3 nodepos = m_smooth.GetCurrentPos(0.1f * i); nodes.Add(new Vector3(nodepos.x, 1, nodepos.z)); } } m_clientEndPos = null; ClientMove = true; } else { m_clientEndPos = new Vector3(CurrentNode.floatX / 10.0f, 0, CurrentNode.floatY / -10.0f); ClientMove = false; } m_lastNode = m_currentNode; } WalkToPosition = ThisTransform.position; WalkToPosition = WalkToPosition.Value.GetFromServer(sMsgActionMove.floatX, 0.1f, sMsgActionMove.floatY, -0.1f); }