public void SetDestination(Vector3 point) { NavArea2D area = navManager.GetClosestArea(point); if (!area) { Debug.LogWarning($"Failed to find target area of point {point.ToString()} for agent", this); return; } if (!currentArea) { currentArea = navManager.GetClosestArea(transform.position); } path = navManager.GetPath(currentArea, area); if (path == null) { Debug.LogWarning($"Failed to find path to point {point.ToString()} for agent", this); return; } bool hasLink = currentArea.GetLinkToArea(path.Peek(), out lastLink); if (path.Count > 1 && !hasLink) { path.Clear(); Debug.LogWarning($"Failed initialize first link to point {point.ToString()} for agent", this); hasDestination = false; return; } targetArea = area; targetPosition = point; hasDestination = true; }
private void NavigateAreas() { currentArea = navManager.GetContainingArea(transform.position); if (!movementController.isOnStairs && currentArea == targetArea) { // arrived in target area, basic nav takes over from here path.Pop(); } else if (movementController.isOnStairs) { // move along stairs Vector3 moveTarget; if (lastLink.linkStairsPoint != null) { moveTarget = lastLink.linkStairs.GetOppositePoint(lastLink.linkStairsPoint).position; } else { moveTarget = movementController.GetNearestStairsMountPoint(); } // move along stairs float xDiff = (moveTarget - transform.position).x; movementController.Move(Vector2.right * Mathf.Sign(xDiff)); } else { NavArea2D nextArea = path.Peek(); if (currentArea == nextArea) { // already in next area path.Pop(); } else { NavArea2DLink link; bool hasLink = currentArea.GetLinkToArea(path.Peek(), out link); if (hasLink) { lastLink = link; if (link.linkType == NavLinkType.NORMAL) { // move towards next area float xDiff = (link.linkedArea.center - transform.position).x; movementController.Move(Vector2.right * Mathf.Sign(xDiff)); } else if (link.linkType == NavLinkType.STAIRS) { if (currentArea == nextArea) { // already in next area path.Pop(); } // move to stairs to get to next area float xDiff = (link.linkStairsPoint.position - transform.position).x; float xDist = Mathf.Abs(xDiff); movementController.Move(Vector2.right * Mathf.Sign(xDiff)); if (xDist < closeOnTargetDistance) { movementController.MountStairs(link.linkStairs); } } } else { path.Clear(); Debug.LogWarning("Path no longer valid, aborting"); return; } } } }