陜西省建筑信息平臺(tái)上海搜索引擎優(yōu)化seo
原因
想要在編輯器擴(kuò)展也能訪問FairyGUI圖集里面的小圖,隨便找了一下沒有找到接口自己做一個(gè)
方法
使用UIPackage.GetItemByURL獲得小圖信息。從圖集中復(fù)制出小圖,如果有旋轉(zhuǎn)就逆旋轉(zhuǎn)90度即可
圖集里面的小圖是有可能旋轉(zhuǎn)的,可以通過訪問 NTexture.rotated 判斷在圖集中是否旋轉(zhuǎn)
獲取小圖在圖集中的起始位置
X偏移坐標(biāo)可以直接 uvRect.min.x * nativeTexture.width 得到真實(shí)的X偏移
Y坐標(biāo)可以根據(jù)uvRect賦值反過來(lái)獲得,原有公式是
uvRect.min.y = 1 - region.yMax / _nativeTexture.height
那么真實(shí)的公式就是
y = (1 - startOffset.y) * nativeTexture.height - textureSize.y
無(wú)非就是交互律。還原public NTexture(Texture texture, Rect region) 構(gòu)造傳入來(lái)的region參數(shù)
獲得偏移和大小后只需要使用RenderTexture把小圖讀出來(lái)就好
RenderTexture renderTex = RenderTexture.GetTemporary(nativeTexture.width, nativeTexture.height, 24, RenderTextureFormat.Default, RenderTextureReadWrite.Linear);Graphics.Blit(nativeTexture, renderTex);RenderTexture previous = RenderTexture.active;RenderTexture.active = renderTex;Texture2D resultTexture = new Texture2D(textureSize.x, textureSize.y, nativeTexture.format, false);resultTexture.ReadPixels(new Rect((int)startOffset.x, (int)startOffset.y, textureSize.x, textureSize.y), 0, 0);resultTexture.Apply();RenderTexture.active = previous;RenderTexture.ReleaseTemporary(renderTex);
圖集中的小圖是會(huì)旋轉(zhuǎn)的應(yīng)該如何還原
Texture2D.GetPixel 和 Texture2D.SetPixel 接口讀寫非常慢
可以直接使用GetPixelData或者GetPixels導(dǎo)出圖像數(shù)據(jù)數(shù)組,操作完成后刷新圖像數(shù)據(jù)
根據(jù) nativeTexture.format 類型使用Color或者Color32格式讀取
var colorArray = resultTexture.GetPixelData<Color32>(0)
有數(shù)組后簡(jiǎn)單逆旋轉(zhuǎn)90數(shù)組數(shù)據(jù),就可以得到原來(lái)的小圖
for (int i = 0; i < textureSize.x; i++)
{for (int j = 0; j < textureSize.y; j++){colors[i * textureSize.y + j] = colorArray[textureSize.x - 1 - i + j * textureSize.x];}
}
完整代碼
public Texture GetTexture(string url){PackageItem packageItem = UIPackage.GetItemByURL(url);if (packageItem == null)return null;NTexture nTexture = packageItem.texture;Texture2D nativeTexture = nTexture.nativeTexture as Texture2D;var startOffset = nTexture.uvRect.min;var textureSize = new Vector2Int(nTexture.width, nTexture.height);if (nTexture.rotated)textureSize = new Vector2Int(nTexture.height, nTexture.width);startOffset.x *= nativeTexture.width;startOffset.y = (1 - startOffset.y) * nativeTexture.height - textureSize.y;RenderTexture renderTex = RenderTexture.GetTemporary(nativeTexture.width, nativeTexture.height, 24, RenderTextureFormat.Default, RenderTextureReadWrite.Linear);Graphics.Blit(nativeTexture, renderTex);RenderTexture previous = RenderTexture.active;RenderTexture.active = renderTex;Texture2D resultTexture = new Texture2D(textureSize.x, textureSize.y, nativeTexture.format, false);resultTexture.ReadPixels(new Rect((int)startOffset.x, (int)startOffset.y, textureSize.x, textureSize.y), 0, 0);resultTexture.Apply();RenderTexture.active = previous;RenderTexture.ReleaseTemporary(renderTex);if (nTexture.rotated){var colorArray = resultTexture.GetPixelData<Color32>(0);Texture2D rotationTexture = new Texture2D(textureSize.y, textureSize.x, nativeTexture.format, false);var colors = rotationTexture.GetPixelData<Color32>(0);for (int i = 0; i < textureSize.x; i++){for (int j = 0; j < textureSize.y; j++){colors[i * textureSize.y + j] = colorArray[textureSize.x - 1 - i + j * textureSize.x];}}rotationTexture.SetPixelData(colors, 0);rotationTexture.Apply();Object.Destroy(resultTexture);resultTexture = rotationTexture;}return resultTexture;}