public bool GetLinkToArea(NavArea2D otherArea, out NavArea2DLink outLink) { foreach (NavArea2DLink link in links) { if (link.linkedArea == otherArea) { outLink = link; return(true); } } outLink = new NavArea2DLink(); return(false); }
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; } } } }