/// <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);
            }
        }
Beispiel #3
0
        /// <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);
            }
        }