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