public void Stop() { if (m_state == EnumNavigationState.e_finished) { return; } m_agent.isStopped = true; m_state = EnumNavigationState.e_stopped; }
// Update is called once per frame void Update() { switch (m_state) { case EnumNavigationState.e_pending: if (!m_agent.pathPending) { m_state = EnumNavigationState.e_moving; } break; case EnumNavigationState.e_moving: // fin déplacement if (m_agent.remainingDistance - m_agent.stoppingDistance <= float.Epsilon) { MovementEnding(); m_state = EnumNavigationState.e_finished; } else if (!float.IsNaN(m_orientation) && m_agent.remainingDistance <= m_rotatingDistance) { RotationBegining(); m_state = EnumNavigationState.e_rotatingAndMoving; } break; case EnumNavigationState.e_rotatingAndMoving: // fin déplacement if (m_agent.remainingDistance - m_agent.stoppingDistance <= float.Epsilon) { m_state = EnumNavigationState.e_rotating; } break; case EnumNavigationState.e_rotating: // fin de rotation if (m_state == EnumNavigationState.e_rotating && Mathf.Abs(transform.eulerAngles.y - m_orientation) <= 1f) { RotationEnding(); m_state = EnumNavigationState.e_finished; } else { Rotate(); } break; case EnumNavigationState.e_finished: break; case EnumNavigationState.e_stopped: break; default: break; } }
/******** OUR MESSAGES ************************/ /******** PUBLIC ************************/ public void Goto(Vector3 p_destination) { // store/init data m_destination = p_destination; m_orientation = float.NaN; // agent will try to face the movement direction while moving m_agent.updateRotation = true; m_agent.SetDestination(p_destination); // currently computing path m_state = EnumNavigationState.e_pending; }