void UpdatePathing(Unit unit) { NavMeshAgent navAgent = unit.parts.navMeshAgent; if (navAgent == null || !navAgent.isActiveAndEnabled) { return; } const float epsilon = 0.001f; Unit.State.Persistent persistent = unit.state.persistent; if (persistent.navTarget == null) { navAgent.isStopped = true; navAgent.ResetPath(); } else { NavMeshHit hitInfo; bool validNavTarget = NavMesh.SamplePosition( persistent.navTarget.Value, out hitInfo, maxDistance: Mathf.Infinity, areaMask: 1 << 0 ); if (!validNavTarget) { persistent.navTarget = null; return; } float diff = Vector3.Distance(hitInfo.position, navAgent.destination); if (diff > epsilon) { //Dbg.Log("Setting new destination"); bool success = navAgent.SetDestination(persistent.navTarget.Value); if (!success) { persistent.navTarget = null; } } if (persistent.navTarget != null) { bool reached = ReachedDestination(unit); if (reached) { //Dbg.Log("Reached destination"); persistent.navTarget = null; } } } }
#pragma warning restore 0649 #endregion // Serialized Fields #endregion // Fields #region Properties #endregion // Properties #region Methods public override void DoUpdate() { Unit.State.Persistent persistent = unit.state.persistent; Unit.State.Momentary momentary = unit.state.momentary; Unit.ManagerState manState = unit.manState; Unit.ManagerState.AiData aiData = manState.aiData; switch (aiData.state) { case Unit.AiState.Idle: persistent.navTarget = manState.homePoint; break; case Unit.AiState.Chasing: persistent.navTarget = aiData.closestTarget.transform.position; break; } }