/// <summary> /// 生成新的UV,用帧动画 /// </summary> /// <param name="sprite"></param> /// <param name="tempUv"></param> /// <returns></returns> protected TextMeshInfo GenerateNewUv(TexturePackSprite sprite, ref TextMeshInfo tempUv) { //TexUvInfo tempUv = new TexUvInfo(); //计算其uv Vector2 texSize = Vector2.zero; texSize = new Vector2(textSpriteAsset.spriteSheet.width, textSpriteAsset.spriteSheet.height); tempUv.uv[0] = new Vector2(sprite.x / texSize.x, sprite.y / texSize.y); tempUv.uv[1] = new Vector2((sprite.x + sprite.width) / texSize.x, (sprite.y + sprite.height) / texSize.y); tempUv.uv[2] = new Vector2((sprite.x + sprite.width) / texSize.x, sprite.y / texSize.y); tempUv.uv[3] = new Vector2(sprite.x / texSize.x, (sprite.y + sprite.height) / texSize.y); return(tempUv); }
private static Vertex ConvertTextVertexToUIRVertex(TextMeshInfo info, int index, Vector2 offset, VertexFlags flags = VertexFlags.IsText) { float dilate = 0.0f; // If Bold, dilate the shape (this value is hardcoded, should be set from the font actual bold weight) if (info.uvs2[index].y < 0.0f) { dilate = 1.0f; } return(new Vertex { position = new Vector3(info.vertices[index].x + offset.x, info.vertices[index].y + offset.y, UIRUtility.k_MeshPosZ), uv = new Vector2(info.uvs0[index].x, info.uvs0[index].y), tint = info.colors32[index], flags = new Color32((byte)flags, (byte)(dilate * 255), 0, 0) }); }
internal static void MakeText(TextMeshInfo meshInfo, Vector2 offset, AllocMeshData meshAlloc, VertexFlags flags = VertexFlags.IsText) { int vertexCount = LimitTextVertices(meshInfo.vertexCount); int quadCount = vertexCount / 4; var mesh = meshAlloc.Allocate((uint)(quadCount * 4), (uint)(quadCount * 6)); for (int q = 0, v = 0; q < quadCount; ++q, v += 4) { mesh.SetNextVertex(ConvertTextVertexToUIRVertex(meshInfo, v + 0, offset, flags)); mesh.SetNextVertex(ConvertTextVertexToUIRVertex(meshInfo, v + 1, offset, flags)); mesh.SetNextVertex(ConvertTextVertexToUIRVertex(meshInfo, v + 2, offset, flags)); mesh.SetNextVertex(ConvertTextVertexToUIRVertex(meshInfo, v + 3, offset, flags)); mesh.SetNextIndex((UInt16)(v + 0)); mesh.SetNextIndex((UInt16)(v + 1)); mesh.SetNextIndex((UInt16)(v + 2)); mesh.SetNextIndex((UInt16)(v + 2)); mesh.SetNextIndex((UInt16)(v + 3)); mesh.SetNextIndex((UInt16)(v + 0)); } }
/// <summary> /// 生成uv信息 /// </summary> /// <param name="info"></param> /// <param name="startVertex"></param> /// <param name="unitsPerPixel"></param> /// <returns></returns> public int GenerateVertices(QuadPlaceholder info, Vector3 postion, int startVertex, float unitsPerPixel) { TextMeshInfo tempUv = new TextMeshInfo(); tempUv.startPos = postion * unitsPerPixel; //设置图片的位置 tempUv.vertices = new Vector3[4]; tempUv.vertices[0] = new Vector3(0, 0, 0) + tempUv.startPos; tempUv.vertices[1] = new Vector3(info.size.x, info.size.y, 0) + tempUv.startPos; tempUv.vertices[2] = new Vector3(info.size.x, 0, 0) + tempUv.startPos; tempUv.vertices[3] = new Vector3(0, info.size.y, 0) + tempUv.startPos; TexturePackSprite sprite = null; if (info.isAnimate) { RichTextAnimate textAnimate = textSpriteAsset.GetAnimateListByName(info.animateName); if (textAnimate != null) { sprite = textAnimate.spriteList[0]; } } else if (textSpriteAsset.spriteInfoList != null) { int index = int.Parse(info.sprite); if (textSpriteAsset.spriteInfoList.Count > index) { sprite = textSpriteAsset.spriteInfoList[index]; } } Vector2 texSize = Vector2.zero; if (sprite == null) { startVertex += 4 * info.length - 1; return(startVertex); } //计算其uv texSize = new Vector2(textSpriteAsset.spriteSheet.width, textSpriteAsset.spriteSheet.height); tempUv.uv = new Vector2[4]; if (!sprite.rotated) { tempUv.uv[0] = new Vector2(sprite.x / texSize.x, sprite.y / texSize.y); tempUv.uv[1] = new Vector2((sprite.x + sprite.width) / texSize.x, (sprite.y + sprite.width) / texSize.y); tempUv.uv[2] = new Vector2((sprite.x + sprite.width) / texSize.x, sprite.y / texSize.y); tempUv.uv[3] = new Vector2(sprite.x / texSize.x, (sprite.y + sprite.width) / texSize.y); } else { tempUv.uv[0] = new Vector2(sprite.x / texSize.x, sprite.y / texSize.y); tempUv.uv[1] = new Vector2((sprite.x + sprite.width) / texSize.x, (sprite.y + sprite.width) / texSize.y); tempUv.uv[2] = new Vector2((sprite.x + sprite.width) / texSize.x, sprite.y / texSize.y); tempUv.uv[3] = new Vector2(sprite.x / texSize.x, (sprite.y + sprite.width) / texSize.y); } //声明三角顶点所需要的数组 tempUv.triangles = new int[6]; startVertex += 4 * info.length - 1; RendererInfo rendererInfo = new RendererInfo(); rendererInfo.uvInfo = tempUv; rendererInfo.placeholder = info; m_RendererInfo.Add(rendererInfo); return(startVertex); }