Unity實現文本轉貼圖
本文實例為大傢分享瞭Unity實現文本轉貼圖的具體代碼,供大傢參考,具體內容如下
導入字體
導入ttf字體,修改Character為Custom set,並填入Custom Chars:
可以看到,Unity為我們生成瞭對應的材質和貼圖:
從上圖可以看出:
1、Unity中Texture2D的坐標原點為左下角,和OpenGL相同,V坐標與DX相反。
2、某些字符被上下翻轉,某些字符被順時針旋轉瞭90度
這兩點需要特別註意。
原理分析
本文中使用的方法是創建一個Texture,然後利用Texture2D的
public Color[] GetPixels(int x, int y, int blockWidth, int blockHeight);
成員方法,讀取字體貼圖中的像素信息,然後基於特定字符,利用Texture2D的
public void SetPixel(int x, int y, Color color);
方法,將像素信息寫入創建的Texrue。
確定GetPixels的參數x,y時,需要註意以下兩點:
1、對於被上下翻轉的字符,比如數字“1”,利用CharacterInfo. uvTopLeft計算;
2、對於被順時針旋轉90度的字符,比如字母“K”,利用CharacterInfo.uvBottomRight計算。
代碼實現
public Texture2D TextToTexture( Font font, string text, int textureWidth, int textureHeight, int drawOffsetX, int drawOffsetY, int textGap, int spaceGap, int rowHeight, Color textColor, Color backgroundColor) { // 創建返回的Texture var textTexture = new Texture2D(textureWidth, textureHeight, TextureFormat.ARGB32, true); Color[] emptyColor = new Color[textureWidth * textureHeight]; for (int i = 0; i < emptyColor.Length; i++) { emptyColor[i] = backgroundColor; } textTexture.SetPixels(emptyColor); // 字體貼圖不可讀,需要創建一個新的可讀的 var fontTexture = (Texture2D)font.material.mainTexture; var readableFontTexture = new Texture2D(fontTexture.width, fontTexture.height, fontTexture.format, fontTexture.mipmapCount, true); Graphics.CopyTexture(fontTexture, readableFontTexture); // 調整偏移量 var originalDrawOffsetX = drawOffsetX;// 記錄一下,換行用 drawOffsetY = textureHeight - drawOffsetY - rowHeight;// 從上方開始畫 // 逐個字符繪制 foreach (var @char in text.ToCharArray()) { if (@char == ' ') { drawOffsetX += spaceGap; continue; } if (@char == '\n') { // 換行 drawOffsetX = originalDrawOffsetX; drawOffsetY -= rowHeight; continue; } int charWidth, charHeight;// 字符寬高 Color[] charColor;// 字符顏色,數組內顏色的順序為從左至右,從下至上 font.GetCharacterInfo(@char, out CharacterInfo info); if (info.uvTopLeft.x < info.uvBottomRight.x)// 處理被垂直翻轉的字符 { charWidth = info.glyphWidth; charHeight = info.glyphHeight; charColor = readableFontTexture.GetPixels( (int)(readableFontTexture.width * info.uvTopLeft.x), (int)(readableFontTexture.height * info.uvTopLeft.y), charWidth, charHeight); for (int j = 0; j < charHeight; j++) { for (int i = 0; i < charWidth; i++) { if (charColor[j * charWidth + i].a != 0) { textTexture.SetPixel( drawOffsetX + i, drawOffsetY + charHeight - j,// 從上往下畫,把字符顛倒過來 textColor); } } } } else// 處理被順時針旋轉90度的字符 { charWidth = info.glyphHeight; charHeight = info.glyphWidth; charColor = readableFontTexture.GetPixels( (int)(readableFontTexture.width * info.uvBottomRight.x), (int)(readableFontTexture.height * info.uvBottomRight.y), charWidth, charHeight); for (int j = 0; j < charHeight; j++) { for (int i = 0; i < charWidth; i++) { if (charColor[j * charWidth + i].a != 0) { // 旋轉 textTexture.SetPixel( drawOffsetX + charHeight - j, drawOffsetY + i, textColor); } } } } // 更新偏移 drawOffsetX += charWidth + textGap; } textTexture.Apply(); return textTexture; }
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。