CartoonDraw.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. using UnityEngine;
  2. using UnityEngine.UI;
  3. using System.Collections.Generic;
  4. namespace WXB
  5. {
  6. [ExecuteInEditMode]
  7. public class CartoonDraw : EffectDrawObjec, ICanvasElement
  8. {
  9. public override DrawType type { get { return DrawType.Cartoon; } }
  10. public Cartoon cartoon { get; set; }
  11. int frameIndex = 0;
  12. float mDelta = 0f;
  13. int curIdx = -1;
  14. void UpdateAnim(float deltaTime)
  15. {
  16. /*mDelta += Mathf.Min(1f, deltaTime);
  17. float delta = 5f;
  18. if (cartoon.fps.Length - 1 > frameIndex)
  19. {
  20. delta = cartoon.fps[frameIndex];
  21. }
  22. float rate = 1f / delta;
  23. while (rate < mDelta)
  24. {
  25. mDelta = (rate > 0f) ? mDelta - rate : 0f;
  26. if (++frameIndex >= cartoon.sprites.Length)
  27. {
  28. frameIndex = 0;
  29. }
  30. }*/
  31. curIdx += 1;
  32. int delta = 1;
  33. if (cartoon.fps.Length - 1 > frameIndex)
  34. {
  35. delta = cartoon.fps[frameIndex] - 1;
  36. }
  37. if (curIdx >= delta)
  38. {
  39. curIdx = -1;
  40. if (++frameIndex >= cartoon.sprites.Length)
  41. {
  42. frameIndex = 0;
  43. }
  44. }
  45. if (frameIndex < 0)
  46. frameIndex = 0;
  47. }
  48. class Data
  49. {
  50. public Vector2 leftPos;
  51. public Color color;
  52. public float width;
  53. public float height;
  54. public void Gen(VertexHelper vh, Vector4 uv, int xOffset, int yOffset)
  55. {
  56. int count = vh.currentVertCount;
  57. vh.AddVert(new Vector3(leftPos.x + xOffset, leftPos.y + yOffset), color, new Vector2(uv.x, uv.y));
  58. vh.AddVert(new Vector3(leftPos.x + xOffset, leftPos.y + height + yOffset), color, new Vector2(uv.x, uv.w));
  59. vh.AddVert(new Vector3(leftPos.x + width + xOffset, leftPos.y + height + yOffset), color, new Vector2(uv.z, uv.w));
  60. vh.AddVert(new Vector3(leftPos.x + width + xOffset, leftPos.y + yOffset), color, new Vector2(uv.z, uv.y));
  61. vh.AddTriangle(count, count + 1, count + 2);
  62. vh.AddTriangle(count + 2, count + 3, count);
  63. }
  64. }
  65. List<Data> mData = new List<Data>();
  66. public bool isOpenAlpha
  67. {
  68. get { return GetOpen(0); }
  69. set { SetOpen<AlphaEffect>(0, value); }
  70. }
  71. public bool isOpenOffset
  72. {
  73. get { return GetOpen(1); }
  74. set { SetOpen<OffsetEffect>(1, value); }
  75. }
  76. public void Add(Vector2 leftPos, float width, float height, Color color)
  77. {
  78. mData.Add(new Data() { leftPos = leftPos, color = color, width = width, height = height });
  79. }
  80. public override void UpdateSelf(float deltaTime)
  81. {
  82. base.UpdateSelf(deltaTime);
  83. int f = frameIndex;
  84. UpdateAnim(deltaTime);
  85. if (f != frameIndex)
  86. {
  87. CanvasUpdateRegistry.RegisterCanvasElementForGraphicRebuild(this);
  88. }
  89. #if UNITY_EDITOR
  90. else
  91. {
  92. if (Application.isEditor)
  93. {
  94. CanvasUpdateRegistry.RegisterCanvasElementForGraphicRebuild(this);
  95. }
  96. }
  97. #endif
  98. }
  99. public override void Rebuild(CanvasUpdate executing)
  100. {
  101. if (executing != CanvasUpdate.PreRender)
  102. return;
  103. if (mData == null)
  104. return;
  105. Sprite s = cartoon.sprites[frameIndex];
  106. var uv = UnityEngine.Sprites.DataUtility.GetOuterUV(cartoon.sprites[frameIndex]);
  107. VertexHelper vh = Tools.vertexHelper;
  108. vh.Clear();
  109. for (int i = 0; i < mData.Count; ++i)
  110. {
  111. mData[i].Gen(vh, uv, cartoon.xOffset, cartoon.yOffset);
  112. }
  113. Mesh workerMesh = SymbolText.WorkerMesh;
  114. vh.FillMesh(workerMesh);
  115. canvasRenderer.SetMesh(workerMesh);
  116. canvasRenderer.SetTexture(s.texture);
  117. }
  118. public override void Release()
  119. {
  120. base.Release();
  121. mData.Clear();
  122. frameIndex = 0;
  123. curIdx = -1;
  124. }
  125. public override void GraphicUpdateComplete() { }
  126. public override bool IsDestroyed() { return this == null; }
  127. public override void LayoutComplete() { }
  128. }
  129. }