UIObject.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using UnityEngine.Pool;
  6. using UnityEngine.Rendering;
  7. using UnityEngine.UI;
  8. using Utility;
  9. [ExecuteInEditMode]
  10. [RequireComponent(typeof(RectTransform))]
  11. [RequireComponent(typeof(CanvasRenderer))]
  12. public class UIObject : MaskableGraphic, IMeshModifier
  13. {
  14. public static Map<Shader, List<string>> allShaderName = new Map<Shader, List<string>>();
  15. private MaterialPropertyBlock MaterialPropertyBlock;
  16. public Material _material;
  17. public Mesh _Mesh;
  18. public bool isNewMaterial;
  19. private Renderer _renderer;
  20. public Camera Camera;
  21. // public
  22. public override Material defaultMaterial
  23. {
  24. get { return _material; }
  25. }
  26. protected override void OnEnable()
  27. {
  28. canvasRenderer.Clear();
  29. base.OnEnable();
  30. }
  31. protected override void OnDisable()
  32. {
  33. canvasRenderer.Clear();
  34. base.OnDisable();
  35. }
  36. protected override void Awake()
  37. {
  38. base.Awake();
  39. _renderer = gameObject.GetComponent<Renderer>();
  40. if (_renderer == null)
  41. {
  42. return;
  43. }
  44. _renderer.enabled = false;
  45. if (isNewMaterial)
  46. {
  47. _material = new Material(_renderer.sharedMaterial);
  48. }
  49. else
  50. {
  51. _material = _renderer.sharedMaterial;
  52. }
  53. // _material.shader.p
  54. _Mesh = gameObject.GetComponent<MeshFilter>().sharedMesh;
  55. if (_Mesh != null)
  56. {
  57. List<Vector3> nor = new List<Vector3>();
  58. for (int i = 0; i < _Mesh.colors.Length; i++)
  59. {
  60. nor.Add(new Vector3(_Mesh.colors[i].r, _Mesh.colors[i].g, 0));
  61. }
  62. _Mesh.normals = nor.ToArray();
  63. }
  64. }
  65. public override void Rebuild(CanvasUpdate update)
  66. {
  67. base.Rebuild(update);
  68. if (update == CanvasUpdate.PreRender)
  69. {
  70. }
  71. }
  72. private void Update()
  73. {
  74. if (_material == null)
  75. {
  76. return;
  77. }
  78. if (MaterialPropertyBlock == null)
  79. {
  80. MaterialPropertyBlock = new MaterialPropertyBlock();
  81. }
  82. _renderer.GetPropertyBlock(MaterialPropertyBlock);
  83. Shader shader = _material.shader;
  84. if (!allShaderName.TryGetValue(shader, out List<string> keyName))
  85. {
  86. keyName = new List<string>();
  87. for (int i = 0; i < _material.shader.GetPropertyCount(); i++)
  88. {
  89. string name = _material.shader.GetPropertyName(i);
  90. keyName.Add(name);
  91. }
  92. allShaderName.Add(shader, keyName);
  93. }
  94. for (int i = 0; i < keyName.Count; i++)
  95. {
  96. string name = keyName[i];
  97. if (name != null && MaterialPropertyBlock.HasProperty(name))
  98. {
  99. if (_material.shader.GetPropertyType(i) == ShaderPropertyType.Color)
  100. {
  101. _material.SetColor(name, MaterialPropertyBlock.GetColor(name));
  102. }
  103. if (_material.shader.GetPropertyType(i) == ShaderPropertyType.Float)
  104. {
  105. _material.SetFloat(name, MaterialPropertyBlock.GetFloat(name));
  106. }
  107. if (_material.shader.GetPropertyType(i) == ShaderPropertyType.Range)
  108. {
  109. _material.SetFloat(name, MaterialPropertyBlock.GetFloat(name));
  110. }
  111. if (_material.shader.GetPropertyType(i) == ShaderPropertyType.Vector)
  112. {
  113. _material.SetVector(name, MaterialPropertyBlock.GetVector(name));
  114. }
  115. if (_material.shader.GetPropertyType(i) == ShaderPropertyType.Int)
  116. {
  117. _material.SetInt(name, MaterialPropertyBlock.GetInt(name));
  118. }
  119. if (_material.shader.GetPropertyType(i) == ShaderPropertyType.Texture)
  120. {
  121. _material.SetTexture(name, MaterialPropertyBlock.GetTexture(name));
  122. }
  123. }
  124. }
  125. }
  126. protected override void UpdateMaterial()
  127. {
  128. if (!IsActive())
  129. return;
  130. canvasRenderer.materialCount = 1;
  131. canvasRenderer.SetMaterial(materialForRendering, 0);
  132. }
  133. [ContextMenu("刷新mesh")]
  134. public void ShuaXing()
  135. {
  136. // _Mesh = gameObject.GetComponent<MeshFilter>().sharedMesh;
  137. SetAllDirty();
  138. }
  139. protected override void OnPopulateMesh(VertexHelper vh)
  140. {
  141. base.OnPopulateMesh(vh);
  142. }
  143. private bool isAlater = false;
  144. protected override void UpdateGeometry()
  145. {
  146. // if (rectTransform != null )
  147. // OnPopulateMesh(s_VertexHelper);
  148. //
  149. //
  150. // var components = ListPool<Component>.Get();
  151. // GetComponents(typeof(IMeshModifier), components);
  152. //
  153. // for (var i = 0; i < components.Count; i++)
  154. // ((IMeshModifier)components[i]).ModifyMesh(s_VertexHelper);
  155. //
  156. // ListPool<Component>.Release(components);
  157. //
  158. // s_VertexHelper.FillMesh(workerMesh);
  159. // canvasRenderer.SetMesh(workerMesh);
  160. // if (isAlater)
  161. // {
  162. // return;
  163. // }
  164. //
  165. // isAlater = true;
  166. if (_renderer is LineRenderer)
  167. {
  168. LineRenderer lineRenderer = _renderer as LineRenderer;
  169. _Mesh = new Mesh();
  170. if (Camera == null)
  171. {
  172. Canvas canvas = transform.GetComponentInParent<Canvas>();
  173. if (canvas != null)
  174. {
  175. Camera = canvas.worldCamera;
  176. }
  177. }
  178. if (Camera == null)
  179. {
  180. return;
  181. }
  182. lineRenderer.BakeMesh(_Mesh, Camera, transform);
  183. List<Vector3> nor = new List<Vector3>();
  184. for (int i = 0; i < _Mesh.colors.Length; i++)
  185. {
  186. nor.Add(new Vector3(_Mesh.colors[i].r, _Mesh.colors[i].g, 0));
  187. }
  188. _Mesh.normals = nor.ToArray();
  189. }
  190. canvasRenderer.SetMesh(_Mesh);
  191. }
  192. // protected override void OnPopulateMesh(VertexHelper vh)
  193. // {
  194. // base.OnPopulateMesh(vh);
  195. // }
  196. public void ModifyMesh(Mesh mesh)
  197. {
  198. }
  199. public void ModifyMesh(VertexHelper verts)
  200. {
  201. UIVertex vertex = new UIVertex();
  202. for (int i = 0; i < verts.currentVertCount; i++)
  203. {
  204. verts.PopulateUIVertex(ref vertex, i);
  205. vertex.color = _Mesh.colors[i];
  206. vertex.normal = new Vector3(vertex.color.r, vertex.color.g);
  207. verts.SetUIVertex(vertex, i);
  208. }
  209. }
  210. }