CanvasBlock.cs 1.7 KB

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