using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; /* 自定义画布点击阻断组件 */ public class CanvasBlock : MonoBehaviour { private static HashSet canvasBlocks = new HashSet(); private bool hasBan = false; private bool valueBeforeBan; void OnEnable() { canvasBlocks.Add(this); this.updateGraphicRaycaster(); } void OnDisable() { canvasBlocks.Remove(this); this.updateGraphicRaycaster(); } void updateGraphicRaycaster() { ArrayList list = new ArrayList(); foreach (CanvasBlock canvasBlock in canvasBlocks) { list.Add(canvasBlock); } CanvasBlockComparer canvasBlockComparer = new CanvasBlockComparer(); list.Sort(canvasBlockComparer); for (int i = 0; i < list.Count; i++) { if (i == 0 || canvasBlockComparer.Compare(list[i], list[0]) == 0) { ((CanvasBlock) list[i]).resume(); } else { ((CanvasBlock) list[i]).ban(); } } } void ban() { if (this.hasBan) return; this.valueBeforeBan = this.GetComponent().enabled; this.GetComponent().enabled = false; this.hasBan = true; return; } void resume () { if (!this.hasBan) return; this.GetComponent().enabled = this.valueBeforeBan; this.hasBan = false; return; } public class CanvasBlockComparer : IComparer { public int Compare(object a, object b) { return ((CanvasBlock) b).GetComponent().sortingOrder - ((CanvasBlock) a).GetComponent().sortingOrder; } } }