Unity Hierarchy enhancement. Use Alt+Left Mouse Button to select.
- Favorate GameObjects for quick access
- Draw indent guild
- Allow set icons (pre-set & custom)
- Auto set icons for camera, cavans, light, eventSystem & Wwise Initializer
- Prefab footer icon if you have custom icon set
-
Using OpenUPM
openupm add today.comes.saintshierarchy
-
Using git upm:
add to
Packages/manifest.jsonin your project{ "dependencies": { "today.comes.saintshierarchy": "https://github.com/TylerTemp/SaintsHierarchy.git", // your other dependencies... } }
-
Using git upm (Unity UI):
Window-Package Manager- Click
+button,Add package from git URL - Enter the following URL:
https://github.com/TylerTemp/SaintsHierarchy.git -
Using a
unitypackage:Go to the Release Page to download a desired version of
unitypackageand import it to your project -
Using a git submodule:
git submodule add https://github.com/TylerTemp/SaintsHierarchy.git Packages/today.comes.saintshierarchy
This will automaticlly add indent tree, and icon for camera, light, canvas, event system, wwise
Tools - Saints Hierarchy - Disable Saints Hierarchy to disable this plugin
You can disable this feature in Tools - Saints Hierarchy - Disable Favorites
It by default save favorite configs to personal config. If you're a one-person-army, you can use Tools - Saints Hierarchy - Save Favorites To Project Config so this config can be tracked by your version control like git.
Drag & Drop GameObject from hierarchy to the top space to add it to favorite.
- Clicking the favorited button to quickly arrive the object in hierarchy
- Draging it to adjust the favorite items' order
- Right click (or
alt+ click) the favorite button to change alias, icon, color, or remove it from favorite
c_fav.mp4
Tools - Saints Hierarchy - Background Strip
Tools - Saints Hierarchy - Component Icons
You can set the script icon and show the icons at the end of row
Setup:
Result:
Tools - Saints Hierarchy - GameObject Enabled Checker
Add a checkbox at the end for gameObject which has any disabled parent gameObjects, to quickly toggle it back.
Tools - Saints Hierarchy - GameObject Enabled Checker Every Row
This add checkbox for every row instead of undering disabled parent ones.
No longer draw the default white box icon if no icon for this gameObject.
Draw a transparent box icon if no icon for this gameObject.
GameObject icon (including custom icons) will be used as hierarchy icon:
Result:
GameObject label will be used as hierarchy label underline:
Result:
- select a color to change
- use
xbutton to clean the color config - use the color picker (second button) to manually change the color you want
- select an icon to change
- to use your custom icon, first right click on you icon - copy path, then paste it into the search field. The icon will appear as the first item on the result
- select the same icon to remove icon config
public class HierarchyIconPathExample : MonoBehaviour, IHierarchyIconPath
{
public string HierarchyIconPath => "CollabChanges Icon"; // return a path or name of the icon
}Or
public class HierarchyIconTexture2DExample: MonoBehaviour, IHierarchyIconTexture2D
{
public Texture2D texture2D;
#if UNITY_EDITOR
public Texture2D HierarchyIconTexture2D => texture2D; // return a texture2D object; null to use default behavor
#endif
}Draw label. Callback & tag supported.
Parameters:
string label = null: label to draw. Use"$" + nameto make a callback/propertystring tooltip = null: tooltip to show
using SaintsHierarchy;
[HierarchyLabel("<color=CadetBlue><field/>")]
[HierarchyLeftLabel("<color=CadetBlue>|LEFT|")]
public string content;Draw button. Callback & tag supported.
Parameters:
string label = null: label of the button.nullto use function name. use"$" + nameto use a callback labelstring tooltip = null: tooltip to show
using SaintsHierarchy;
public string c;
[HierarchyGhostButton("$" + nameof(c), "Click Me!")] // dynamic label
private void OnBtnClick()
{
Debug.Log($"click {c}");
}
[HierarchyLeftButton("C <color=Burlywood>Left")]
private void LeftClick()
{
Debug.Log("Left Click");
}Manually draw content
Parameters:
string groupBy = null: group the items virtically by this name. Ifnull, it will not share space with anyone.
Signature:
The method must have this signaure:
HierarchyUsed FuncName(HierarchyArea hierarchyArea)HierarchyArea has the following fields:
/// <summary>
/// Rect.y for drawing
/// </summary>
public readonly float Y;
/// <summary>
/// Rect.height for drawing
/// </summary>
public readonly float Height;
/// <summary>
/// the x value where the title (gameObject name) started
/// </summary>
public readonly float TitleStartX;
/// <summary>
/// the x value where the title (gameObject name) ended
/// </summary>
public readonly float TitleEndX;
/// <summary>
/// the x value where the empty space start. You may want to start draw here
/// </summary>
public readonly float SpaceStartX;
/// <summary>
/// the x value where the empty space ends. When drawing from right, you need to backward drawing starts here
/// </summary>
public readonly float SpaceEndX;
/// <summary>
/// The x drawing position. It's recommend to use this as your start drawing point, as SaintsHierarchy will
/// change this value accordingly everytime an item is drawn.
/// </summary>
public readonly float GroupStartX;
/// <summary>
/// When using `GroupBy`, you can see the vertical rect which already used by others in this group
/// </summary>
public readonly IReadOnlyList<Rect> GroupUsedRect;
public float TitleWidth => TitleEndX - TitleStartX;
public float SpaceWidth => SpaceEndX - SpaceStartX;
/// <summary>
/// A quick way to make a rect
/// </summary>
/// <param name="x">where to start</param>
/// <param name="width">width of the rect</param>
/// <returns>rect space you want to draw</returns>
public Rect MakeXWidthRect(float x, float width)
{
if(width >= 0)
{
return new Rect(x, Y, width, Height);
}
return new Rect(x + width, Y, -width, Height);
}After you draw your item, use return new HierarchyUsed(useRect); to tell the space you've used. Use return default if you don't draw this time.
public bool play;
[Range(0f, 1f)] public float range1;
[Range(0f, 1f)] public float range2;
private string ButtonLabel => play ? "Pause" : "Play";
#if UNITY_EDITOR
[HierarchyLeftButton("$" + nameof(ButtonLabel))]
private IEnumerator LeftBtn()
{
play = !play;
// ReSharper disable once InvertIf
if (play)
{
while (play)
{
range1 = (range1 + 0.0005f) % 1;
range2 = (range2 + 0.0009f) % 1;
EditorApplication.RepaintHierarchyWindow();
yield return null;
}
}
}
[HierarchyDraw("my progress bar")]
private HierarchyUsed DrawRight1G1(HierarchyArea headerArea)
{
Rect useRect = new Rect(headerArea.MakeXWidthRect(headerArea.GroupStartX - 40, 40))
{
height = headerArea.Height / 2,
};
Rect progressRect = new Rect(useRect)
{
width = range1 * useRect.width,
};
EditorGUI.DrawRect(useRect, Color.gray);
EditorGUI.DrawRect(progressRect, Color.red);
return new HierarchyUsed(useRect);
}
[HierarchyDraw("my progress bar")]
private HierarchyUsed DrawRight1G2(HierarchyArea headerArea)
{
Rect useRect = new Rect(headerArea.MakeXWidthRect(headerArea.GroupStartX - 40, 40))
{
y = headerArea.Y + headerArea.Height / 2,
height = headerArea.Height / 2,
};
Rect progressRect = new Rect(useRect)
{
width = range2 * useRect.width,
};
EditorGUI.DrawRect(useRect, Color.gray);
EditorGUI.DrawRect(progressRect, Color.yellow);
return new HierarchyUsed(useRect);
}
#endif
















