예제 #1
0
        /// <summary>
        /// Checks if a tile is walkable at a coordinate.
        /// Null tiles are marked as unwalkable.
        /// </summary>
        /// <param name="inCoordinate">Coordinate to check walkability.</param>
        /// <param name="inAreaMask">Area mask to check with.</param>
        /// <returns>Whether or not the tile is walkable.</returns>
        public bool IsTileWalkable(Vector2Int inCoordinate, int inAreaMask)
        {
            TileData theTile = GetTileData(inCoordinate);

            if (theTile == null)
            {
                return(false);
            }

            return(theTile.IsWalkable(inAreaMask));
        }
예제 #2
0
        /// <summary>
        /// Sets the distance on a tile based on the situation that tile is in.
        /// </summary>
        private void SetDistance(JumpPointDirection inDirection, TileData inCurrentTile, ref TileData refRelevantTile, ref int refCurrentDistance)
        {
            if (inCurrentTile == null)
            {
                return;
            }
            else if (!inCurrentTile.IsWalkable(1)) // Is the tile NOT walkable?
            {
                // Set the tile as the relevant one and reset the jump distance.
                refRelevantTile    = inCurrentTile;
                refCurrentDistance = 0;
            }
            else if ((((inCurrentTile.AdditionalData as AdditionalJPSPlusData).JumpPointDirections) & inDirection) != 0) // Is the current tile a jump point in the given direction?
            {
                // If the relevant tile is not walkable or non-existent, set the distance to be negative.
                if (refRelevantTile == null || !refRelevantTile.IsWalkable(1))
                {
                    refCurrentDistance *= -1;
                }
                else // Otherwise do a +1.
                {
                    refCurrentDistance++;
                }

                // assign the jump distance.
                (inCurrentTile.AdditionalData as AdditionalJPSPlusData).SetJumpDistance(inDirection, refCurrentDistance);

                // Reset it to be counted from the current tile.
                refRelevantTile    = inCurrentTile;
                refCurrentDistance = 0;
            }
            else // No special tile, keep counting and assign intermediate value to the jump distance in the relevant direction.
            {
                if (refRelevantTile == null || !refRelevantTile.IsWalkable(1))
                {
                    (inCurrentTile.AdditionalData as AdditionalJPSPlusData).SetJumpDistance(inDirection, refCurrentDistance * -1);
                    refCurrentDistance++;
                    return;
                }
                else
                {
                    (inCurrentTile.AdditionalData as AdditionalJPSPlusData).SetJumpDistance(inDirection, ++refCurrentDistance);
                }
            }
        }
예제 #3
0
        /// <summary>
        /// Checks the grid and marks any jump point.
        /// </summary>
        private void IdentifyJumpPoint(KeyValuePair <Vector2Int, TileData> inTile, NavTileSurfaceData inData)
        {
            JumpPointDirection jumpPointFlag = JumpPointDirection.None;

            if (inTile.Value == null || !inTile.Value.IsWalkable(1))
            {
                return;
            }

            // Hard coded 0 to 3 as there are only 4 cardinal directions.
            for (int i = 0; i <= 3; i++)
            {
                JumpPointDirection parentDirection = (JumpPointDirection)(1 << i);
                Vector2Int         parentPosition  = GetNextPositionInDirection(inTile.Key, parentDirection);

                TileData parentTile = inData.GetTileData(parentPosition);

                if (parentTile == null || !parentTile.IsWalkable(1))
                {
                    continue;
                }

                JumpPointDirection firstPerpendicularDirection;
                JumpPointDirection secondPerpendicularDirection;

                GetPerpendicularDirections(parentDirection, out firstPerpendicularDirection, out secondPerpendicularDirection);

                if ((HasAdjacentTraverseNode(inTile.Key, firstPerpendicularDirection, inData) && !HasAdjacentTraverseNode(parentPosition, firstPerpendicularDirection, inData)) ||
                    HasAdjacentTraverseNode(inTile.Key, secondPerpendicularDirection, inData) && !HasAdjacentTraverseNode(parentPosition, secondPerpendicularDirection, inData))
                {
                    jumpPointFlag |= GetOppositeDirection(parentDirection);
                }
            }

            (inTile.Value.AdditionalData as AdditionalJPSPlusData).JumpPointDirections = jumpPointFlag;
        }