CanvasBlock.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. /* 自定义画布点击阻断组件 */
  6. public class CanvasBlock : MonoBehaviour
  7. {
  8. private static HashSet<CanvasBlock> canvasBlocks = new HashSet<CanvasBlock>();
  9. private bool hasBan = false;
  10. private bool valueBeforeBan;
  11. void OnEnable() {
  12. canvasBlocks.Add(this);
  13. this.updateGraphicRaycaster();
  14. }
  15. void OnDisable() {
  16. canvasBlocks.Remove(this);
  17. this.updateGraphicRaycaster();
  18. }
  19. void updateGraphicRaycaster() {
  20. ArrayList list = new ArrayList();
  21. foreach (CanvasBlock canvasBlock in canvasBlocks) {
  22. list.Add(canvasBlock);
  23. }
  24. CanvasBlockComparer canvasBlockComparer = new CanvasBlockComparer();
  25. list.Sort(canvasBlockComparer);
  26. for (int i = 0; i < list.Count; i++) {
  27. if (i == 0 || canvasBlockComparer.Compare(list[i], list[0]) == 0) {
  28. ((CanvasBlock) list[i]).resume();
  29. } else {
  30. ((CanvasBlock) list[i]).ban();
  31. }
  32. }
  33. }
  34. void ban() {
  35. if (this.hasBan) return;
  36. this.valueBeforeBan = this.GetComponent<GraphicRaycaster>().enabled;
  37. this.GetComponent<GraphicRaycaster>().enabled = false;
  38. this.hasBan = true;
  39. return;
  40. }
  41. void resume () {
  42. if (!this.hasBan) return;
  43. this.GetComponent<GraphicRaycaster>().enabled = this.valueBeforeBan;
  44. this.hasBan = false;
  45. return;
  46. }
  47. public class CanvasBlockComparer : IComparer {
  48. public int Compare(object a, object b) {
  49. return ((CanvasBlock) b).GetComponent<Canvas>().sortingOrder - ((CanvasBlock) a).GetComponent<Canvas>().sortingOrder;
  50. }
  51. }
  52. }