原因
想要在編輯器擴展也能訪問FairyGUI圖集里面的小圖,隨便找了一下沒有找到接口自己做一個
方法
使用UIPackage.GetItemByURL獲得小圖信息。從圖集中復(fù)制出小圖,如果有旋轉(zhuǎn)就逆旋轉(zhuǎn)90度即可
圖集里面的小圖是有可能旋轉(zhuǎn)的,可以通過訪問 NTexture.rotated 判斷在圖集中是否旋轉(zhuǎn)
獲取小圖在圖集中的起始位置
X偏移坐標可以直接 uvRect.min.x * nativeTexture.width 得到真實的X偏移
Y坐標可以根據(jù)uvRect賦值反過來獲得,原有公式是
uvRect.min.y = 1 - region.yMax / _nativeTexture.height
那么真實的公式就是
y = (1 - startOffset.y) * nativeTexture.height - textureSize.y
無非就是交互律。還原public NTexture(Texture texture, Rect region) 構(gòu)造傳入來的region參數(shù)
獲得偏移和大小后只需要使用RenderTexture把小圖讀出來就好
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);
圖集中的小圖是會旋轉(zhuǎn)的應(yīng)該如何還原
Texture2D.GetPixel 和 Texture2D.SetPixel 接口讀寫非常慢
可以直接使用GetPixelData或者GetPixels導(dǎo)出圖像數(shù)據(jù)數(shù)組,操作完成后刷新圖像數(shù)據(jù)
根據(jù) nativeTexture.format 類型使用Color或者Color32格式讀取文章來源:http://www.zghlxwxcb.cn/news/detail-709356.html
var colorArray = resultTexture.GetPixelData<Color32>(0)
有數(shù)組后簡單逆旋轉(zhuǎn)90數(shù)組數(shù)據(jù),就可以得到原來的小圖文章來源地址http://www.zghlxwxcb.cn/news/detail-709356.html
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;
}
到了這里,關(guān)于unity 編輯器時讀取FairyGUI圖集單個圖像的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!