Exemplo n.º 1
0
        /// <summary>
        /// Filters the selected Tiles and outputs a list of NavTiles and NavLinks in case selected.
        /// </summary>
        private void GetSelectedNavTiles(out List <NavTile> outNavTiles, out List <NavLink> outNavLinks)
        {
            outNavTiles = new List <NavTile>();
            outNavLinks = new List <NavLink>();

            TileBase[] tiles = GetSelectedTiles();

            if (tiles == null)
            {
                return;
            }

            foreach (TileBase tile in tiles)
            {
                if (tile is NavTile)
                {
                    outNavTiles.Add(tile as NavTile);
                }
                else
                {
                    NavLink link = null;

                    if ((link = NavTileManager.Instance.LinkManager.GetLinkedTile(tile)) != null)
                    {
                        outNavLinks.Add(link);
                    }
                }
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Gets the linked NavTileArea if it is stored, otherwise returns null.
        /// </summary>
        /// <param name="inTile">Tile to find the linked area with.</param>
        /// <returns>The NavTileArea index linked to the tile or -1 if no link was found.</returns>
        public int GetLinkedAreaIndex(TileBase inTile)
        {
            NavLink link = GetLinkedTile(inTile);

            if (link == null)
            {
                return(-1);
            }

            return(link.AreaIndex);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Finds and stores all NavLink assets in the resource folder.
        /// </summary>
        public List <NavLink> RefreshAllNavLinks()
        {
            NavLinkDictionary previousDictionary = _navLinkDictionary;

            _navLinkDictionary = new NavLinkDictionary();
            List <NavLink> duplicateLinks = new List <NavLink>();

            UnityEngine.Object[] linkObjects = Resources.LoadAll("", typeof(NavLink));

            foreach (UnityEngine.Object linkObj in linkObjects)
            {
                NavLink link = (NavLink)linkObj;

                // Ignore null values.
                if (link.LinkedTile == null)
                {
                    continue;
                }

                // Ignore duplicates.
                if (_navLinkDictionary.ContainsKey(link.LinkedTile))
                {
                    duplicateLinks.Add(link);
                    Debug.LogWarning("Duplicate NavLink found, a tile can only be linked once", link);
                    continue;
                }

                // Remove found links from previous dictionary to have the non-resource folder links left.
                if (previousDictionary.ContainsKey(link.LinkedTile))
                {
                    previousDictionary.Remove(link.LinkedTile);
                }

                _navLinkDictionary.Add(link.LinkedTile, link);
            }

            // Add the non-resource folder links to the new dictionary.
            foreach (var linkPair in previousDictionary)
            {
                if (linkPair.Key != null && linkPair.Value != null && !_navLinkDictionary.ContainsKey(linkPair.Key))
                {
                    _navLinkDictionary.Add(linkPair.Key, linkPair.Value);
                }
            }

#if UNITY_EDITOR
            EditorUtility.SetDirty(NavTileManager.Instance);
#endif

            return(duplicateLinks);
        }
Exemplo n.º 4
0
        static void CreateNavLinkForTile()
        {
            List <TileBase> tiles = new List <TileBase>();

            foreach (Object obj in Selection.objects)
            {
                if (obj is TileBase && !(obj is NavTile))
                {
                    tiles.Add((TileBase)obj);
                }
            }

            if (!AssetDatabase.IsValidFolder("Assets/Resources"))
            {
                AssetDatabase.CreateFolder("Assets", "Resources");
            }

            if (!AssetDatabase.IsValidFolder("Assets/Resources/NavLinks"))
            {
                AssetDatabase.CreateFolder("Assets/Resources", "NavLinks");
            }

            Object[] newLinks = new Object[tiles.Count];

            for (int i = 0; i < tiles.Count; i++)
            {
                EditorUtility.DisplayProgressBar("Creating NavLink(s)", $"Linking {tiles[i].name}", (float)i / (tiles.Count - 1));

                if (NavTileManager.Instance.LinkManager.ContainsTileLink(tiles[i]))
                {
                    Debug.LogWarning("Tried to create a NavLink for a already linked tile.", tiles[i]);
                    continue;
                }

                NavLink aLink = ScriptableObject.CreateInstance <NavLink>();

                aLink.LinkedTile = tiles[i];

                AssetDatabase.CreateAsset(aLink, "Assets/Resources/NavLinks/" + tiles[i].name + "Link.asset");

                aLink.OnTileChanged(null, aLink.LinkedTile);

                newLinks[i] = aLink;
            }

            EditorUtility.ClearProgressBar();

            Selection.objects = newLinks;
        }
Exemplo n.º 5
0
        /// <summary>
        /// Add a NavLink to the collection. Ignores null and duplicates.
        /// </summary>
        /// <param name="inTile">Tile to link with.</param>
        /// <param name="inLink">Linked NavTile object.</param>
        public void AddNavLink(TileBase inTile, NavLink inLink)
        {
            if (inTile != null && inLink != null)
            {
                if (_navLinkDictionary.ContainsKey(inTile))
                {
                    Debug.LogWarning("Tried to add already present tile.", inLink);
                    return;
                }

                _navLinkDictionary.Add(inTile, inLink);
            }
            else
            {
                Debug.LogWarning("Tried to add null tile to NavLinkManager.", inLink);
            }
        }
Exemplo n.º 6
0
        /// <summary>
        /// Gets the linked NavTile if it is stored, otherwise returns null.
        /// </summary>
        /// <param name="inTile">Tile to find a link with.</param>
        /// <returns>The NavLink linked to the tile or null if no link was found.</returns>
        public NavLink GetLinkedTile(TileBase inTile)
        {
            if (inTile == null)
            {
                return(null);
            }

            NavLink navTile = null;

            if (_navLinkDictionary.TryGetValue(inTile, out navTile))
            {
                return(navTile);
            }
            else
            {
                return(null);
            }
        }
Exemplo n.º 7
0
        /// <summary>
        /// Called when a different tile is selected in the inspector.
        /// </summary>
        /// <param name="inPreviousTile">Previously selected tile.</param>
        /// <param name="inNewTile">Newly selected tile.</param>
        public void OnTileChanged(TileBase inPreviousTile, TileBase inNewTile)
        {
            NavLinkManager manager     = NavTileManager.Instance.LinkManager;
            NavLink        presentLink = manager.GetLinkedTile(inPreviousTile);

            // Remove any present data.
            if (presentLink == this)
            {
                // Tile present, remove it.
                manager.RemoveNavLink(inPreviousTile);
            }

            // Add new data.
            if (inNewTile != null)
            {
                manager.AddNavLink(inNewTile, this);
            }

            // Save dictionary and changed tile.
            EditorUtility.SetDirty(NavTileManager.Instance);
            EditorUtility.SetDirty(this);
        }