Files
XericLibrary-Publish/Runtime/EditorTool/ShowMyNameInScene.cs
2025-04-10 15:32:00 +08:00

132 lines
4.0 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using UnityEngine.Serialization;
using XericLibrary.Runtime.CustomEditor;
using XericLibrary.Runtime.MacroLibrary;
using XericLibrary.Runtime.Type;
#if UNITY_EDITOR
using UnityEditor;
#endif
public class ShowMyNameInScene : MonoBehaviour
{
[Rename("启用")] public bool Enable = false;
[Rename("仅选中时显示")] public bool OnlyShowOnSelect = false;
[Rename("目标是子项")] public bool ShowAllChindName = true;
[Rename("显示名称")] public bool ShowGameObjectName = false;
[Rename("显示模型名称")] public bool ShowMeshFilter_MeshName = false;
public bool RandomEachObjectColor = false;
public Color TextColor = Color.white;
public RectOffset TextBorder = new RectOffset(0,0,0,0);
public RectOffset TextMargin = new RectOffset(0,0,0,0);
public RectOffset TextPadding = new RectOffset(0,0,0,0);
public RectOffset TextOverflow = new RectOffset(0,0,0,0);
public Font font;
public int fontSize = 0;
public FontStyle fontStyle = FontStyle.Normal;
public TextClipping TextClipping = TextClipping.Overflow;
public ImagePosition ImagePosition = ImagePosition.ImageLeft;
public Vector2 ContentOffset = Vector2.zero;
public Vector2 FixedSize = Vector2.zero;
public Bool2 Stretch = new Bool2();
private GUIStyle TextStyle;
private StringBuilder _sb = new StringBuilder();
#if UNITY_EDITOR
private void OnDrawGizmos()
{
if (!Enable)
return;
if (OnlyShowOnSelect && !ReferenceEquals(Selection.activeGameObject, this))
return;
TextStyle = new GUIStyle()
{
normal = new GUIStyleState()
{
textColor = TextColor,
// background =
},
border = TextBorder,
margin = TextMargin,
padding = TextPadding,
overflow = TextOverflow,
font = font,
fontSize = fontSize,
fontStyle = fontStyle,
richText = true,
clipping = TextClipping,
imagePosition = ImagePosition,
contentOffset = ContentOffset,
fixedHeight = FixedSize.y,
fixedWidth = FixedSize.x,
stretchHeight = Stretch.y,
stretchWidth = Stretch.x,
};
if (ShowAllChindName)
{
foreach (var item in transform.GetChildren())
{
if (!item.gameObject.activeInHierarchy)
continue;
SwitchFilter(item);
}
}
else
{
DrawGameObjectNameInScene(transform, transform.name);
}
}
private void SwitchFilter(Transform target)
{
if (_sb == null)
_sb = new StringBuilder();
_sb.Clear();
if (RandomEachObjectColor)
TextStyle.normal.textColor = MacroColor.RandomHueColor(target.gameObject.GetInstanceID());
var position = target.position;
var mf = target.GetComponent<MeshFilter>();
if (mf != null)
{
var mesh = mf.mesh;
if (mesh != null)
position += target.rotation * mesh.bounds.center;
}
if (ShowGameObjectName)
_sb.AppendLine($"Name: {target.name}");
if (ShowMeshFilter_MeshName)
_sb.AppendLine($"Mesh: {GetComponentName<MeshFilter>(target, a => a.mesh?.name ?? "unknown")}");
DrawNameInScene(position, _sb.ToString());
}
private void DrawGameObjectNameInScene(Transform obj, string name)
{
Handles.Label(obj.position, name,TextStyle);
}
private void DrawNameInScene(Vector3 position, string name)
{
Handles.Label(position, name, TextStyle);
}
private string GetComponentName<T>(Transform target, Func<T, string> getName)
where T : Component
{
return getName(target.GetComponent<T>());
}
#endif
}