- C# 100%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| Editor | ||
| Runtime | ||
| Samples~ | ||
| .gitattributes | ||
| .gitignore | ||
| CHANGELOG.md | ||
| CHANGELOG.md.meta | ||
| Editor.meta | ||
| LICENSE | ||
| LICENSE.meta | ||
| package.json | ||
| package.json.meta | ||
| README.md | ||
| README.md.meta | ||
| Runtime.meta | ||
Saints Hierarchy
Unity Hierarchy enhancement. Use Alt+Left Mouse Button to select.
Features
- Support both new and legacy Hierarchy API (Unity 6k.6+ for new, others for legacy)
- 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
Context Menu
...
Install
-
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
Change Log
Add alternative right click context menu to:
- Hide menu you don't want
- Move menu into another submenu, even a submenu you created
- Rename menu name, custom icons
- Provide default icons for menu
Use Tools - Saints Hierarchy - Replace Context Menu to enable it
Config
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
Favorite GameObjects
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
By default, clicking the favorite gameObject will only expand and highlight you to the target. If you want to inspect it when clicking, use Tools - Saints Hierarchy - Favorite Click To Inspect
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.
Quick Scene Selector
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)
Indent Guides
Tools - Saints Hierarchy - Indent Guides toggles tree connector lines in both the new and legacy Hierarchy. Enabled by default and saved in the active project or personal config.
Lines use the corresponding parent's configured color. The new Hierarchy hides guides while filtering search results.
Background Strip (Legacy)
This is legacy only. new Hierarchy by default uses background strip which is controlled by Unity.
Tools - Saints Hierarchy - Background Strip
Component Icons
Tools - Saints Hierarchy - Component Icons
You can set the script icon and show the icons at the end of row
Use Alt + left click on a component icon to open that component's properties popup. You can also toggle Behaviour.enabled for Behaviour components.
Disabled Behaviour component icons are dimmed.
You can also use Tools - Saints Hierarchy - Component Icons For General Scripts and Tools - Saints Hierarchy - Component Icons For Transform to control whether default script icons and Transform icons are shown.
Setup:
Result:
Alt-Click popup inspector:
New: Hierarchy Menu (3-dots) - Components(SH) allows to show as a column (use click instead of alt-click). You can decide which style you like.
Layer/Tag Picker
Quick change Layer/Tag, and search GameObject for that Layer/Tag.
New Hierarchy
Unity default layer/tag has no search ability. To use layer/tag picker with searcher, do: Hierarchy Menu (3-dots) - Layer (SH)/Tag (SH)
Legacy Hierarchy
Note: legacy hierarchy does not support tag/layer search, so we use Unity's built-in QuickSearch instead
Tools - Saints Hierarchy - Edit Config... and set layer/tag options
GameObject Enabled Checker (Legacy)
New: Unity already has this feature.
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.
Alternative Context Menu
Replace Unity's default right click popup menu to new style menu which supports:
- Search
- Re-Organization
- Hide
- Default Icons + Allow Custom Icons
- Customize!
You can easily search menu items using ctrl/cmd+f
You can easily customize it
Or disable it if you do not like it in Tools - Saints Hierarchy - Replace Context Menu
Usage
GameObject Icon
GameObject icon (including custom icons) will be used as hierarchy icon:
Result:
GameObject label will be used as hierarchy label underline:
Result:
Color
- 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
Custom Icon
- 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
Scripted Icon
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
}
HierarchyLabel/HierarchyLeftLabel
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;
HierarchyButton/HierarchyLeftButton/HierarchyGhostButton/HierarchyGhostLeftButton
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");
}
HierarchyDraw/HierarchyLeftDraw
Manually draw content using UI Toolkit in the new Hierarchy or IMGUI in the legacy Hierarchy.
New (UI Toolkit)
Parameters:
string groupBy = null: stack consecutive items with the same group name vertically on their chosen side. Ifnull, each item uses its own space.
Use a method returning a VisualElement or HierarchyArea:
VisualElement FuncName()
HierarchyArea FuncName()
HierarchyArea has the following fields for the new Hierarchy:
// The UI Toolkit element to display.
public readonly VisualElement Element;
// true to display in the left custom container; false for the right.
public readonly bool IsLeft;
Return new HierarchyArea(element) or a VisualElement directly to display on the right
Return new HierarchyArea(true, element) to display on the left
Return null for a VisualElement, or default for a HierarchyArea, to display nothing
using SaintsHierarchy;
using UnityEngine;
#if UNITY_EDITOR
using UnityEngine.UIElements;
#endif
public class CustomHierarchyExample : MonoBehaviour
{
[Range(0f, 1f)] public float progress;
#if UNITY_EDITOR
[HierarchyDraw]
private VisualElement DrawProgress()
{
var bar = new ProgressBar
{
lowValue = 0,
highValue = 1,
value = progress,
style = { width = 80, height = 16, flexShrink = 0 },
};
bar.schedule.Execute(() => bar.value = progress).Every(100);
return bar;
}
[HierarchyLeftDraw]
private HierarchyArea DrawLeft()
{
return new HierarchyArea(true, new Label("Left"));
}
#endif
}
Legacy (IMGUI)
Parameters:
string groupBy = null: group the items vertically by this name. Ifnull, it will not share space with anyone.
Signature:
The method must have this signature:
HierarchyUsed FuncName(HierarchyArea hierarchyArea)
HierarchyArea has the following fields and helpers for the legacy Hierarchy:
/// <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
Package is too simple
Your asset was reviewed by the Unity Content Operation team, and was not approved for the following reason(s): - Content Quality and Presentation. This package is too simple for our current standards (https://assetstore.unity.com/publishing/submission-guidelines, Section 1.1.a). Please spend more time researching the current game market, polishing and tweaking your package to a high degree of quality, and expanding its contents to reach a broader audience. We recommend visiting the Asset Store Forums so users may give you more feedback (https://forum.unity.com/forums/assets-and-asset-store.32/) and reading the Submission Guidelines (https://assetstore.unity.com/publishing/submission-guidelines). Until you make improvements, we have chosen not to publish this asset. However, we greatly appreciate the time and effort spent in preparing your submission. This restriction was made as the asset is not compliant with our content policy (https://unity.com/legal/asset-store-content-transparency). If you are based in the EU, you can see your redress options under the Digital Services Act in the Redress Options section (https://unity.com/legal/asset-store-content-transparency#redress-options).