public void OnSystemUpdate(float dt) { if (_nodeList == null) { _nodeList = EntityController.GetNodeList <PathfindMoverNode>(); } if (_nodeList == null || Game.Paused) { return; } for (int i = 0; i < _nodeList.Count; i++) { var node = _nodeList[i]; var pathfinder = node.Pathfinder.c; if (node.Debugging.c != null) { node.Debugging.c.UpdateStatus(pathfinder); } if (!node.Target.c.IsValid) { node.Pathfinder.c.ReachedDestination(); continue; } var currentMoveTarget = node.Target.c.GetTargetPosition.toPoint3(); if (pathfinder.End != currentMoveTarget) { pathfinder.SetEnd(currentMoveTarget); continue; } switch (pathfinder.CurrentStatus) { case SimplePathfindingAgent.Status.NoPath: if (pathfinder.Redirected && pathfinder.CanRepath) { pathfinder.SearchPath(); } continue; case SimplePathfindingAgent.Status.InvalidPath: case SimplePathfindingAgent.Status.Created: case SimplePathfindingAgent.Status.WaitingOnPath: continue; case SimplePathfindingAgent.Status.PathReceived: case SimplePathfindingAgent.Status.WaitingOnNode: if (pathfinder.CurrentStatus == SimplePathfindingAgent.Status.PathReceived) { if (node.Debugging.c != null) { node.Debugging.c.SetPath(pathfinder.CurrentNodePath); } _grid.SetStationaryAgent(pathfinder.CurrentPos, pathfinder.Entity, false); } if (!node.Pathfinder.c.TryEnterNextNode()) { continue; } break; } var moveSpeed = node.GetMoveSpeed; if (pathfinder.IsLastIndex) { moveSpeed *= 0.5f; } pathfinder.MovementLerp += dt * moveSpeed; float dst = pathfinder.GetCurrentDistance(); float progress = Mathf.Clamp01(pathfinder.MovementLerp / dst); node.Entity.Tr.position = Vector3.Lerp(pathfinder.PreviousTarget, pathfinder.CurrentTarget, progress); var dir = pathfinder.CurrentTarget - pathfinder.PreviousTarget; var nextRotation = dir != Vector3.zero ? Quaternion.LookRotation(dir, Vector3.up) : pathfinder.Entity.Tr.rotation; pathfinder.Entity.Tr.rotation = Quaternion.RotateTowards(pathfinder.Entity.Tr.rotation, nextRotation, _pathfinderRotationSpeed * dt); if (progress < 1) { continue; } _grid.Exit(node.Entity, pathfinder.GridTarget); pathfinder.CurrentPos = pathfinder.GridTarget; if (pathfinder.CurrentIndex >= pathfinder.CurrentNodePath.Count - 1) { node.Pathfinder.c.ReachedDestination(); node.Target.c.Clear(); if (node.Debugging.c != null) { node.Debugging.c.ClearPath(); } continue; } pathfinder.AdvancePath(); if (pathfinder.CanRepath) { pathfinder.SearchPath(); continue; } pathfinder.TryEnterNextNode(); } }