/// <summary> /// Tries to add a tile to the collection. /// Fails when the priority of the tile is lower than the already present one. /// </summary> /// <param name="inCoordinate">Coordinate to add or change area index for.</param> /// <param name="inAreaIndex">Index of the area to add to the coordinate.</param> public void TryAddTile(Vector2Int inCoordinate, int inAreaIndex) { if (!NavTileAreaManager.IsAreaIndexValid(inAreaIndex)) { return; } if (Tiles.ContainsKey(inCoordinate)) { NavTileArea area = NavTileManager.Instance.AreaManager.GetAreaByID(inAreaIndex); TileData presentData = Tiles[inCoordinate]; if (presentData.Area.Priority <= area.Priority) { // Override if priority is higher presentData.AreaIndex = inAreaIndex; } } else { Tiles[inCoordinate] = new TileData(inAreaIndex); UpdateBounds(inCoordinate); } }
/// <summary> /// Refreshes a tile to the area with the highest priority. /// This can be used if a tile was previously overridden and has to be reset. /// </summary> /// <param name="inCoordinate">Coordinate to remove area info for.</param> public void RefreshTile(Vector2Int inCoordinate) { TileBase[] tiles = NavTileManager.Instance.SurfaceManager.GetAllTilesAtPosition(inCoordinate); int highestAreaIndex = -1; for (int i = 0; i < tiles.Length; i++) { int areaIndex = NavLinkManager.GetNavTileAreaIndexForTile(tiles[i]); NavTileArea navArea = NavTileManager.Instance.AreaManager.GetAreaByID(areaIndex); if (navArea == null) { continue; } if (highestAreaIndex == -1 || navArea.Priority > NavTileManager.Instance.AreaManager.GetAreaByID(highestAreaIndex).Priority) { highestAreaIndex = areaIndex; } } if (highestAreaIndex >= 0) { OverrideTile(inCoordinate, highestAreaIndex); } else { RemoveTile(inCoordinate); } }
/// <summary> /// Draw the reorderable list elements with a variable setting field depending on the passed in category. /// </summary> private void DrawAreaSettingsListElement(Rect inRect, int inIndex, bool inSelected, bool inFocused, AreaSettingsCategory inCategory) { int previousIndentLevel = EditorGUI.indentLevel; EditorGUI.indentLevel = 0; SerializedProperty areaSettingsProperty = _areaSettingsListProperty.GetArrayElementAtIndex(inIndex); if (areaSettingsProperty == null) { return; } int areaIndex = areaSettingsProperty.FindPropertyRelative("AreaIndex").intValue; NavTileArea area = NavTileManager.Instance.AreaManager.AllAreas[areaIndex]; inRect.height -= 2; Rect maskIDRect, colorRect, areaNameRect; EditorHelper.VariableRect settingsRect; GetAreaSettingsListRects(inRect, out maskIDRect, out colorRect, out areaNameRect, out settingsRect); // Draw area info. EditorGUI.LabelField(maskIDRect, areaIndex.ToString()); EditorHelper.DrawRectWithOutline(colorRect, area.Color, new Color(area.Color.r / 4f, area.Color.g / 4f, area.Color.b / 4f), 1); EditorGUI.LabelField(areaNameRect, area.Name); DrawAreaSetting(areaSettingsProperty, settingsRect, inCategory); EditorGUI.indentLevel = previousIndentLevel; }
/// <summary> /// Creates the list of areas and sets the two default values. /// </summary> public void InitializeDefaultNavTileAreas() { float hueStep = 93.32f / 255f; //93.32f gives a varied color selection with few repeats. float hue = 0; float saturation = .65f; float value = 1; _areas = new NavTileArea[32]; _areas[0] = new NavTileArea("Walkable", 0, Color.HSVToRGB(.6f, saturation, value), 0); _areas[1] = new NavTileArea("Non Walkable", 0, Color.HSVToRGB(0, saturation, value), 1); for (int i = 2; i < _areas.Length; i++) { hue += hueStep; hue %= 1; _areas[i] = new NavTileArea("", 0, Color.HSVToRGB(hue, saturation, value), 0); } }