BackgroundPanel.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. using Fort23.Core;
  2. using Fort23.Mono.Test;
  3. using Fort23.UTool;
  4. using UnityEngine;
  5. using UnityEngine.Events;
  6. using UnityEngine.Rendering;
  7. using UnityEngine.Rendering.Universal;
  8. namespace Fort23.Mono
  9. {
  10. [UIBinding(prefab = "BackgroundPanel")]
  11. public partial class BackgroundPanel : UIPanel
  12. {
  13. // public RawImage backImage;
  14. public UnityAction callback;
  15. protected Material Material;
  16. /// <summary>
  17. /// 是否激活背景开关
  18. /// </summary>
  19. public bool EnableBGBtn
  20. {
  21. get { return _enableBGBtn; }
  22. set { _enableBGBtn = value; }
  23. }
  24. private bool _enableBGBtn = true;
  25. public void Init()
  26. {
  27. isAddStack = false;
  28. IsShowAppBar = false;
  29. }
  30. protected override void AddEvent()
  31. {
  32. }
  33. private RenderTexture renderTexture
  34. {
  35. get
  36. {
  37. if (_renderTexture == null)
  38. {
  39. _renderTexture = new RenderTexture(Screen.width, Screen.height, 0, RenderTextureFormat.Default);
  40. }
  41. return _renderTexture;
  42. }
  43. }
  44. private RenderTexture _renderTexture;
  45. public override CTask Show()
  46. {
  47. if (GObjectPoolInterface == null)
  48. {
  49. return null;
  50. }
  51. CTask cTask = CTask.Create();
  52. _isShow = true;
  53. GObjectPoolInterface.SetActive(true);
  54. if (timerEntity != null)
  55. {
  56. TimerComponent.Instance.Remove(timerEntity);
  57. }
  58. if (openTimerEntity != null)
  59. {
  60. TimerComponent.Instance.Remove(openTimerEntity);
  61. }
  62. ShowAnimator();
  63. cTask.SetResult();
  64. return cTask;
  65. }
  66. protected override async CTask ProOpen()
  67. {
  68. ManualAsyncTask ct = ManualAsyncTask.Create();
  69. // if (GObjectPoolInterface != null)
  70. // {
  71. // GObjectPoolInterface.SetActive(false);
  72. // }
  73. IsClose = true;
  74. isFullUI = true;
  75. UIManager.Instance.RefreshFull();
  76. IsClose = false;
  77. // Shader.SetGlobalTexture(CameraTransparentColorTexture, renderTexture);
  78. InterceptGamePass.SetRenderTexture(renderTexture, delegate { ct.SetResult(); }, executeCallBack: Execute);
  79. await ct.Wait();
  80. LogTool.Log("完成背景图加载");
  81. if (RawImage.texture != renderTexture)
  82. {
  83. RawImage.texture = renderTexture;
  84. }
  85. if (GObjectPoolInterface != null)
  86. {
  87. GObjectPoolInterface.SetActive(true);
  88. }
  89. UIManager.Instance.RefreshFull();
  90. // TimerComponent.Instance.AddTimer(500, delegate { UIManager.Instance.RefreshFull(); });
  91. }
  92. protected void Execute(ScriptableRenderContext context, RenderingData renderingData,
  93. RenderTexture renderTargetHandle, RenderTargetIdentifier source,
  94. RenderTextureDescriptor cameraTextureDescriptor)
  95. {
  96. if (Material == null)
  97. {
  98. Material = new Material(Shader.Find("Unlit/MoHu"));
  99. }
  100. // return;
  101. // LogTool.Log("回调背景图加载");
  102. CommandBuffer cmd = CommandBufferPool.Get("background");
  103. int w = cameraTextureDescriptor.width;
  104. int h = cameraTextureDescriptor.height;
  105. int randerIndex = -255;
  106. RenderTargetIdentifier lasetIdentifier = default;
  107. int lasetranderIndex = 10000;
  108. for (int i = 0; i < 4; i++)
  109. {
  110. w /= 2;
  111. h /= 2;
  112. if (w <= 1 || h <= 1)
  113. {
  114. break;
  115. }
  116. int index = Shader.PropertyToID("back_tu" + i);
  117. // isTu1 = !isTu1;
  118. cmd.GetTemporaryRT(index, w, h, 0, FilterMode.Bilinear, RenderTextureFormat.ARGB32);
  119. RenderTargetIdentifier renderTargetIdentifier = new RenderTargetIdentifier(index);
  120. if (lasetranderIndex != 10000)
  121. {
  122. cmd.Blit(lasetIdentifier, renderTargetIdentifier, Material, 0);
  123. cmd.ReleaseTemporaryRT(lasetranderIndex);
  124. }
  125. else
  126. {
  127. cmd.Blit(source, renderTargetIdentifier, Material, 0);
  128. }
  129. lasetIdentifier = renderTargetIdentifier;
  130. lasetranderIndex = index;
  131. }
  132. for (int i = 0; i < 4; i++)
  133. {
  134. w *= 2;
  135. h *= 2;
  136. if (w > cameraTextureDescriptor.width || h > cameraTextureDescriptor.height)
  137. {
  138. break;
  139. }
  140. int index = Shader.PropertyToID("back_fd" + i);
  141. cmd.GetTemporaryRT(index, w, h, 0, FilterMode.Bilinear, RenderTextureFormat.ARGB32);
  142. RenderTargetIdentifier renderTargetIdentifier = new RenderTargetIdentifier(index);
  143. if (lasetranderIndex != 10000)
  144. {
  145. cmd.Blit(lasetIdentifier, renderTargetIdentifier, Material, 1);
  146. cmd.ReleaseTemporaryRT(lasetranderIndex);
  147. }
  148. lasetIdentifier = renderTargetIdentifier;
  149. lasetranderIndex = index;
  150. }
  151. // int index = Shader.PropertyToID("back_tu");
  152. // isTu1 = !isTu1;
  153. // cmd.GetTemporaryRT(index, w, h, 0, FilterMode.Bilinear,
  154. // RenderTextureFormat.ARGB32);
  155. // RenderTargetIdentifier renderTargetIdentifier = new RenderTargetIdentifier(index);
  156. // cmd.Blit(source, renderTargetIdentifier,Material,0);
  157. cmd.Blit(lasetIdentifier, renderTargetHandle, Material, 2);
  158. cmd.ReleaseTemporaryRT(lasetranderIndex);
  159. context.ExecuteCommandBuffer(cmd);
  160. CommandBufferPool.Release(cmd);
  161. }
  162. /// <summary>
  163. /// 关闭当前有背景的面板
  164. /// </summary>
  165. public void CloseTopPanel()
  166. {
  167. if (!EnableBGBtn)
  168. {
  169. return;
  170. }
  171. if (UIManager.Instance.AllShowBGUIs.Count > 0 && UIManager.Instance.AllShowBGUIs[^1] != null)
  172. {
  173. UIPanel uiPanel = UIManager.Instance.AllShowBGUIs[^1];
  174. if (!uiPanel.IsHindBackground())
  175. {
  176. return;
  177. }
  178. }
  179. UnityAction action = callback;
  180. callback = null;
  181. if (action != null)
  182. action?.Invoke();
  183. Close();
  184. if (UIManager.Instance.AllShowBGUIs.Count > 0 && UIManager.Instance.AllShowBGUIs[^1] != null)
  185. {
  186. UIPanel uiPanel = UIManager.Instance.AllShowBGUIs[^1];
  187. uiPanel.BackgroundCallBack();
  188. UIManager.Instance.HideUIUIPanel(uiPanel);
  189. }
  190. }
  191. public override void AddButtonEvent()
  192. {
  193. Btn_BG.onClick.AddListener(CloseTopPanel);
  194. }
  195. public void CustomInit()
  196. {
  197. }
  198. protected override void DelEvent()
  199. {
  200. }
  201. public override void Close()
  202. {
  203. EnableBGBtn = true;
  204. base.Close();
  205. }
  206. }
  207. }