/// <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)); }
/// <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); } } }
/// <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; }