优化回声描边逻辑
This commit is contained in:
93
unity/Assets/Editor/EchoDebugger.cs
Normal file
93
unity/Assets/Editor/EchoDebugger.cs
Normal file
@@ -0,0 +1,93 @@
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
using IndianOceanAssets.Engine2_5D;
|
||||
|
||||
/// <summary>
|
||||
/// 回声描边诊断工具
|
||||
/// </summary>
|
||||
public class EchoDebugger : Editor
|
||||
{
|
||||
[MenuItem("Tools/Echo/诊断回声描边状态")]
|
||||
public static void DebugEchoOutline()
|
||||
{
|
||||
// 查找EchoOutlineManager
|
||||
EchoOutlineManager manager = Object.FindObjectOfType<EchoOutlineManager>();
|
||||
|
||||
if (manager == null)
|
||||
{
|
||||
EditorUtility.DisplayDialog("错误", "场景中没有找到EchoOutlineManager组件", "确定");
|
||||
return;
|
||||
}
|
||||
|
||||
// 通过反射获取私有字段
|
||||
var parentRenderersField = typeof(EchoOutlineManager).GetField("_parentRenderers",
|
||||
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
|
||||
var outlineRenderersField = typeof(EchoOutlineManager).GetField("_outlineRenderers",
|
||||
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
|
||||
var renderersEnabledField = typeof(EchoOutlineManager).GetField("_renderersEnabled",
|
||||
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
|
||||
|
||||
var parentRenderers = parentRenderersField.GetValue(manager) as System.Collections.Generic.List<SpriteRenderer>;
|
||||
var outlineRenderers = outlineRenderersField.GetValue(manager) as System.Collections.Generic.List<SpriteRenderer>;
|
||||
bool renderersEnabled = (bool)renderersEnabledField.GetValue(manager);
|
||||
|
||||
string info = $"=== 回声描边诊断 ===\n\n";
|
||||
info += $"EchoOutlineManager: {manager.name}\n";
|
||||
info += $"描边材质: {(manager != null ? "已设置" : "未设置")}\n\n";
|
||||
|
||||
info += $"父物体数量: {parentRenderers?.Count ?? 0}\n";
|
||||
info += $"描边子物体数量: {outlineRenderers?.Count ?? 0}\n";
|
||||
info += $"描边渲染器启用: {renderersEnabled}\n\n";
|
||||
|
||||
if (outlineRenderers != null && outlineRenderers.Count > 0)
|
||||
{
|
||||
info += $"=== 前5个描边子物体 ===\n\n";
|
||||
int showCount = Mathf.Min(5, outlineRenderers.Count);
|
||||
for (int i = 0; i < showCount; i++)
|
||||
{
|
||||
var cr = outlineRenderers[i];
|
||||
var pr = parentRenderers[i];
|
||||
|
||||
if (cr == null || pr == null) continue;
|
||||
|
||||
info += $"父物体: {pr.name}\n";
|
||||
info += $" 描边子物体: {cr.name}\n";
|
||||
info += $" 启用状态: {cr.enabled}\n";
|
||||
info += $" SortingOrder: {cr.sortingOrder}\n";
|
||||
info += $" Material: {cr.sharedMaterial?.shader?.name ?? "null"}\n\n";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
info += "⚠️ 警告: 没有找到描边子物体!\n";
|
||||
info += "可能原因:\n";
|
||||
info += "1. EchoOutlineManager.Start()没有执行\n";
|
||||
info += "2. 场景中没有符合条件的SpriteRenderer\n";
|
||||
info += "3. outlineMaterial未设置\n";
|
||||
}
|
||||
|
||||
// 检查全局Shader参数
|
||||
float intensity = Shader.GetGlobalFloat(Shader.PropertyToID("_EchoOutlineIntensity"));
|
||||
info += $"\n=== 全局Shader参数 ===\n\n";
|
||||
info += $"_EchoOutlineIntensity: {intensity}\n";
|
||||
|
||||
Debug.Log(info);
|
||||
EditorUtility.DisplayDialog("诊断完成", $"诊断信息已输出到控制台\n\n请查看Unity Console窗口", "确定");
|
||||
}
|
||||
|
||||
[MenuItem("Tools/Echo/手动刷新描边")]
|
||||
public static void RefreshEchoOutlines()
|
||||
{
|
||||
EchoOutlineManager manager = Object.FindObjectOfType<EchoOutlineManager>();
|
||||
|
||||
if (manager == null)
|
||||
{
|
||||
EditorUtility.DisplayDialog("错误", "场景中没有找到EchoOutlineManager组件", "确定");
|
||||
return;
|
||||
}
|
||||
|
||||
manager.RefreshList();
|
||||
EditorUtility.DisplayDialog("完成", "已刷新描边子物体", "确定");
|
||||
Debug.Log("✓ 已刷新描边子物体");
|
||||
}
|
||||
}
|
||||
11
unity/Assets/Editor/EchoDebugger.cs.meta
Normal file
11
unity/Assets/Editor/EchoDebugger.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: WS5KsnisVC3o2wbtYBTyjcYIBZ6E/8syyO6OKbTpS0KGZp1sJJIPONc=
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
83
unity/Assets/Editor/MaskPlaneAdjuster.cs
Normal file
83
unity/Assets/Editor/MaskPlaneAdjuster.cs
Normal file
@@ -0,0 +1,83 @@
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
using IndianOceanAssets.Engine2_5D;
|
||||
|
||||
/// <summary>
|
||||
/// 遮罩平面调整工具
|
||||
/// </summary>
|
||||
public class MaskPlaneAdjuster : Editor
|
||||
{
|
||||
[MenuItem("Tools/LightMask/调整遮罩平面设置")]
|
||||
public static void AdjustMaskPlane()
|
||||
{
|
||||
// 查找场景中的LightMaskSystem
|
||||
LightMaskSystem lms = Object.FindObjectOfType<LightMaskSystem>();
|
||||
|
||||
if (lms == null)
|
||||
{
|
||||
EditorUtility.DisplayDialog("错误", "场景中没有找到LightMaskSystem组件", "确定");
|
||||
return;
|
||||
}
|
||||
|
||||
// 通过反射获取私有字段
|
||||
var maskPlaneField = typeof(LightMaskSystem).GetField("maskPlane",
|
||||
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
|
||||
var maskOffsetField = typeof(LightMaskSystem).GetField("maskOffset",
|
||||
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
|
||||
var planeSizeField = typeof(LightMaskSystem).GetField("planeSize",
|
||||
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
|
||||
|
||||
Transform maskPlane = (Transform)maskPlaneField.GetValue(lms);
|
||||
Vector3 maskOffset = (Vector3)maskOffsetField.GetValue(lms);
|
||||
float planeSize = (float)planeSizeField.GetValue(lms);
|
||||
|
||||
string info = $"当前遮罩平面设置:\n\n";
|
||||
info += $"遮罩平面物体: {(maskPlane != null ? maskPlane.name : "未设置")}\n";
|
||||
info += $"遮罩偏移: {maskOffset}\n";
|
||||
info += $"平面大小: {planeSize}\n\n";
|
||||
|
||||
info += "建议设置:\n";
|
||||
info += "1. 遮罩平面Y坐标应该 >= 10(在所有Sprite之上)\n";
|
||||
info += "2. 平面大小应该 >= 100(覆盖整个可视区域)\n";
|
||||
info += "3. 遮罩平面的SortingOrder应该 = 9999(最大)";
|
||||
|
||||
EditorUtility.DisplayDialog("遮罩平面信息", info, "确定");
|
||||
Debug.Log(info);
|
||||
}
|
||||
|
||||
[MenuItem("Tools/LightMask/设置遮罩平面SortingOrder")]
|
||||
public static void SetMaskPlaneSortingOrder()
|
||||
{
|
||||
LightMaskSystem lms = Object.FindObjectOfType<LightMaskSystem>();
|
||||
|
||||
if (lms == null)
|
||||
{
|
||||
EditorUtility.DisplayDialog("错误", "场景中没有找到LightMaskSystem组件", "确定");
|
||||
return;
|
||||
}
|
||||
|
||||
var maskPlaneField = typeof(LightMaskSystem).GetField("maskPlane",
|
||||
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
|
||||
Transform maskPlane = (Transform)maskPlaneField.GetValue(lms);
|
||||
|
||||
if (maskPlane == null)
|
||||
{
|
||||
EditorUtility.DisplayDialog("错误", "LightMaskSystem中没有设置遮罩平面", "确定");
|
||||
return;
|
||||
}
|
||||
|
||||
// 设置SortingOrder
|
||||
SpriteRenderer sr = maskPlane.GetComponent<SpriteRenderer>();
|
||||
if (sr == null)
|
||||
{
|
||||
EditorUtility.DisplayDialog("错误", $"遮罩平面 {maskPlane.name} 没有SpriteRenderer组件", "确定");
|
||||
return;
|
||||
}
|
||||
|
||||
sr.sortingOrder = 9999;
|
||||
EditorUtility.SetDirty(maskPlane.gameObject);
|
||||
|
||||
EditorUtility.DisplayDialog("完成", $"已设置 {maskPlane.name} 的SortingOrder为9999", "确定");
|
||||
Debug.Log($"✓ 已设置 {maskPlane.name} 的SortingOrder为9999");
|
||||
}
|
||||
}
|
||||
11
unity/Assets/Editor/MaskPlaneAdjuster.cs.meta
Normal file
11
unity/Assets/Editor/MaskPlaneAdjuster.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: Wn8X4yqrW3xTulVGfMlI6RQgwjQkOIFlM4QT5XpGWHNvdp0589QGBHg=
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user