Unity Hierarchy enhancement. Use Alt+Left Mouse Button to select.
- Favorate GameObjects for quick access
- Scene quick switcher
- 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
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
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.
c_fav.mp4
Clicking on a scene's name to quickly switch to another scene in this project. It lists scenes with order:
- Scene in build settings
- Scene in Addressable
- Scene in project
(You can disable this function in Tools - Saints Hierarchy - Disable Scene Selector)
c_scene_selector.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.
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













