using UnityEngine;
using UnityEditor;
///
/// Y-Sort诊断工具
///
public class YSortDebugger : Editor
{
[MenuItem("Tools/Y-Sort/诊断YSorter状态")]
public static void DebugYSorter()
{
// 查找场景中所有YSorter
YSorter[] allSorters = FindObjectsOfType();
if (allSorters.Length == 0)
{
EditorUtility.DisplayDialog("诊断结果", "场景中没有找到任何YSorter组件!\n\n请先使用菜单:\nTools → Y-Sort → 给Test场景Elements添加YSorter", "确定");
return;
}
string report = $"找到 {allSorters.Length} 个YSorter组件\n\n";
report += "=== 详细信息 ===\n\n";
foreach (YSorter sorter in allSorters)
{
report += $"物体: {sorter.gameObject.name}\n";
report += $" 位置: {sorter.transform.position}\n";
// 获取SpriteRenderer
SpriteRenderer sr = sorter.GetComponentInChildren();
if (sr != null)
{
report += $" SpriteRenderer: {sr.name}\n";
report += $" SortingLayer: {sr.sortingLayerName}\n";
report += $" SortingOrder: {sr.sortingOrder}\n";
}
else
{
report += $" SpriteRenderer: 未找到!\n";
}
report += "\n";
}
// 检查是否都在同一个SortingLayer
string[] layers = new string[allSorters.Length];
for (int i = 0; i < allSorters.Length; i++)
{
SpriteRenderer sr = allSorters[i].GetComponentInChildren();
if (sr != null)
layers[i] = sr.sortingLayerName;
}
bool allSameLayer = true;
if (layers.Length > 0)
{
string firstLayer = layers[0];
foreach (string layer in layers)
{
if (layer != firstLayer)
{
allSameLayer = false;
break;
}
}
}
if (!allSameLayer)
{
report += "⚠️ 警告: 物体不在同一个SortingLayer!\n";
report += "这可能导致排序不正确。\n";
}
Debug.Log(report);
EditorUtility.DisplayDialog("诊断完成", $"诊断信息已输出到控制台\n\n请查看Unity Console窗口", "确定");
}
[MenuItem("Tools/Y-Sort/测试YSorter计算")]
public static void TestYSorterCalculation()
{
GameObject selected = Selection.activeGameObject;
if (selected == null)
{
EditorUtility.DisplayDialog("提示", "请先选择一个物体", "确定");
return;
}
YSorter sorter = selected.GetComponent();
if (sorter == null)
{
EditorUtility.DisplayDialog("提示", $"选中的物体 {selected.name} 没有YSorter组件", "确定");
return;
}
// 通过反射获取私有字段
var baseOrderField = typeof(YSorter).GetField("baseSortingOrder",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
var scaleFactorField = typeof(YSorter).GetField("scaleFactor",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
int baseOrder = (int)baseOrderField.GetValue(sorter);
float scaleFactor = (float)scaleFactorField.GetValue(sorter);
Vector3 pos = selected.transform.position;
int expectedOrder = baseOrder + Mathf.RoundToInt(pos.z * scaleFactor);
SpriteRenderer sr = sorter.GetComponentInChildren();
int actualOrder = sr != null ? sr.sortingOrder : -1;
string msg = $"物体: {selected.name}\n";
msg += $"位置: {pos}\n";
msg += $"Z坐标: {pos.z:F3}\n";
msg += $"baseSortingOrder: {baseOrder}\n";
msg += $"scaleFactor: {scaleFactor}\n";
msg += $"期望SortingOrder: {expectedOrder}\n";
msg += $"实际SortingOrder: {actualOrder}\n\n";
if (expectedOrder == actualOrder)
{
msg += "✓ 排序正确";
}
else
{
msg += "✗ 排序不匹配!";
}
EditorUtility.DisplayDialog("YSorter测试", msg, "确定");
Debug.Log(msg);
}
}