using UnityEngine; using UnityEngine.UI; using System.Collections; /// /// 多层Canvas测试工具 /// 用于测试MainPanel在多层Canvas环境下的BodyAndOrgans可见性控制 /// public class MultiLayerCanvasTest : MonoBehaviour { [Header("测试Canvas")] public Canvas[] TestCanvases; [Header("控制按钮")] public Button CreateOverlayButton; public Button RemoveOverlayButton; public Button ToggleCanvasOrderButton; public Button DebugInfoButton; [Header("信息显示")] public Text StatusText; public InputField SortingOrderInput; private MainPanel mainPanel; private int overlayCounter = 0; void Start() { // 查找MainPanel mainPanel = FindObjectOfType(); // 设置按钮事件 if (CreateOverlayButton != null) CreateOverlayButton.onClick.AddListener(CreateOverlayCanvas); if (RemoveOverlayButton != null) RemoveOverlayButton.onClick.AddListener(RemoveLastOverlay); if (ToggleCanvasOrderButton != null) ToggleCanvasOrderButton.onClick.AddListener(ToggleCanvasOrder); if (DebugInfoButton != null) DebugInfoButton.onClick.AddListener(LogAllCanvasInfo); UpdateStatusDisplay(); } /// /// 创建覆盖Canvas /// public void CreateOverlayCanvas() { overlayCounter++; // 创建新的Canvas GameObject GameObject overlayObj = new GameObject($"TestOverlay_{overlayCounter}"); Canvas overlayCanvas = overlayObj.AddComponent(); overlayObj.AddComponent(); overlayObj.AddComponent(); // 设置Canvas属性 overlayCanvas.renderMode = RenderMode.ScreenSpaceOverlay; // 获取用户输入的sortingOrder,默认比MainPanel高 int targetOrder = 10; if (SortingOrderInput != null && !string.IsNullOrEmpty(SortingOrderInput.text)) { if (int.TryParse(SortingOrderInput.text, out int userOrder)) { targetOrder = userOrder; } } overlayCanvas.sortingOrder = targetOrder; // 添加一个半透明背景来模拟覆盖效果 GameObject background = new GameObject("Background"); background.transform.SetParent(overlayObj.transform, false); Image bgImage = background.AddComponent(); bgImage.color = new Color(0f, 0f, 0f, 0.3f); // 半透明黑色 // 设置背景填满整个屏幕 RectTransform bgRect = background.GetComponent(); bgRect.anchorMin = Vector2.zero; bgRect.anchorMax = Vector2.one; bgRect.offsetMin = Vector2.zero; bgRect.offsetMax = Vector2.zero; // 添加一个文本标签 GameObject label = new GameObject("Label"); label.transform.SetParent(overlayObj.transform, false); Text labelText = label.AddComponent(); labelText.text = $"测试覆盖层 {overlayCounter}\nSorting Order: {targetOrder}"; labelText.font = Resources.GetBuiltinResource("Arial.ttf"); labelText.fontSize = 24; labelText.color = Color.white; labelText.alignment = TextAnchor.MiddleCenter; RectTransform labelRect = label.GetComponent(); labelRect.anchorMin = new Vector2(0.5f, 0.5f); labelRect.anchorMax = new Vector2(0.5f, 0.5f); labelRect.sizeDelta = new Vector2(300, 100); // 添加关闭按钮 CreateCloseButton(overlayObj, overlayCanvas); Debug.Log($"创建覆盖Canvas: {overlayObj.name}, SortingOrder: {targetOrder}"); UpdateStatusDisplay(); } /// /// 为覆盖Canvas添加关闭按钮 /// private void CreateCloseButton(GameObject canvasObj, Canvas canvas) { GameObject buttonObj = new GameObject("CloseButton"); buttonObj.transform.SetParent(canvasObj.transform, false); Button closeButton = buttonObj.AddComponent