コード例 #1
0
ファイル: NavArea2D.cs プロジェクト: TylerStein/Spooktober
    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);
    }
コード例 #2
0
    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;
                }
            }
        }
    }