using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; namespace BF { //只有纵向拉伸, 后续完善 public class RawImageGrid : RawImage { private const int POINT_NUM = 8; private const int RECT_NUM = 3; private const float MAX_PADDING = 1f; //保证在初始时候设置好比例 public float paddingTopSlice = 0.5f; public float paddingBottomSlice = 0.5f; // private List gridSlicePositions = new List(); // private List rectPositions = new List(); private float paddingTopDistance; private float paddingBottomDistance; private Vector3[] corners = new Vector3[4]; protected override void Awake() { base.Awake(); // gridSlicePositions.Add(new Vector2(0f, 0f)); // gridSlicePositions.Add(new Vector2(0f, paddingBottomSlice)); // gridSlicePositions.Add(new Vector2(0f, paddingTopSlice)); // gridSlicePositions.Add(new Vector2(0f, 1f)); // gridSlicePositions.Add(new Vector2(1f, 1f)); // gridSlicePositions.Add(new Vector2(1f, paddingTopSlice)); // gridSlicePositions.Add(new Vector2(1f, paddingBottomSlice)); // gridSlicePositions.Add(new Vector2(1f, 0f)); CalculateRectPos(); } private void GetRectTransformBounds() { this.rectTransform.GetLocalCorners(corners); } private void CalculateRectPos() { if(paddingBottomSlice < paddingTopSlice) return; // rectPositions.Clear(); GetRectTransformBounds(); var rectWidth = corners[3].x - corners[0].x; var rectHeight = corners[1].y - corners[0].y; paddingTopDistance = Mathf.Min(MAX_PADDING, paddingTopSlice) * rectHeight; paddingBottomDistance = Mathf.Min(MAX_PADDING, paddingBottomSlice) * rectHeight; // var count = POINT_NUM; // for (int i = 0; i < count; i++) // { // var slicePos = gridSlicePositions[i]; // var rectPosX = corners[0].x + slicePos.x * rectWidth; // var rectPosY = corners[0].y + slicePos.y * rectHeight; // rectPositions.Add(new Vector2(rectPosX, rectPosY)); // } } private void GetVertPosAndUV(VertexHelper vh, Vector4 vector4, int gridIdx, Vector2 uv) { //// var gridPos = Vector2.zero;//gridSlicePositions[gridIdx]; // float gridX = gridIdx < POINT_NUM / 2 ? corners[0].x : corners[3].x; //gridPos.x; // float gridY = gridIdx < POINT_NUM / 2 ? corners[0].x : corners[3].x; // // Vector3 vert = new Vector3(vector4.x + (vector4.z - vector4.x) * gridX, // vector4.y + (vector4.w - vector4.y) * gridY); // uv.x *= (uvRect.xMin + (uvRect.xMax - uvRect.xMin) * gridX); // uv.y *= (uvRect.yMin + (uvRect.yMax - uvRect.yMin) * gridY); // vh.AddVert(vert, (Color32) this.color, uv); // vertexHelper.AddVert(new Vector3(posMin.x, posMin.y, 0.0f), color, new Vector2(uvMin.x, uvMin.y)); // vertexHelper.AddVert(new Vector3(posMin.x, posMax.y, 0.0f), color, new Vector2(uvMin.x, uvMax.y)); // vertexHelper.AddVert(new Vector3(posMax.x, posMax.y, 0.0f), color, new Vector2(uvMax.x, uvMax.y)); // vertexHelper.AddVert(new Vector3(posMax.x, posMin.y, 0.0f), color, new Vector2(uvMax.x, uvMin.y)); // vertexHelper.AddTriangle(currentVertCount, currentVertCount + 1, currentVertCount + 2); // vertexHelper.AddTriangle(currentVertCount + 2, currentVertCount + 3, currentVertCount); } private void AddQuad(VertexHelper vh, Vector2 posMin, Vector2 posMax, Color32 color, Vector2 uvMin, Vector2 uvMax) { vh.AddVert(new Vector3(posMin.x, posMin.y, 0.0f), color, new Vector2(uvMin.x, uvMin.y)); vh.AddVert(new Vector3(posMin.x, posMax.y, 0.0f), color, new Vector2(uvMin.x, uvMax.y)); vh.AddVert(new Vector3(posMax.x, posMax.y, 0.0f), color, new Vector2(uvMax.x, uvMax.y)); vh.AddVert(new Vector3(posMax.x, posMin.y, 0.0f), color, new Vector2(uvMax.x, uvMin.y)); // vh.AddTriangle(currentVertCount, currentVertCount + 1, currentVertCount + 2); // vh.AddTriangle(currentVertCount + 2, currentVertCount + 3, currentVertCount); } protected override void OnPopulateMesh(VertexHelper vh) { Texture mainTexture = this.mainTexture; vh.Clear(); if (!((Object) mainTexture != (Object) null)) return; Rect pixelAdjustedRect = this.GetPixelAdjustedRect(); Vector4 vector4 = new Vector4(pixelAdjustedRect.x, pixelAdjustedRect.y, pixelAdjustedRect.x + pixelAdjustedRect.width, pixelAdjustedRect.y + pixelAdjustedRect.height); float num1 = (float) mainTexture.width * mainTexture.texelSize.x; float num2 = (float) mainTexture.height * mainTexture.texelSize.y; GetRectTransformBounds(); var count = RECT_NUM; var rectHeight = corners[1].y - corners[0].y; var rectBottomSlice = paddingBottomDistance / rectHeight; var rectTopSlice = (rectHeight - paddingTopDistance) / rectHeight; // for (int i = 0; i < count; i++) // { var posSize = vector4.w - vector4.y; Vector2 posMin = new Vector2(vector4.x, vector4.y); Vector2 posMax = new Vector2(vector4.z, vector4.y + posSize * rectBottomSlice); Vector2 uvMin = new Vector2(0, 0); Vector2 uvMax = new Vector2(0.5f, 0.5f); AddQuad(vh, posMin, posMax, color, uvMin, uvMax); // posMin = new Vector2(vector4.x, vector4.y + posSize * rectBottomSlice); // posMax = new Vector2(vector4.z, vector4.y + posSize * rectTopSlice); // uvMin = new Vector2(0.5f, 0.5f); // uvMax = new Vector2(0.5f, 0.5f); // AddQuad(vh, posMin, posMax, color, uvMin, uvMax); posMin = new Vector2(vector4.x, vector4.y + posSize * rectTopSlice); posMax = new Vector2(vector4.z, vector4.w); uvMin = new Vector2(0.5f, 0.5f); uvMax = new Vector2(1, 1); AddQuad(vh, posMin, posMax, color, uvMin, uvMax); // } // { // GetVertPosAndUV(vh, vector4, i, new Vector2(num1, num2)); // } count = (count - 2) / 2; // for (int i = 0, j = 0; j < count; j++) // { //// if (i == 0) // { // vh.AddTriangle(i, i + 1, i + 3); // vh.AddTriangle(i + 3, i + 1, i + 2); // i++; // } //// else if (i == 1) //// { //// vh.AddTriangle(i, i + 3, i + 1); //// vh.AddTriangle(i + 1, i + 3, i + 4); //// i += 3; //// } //// else //// { //// vh.AddTriangle(i, i + 2, i + 1); //// vh.AddTriangle(i + 1, i + 2, i + 3); //// i += 2; //// } // } // vh.AddVert(new Vector3(vector4.x, vector4.y), (Color32) color, new Vector2(uvRect.xMin * num1, uvRect.yMin * num2)); // vh.AddVert(new Vector3(vector4.x, vector4.w), (Color32) color, new Vector2(uvRect.xMin * num1, uvRect.yMax * num2)); // vh.AddVert(new Vector3(vector4.z, vector4.w), (Color32) color, new Vector2(uvRect.xMax * num1, uvRect.yMax * num2)); // vh.AddVert(new Vector3(vector4.z, vector4.y), (Color32) color, new Vector2(uvRect.xMax * num1, uvRect.yMin * num2)); // vh.AddTriangle(0, 1, 6); // vh.AddTriangle(6, 7, 0); // vh.AddTriangle(1, 2, 5); // vh.AddTriangle(5, 6, 1); // vh.AddTriangle(2, 3, 4); // vh.AddTriangle(4, 5, 2); vh.AddTriangle(0, 1, 2); vh.AddTriangle(2, 3, 0); vh.AddTriangle(1, 2, 3); vh.AddTriangle(3, 2, 1); } } }