诚如的游说俺们切割图片是用同样摆放图片资源切割成又小之图形资源,也就是说在资源达到就进行了切割,比如ugui上之切割方式。
假如我们发出有场面按做拼图,可能受玩家自己选择自己之生仍作为拼图的原图。
这就是说我们需要进行在内存中开展切割
Texture2D ScaleTextureCutOut(Texture2D originalTexture, float startX,float startY, float originalWidth, float originalHeight)
{
originalWidth = Mathf.Clamp(originalWidth, 0, Mathf.Max(originalTexture.width - startX,0));
originalHeight = Mathf.Clamp(originalHeight, 0, Mathf.Max(originalTexture.height - startY,0));
Texture2D newTexture = new Texture2D(Mathf.CeilToInt(originalWidth), Mathf.CeilToInt(originalHeight));
int maxX = originalTexture.width - 1;
int maxY = originalTexture.height - 1;
for (int y = 0; y < newTexture.height; y++)
{
for (int x = 0; x < newTexture.width; x++)
{
float targetX = x + startX;
float targetY = y + startY;
int x1 = Mathf.Min(maxX, Mathf.FloorToInt(targetX));
int y1 = Mathf.Min(maxY, Mathf.FloorToInt(targetY));
int x2 = Mathf.Min(maxX, x1 + 1);
int y2 = Mathf.Min(maxY, y1 + 1);
float u = targetX - x1;
float v = targetY - y1;
float w1 = (1 - u) * (1 - v);
float w2 = u * (1 - v);
float w3 = (1 - u) * v;
float w4 = u * v;
Color color1 = originalTexture.GetPixel(x1, y1);
Color color2 = originalTexture.GetPixel(x2, y1);
Color color3 = originalTexture.GetPixel(x1, y2);
Color color4 = originalTexture.GetPixel(x2, y2);
Color color = new Color(Mathf.Clamp01(color1.r * w1 + color2.r * w2 + color3.r * w3 + color4.r * w4),
Mathf.Clamp01(color1.g * w1 + color2.g * w2 + color3.g * w3 + color4.g * w4),
Mathf.Clamp01(color1.b * w1 + color2.b * w2 + color3.b * w3 + color4.b * w4),
Mathf.Clamp01(color1.a * w1 + color2.a * w2 + color3.a * w3 + color4.a * w4)
);
newTexture.SetPixel(x, y, color);
}
}
newTexture.anisoLevel = 2;
newTexture.Apply();
return newTexture;
}
夫代码摘自网络直达的,然后上加了序幕位置,逻辑是拿各一个对应点的色素值取出来,放置于内存中的图片点上
今天当开使之时节发现,图片切割的胚胎位置是在左下角,于是,在召开拼图或者其他娱乐,需要的时光要留心进行Y值的折算
再有另外的一些不怕是所运用的图纸如果当unity中之事态,需要勾选允许读取和写入
要不然在开展读颜色值的时刻会起谬误。
举行拼图遇到还有的一个题目是,让玩家选择本地任意地点文件,参考 http://blog.csdn.net/awnuxcvbn/article/details/21277481
末尾来发现型受到之所以到图集,但是原图丢失了,然后于整图集的时刻不是专门便利,把A图集的同样桩删除后无法放开B中。于是便需拆开原图
[MenuItem("Tools/Resume Sprite From Atlas")]
public static void ResumeSpriteFromAtlas()
{
Object[] go = Selection.objects;
for (int i = 0; i < go.Length; i++)
{
if (go[i].GetType() == typeof(GameObject))
{
GameObject resObject = go[i] as GameObject;
UIAtlas resAtlas = resObject.GetComponent<UIAtlas>();
if (resAtlas != null)
{
DecompressAtlas(resAtlas);
}
}
}
}
public static void DecompressAtlas(UIAtlas resAtlas)
{
string mainPath = "D://OutSprites/" + resAtlas.name;
if ( !System.IO.Directory.Exists(mainPath) )
{
System.IO.Directory.CreateDirectory(mainPath);
}
Material mainMaterial = resAtlas.spriteMaterial;
Texture2D mainTexture = (Texture2D)mainMaterial.mainTexture;
for(int i = 0; i < resAtlas.spriteList.Count; i++)
{
UISpriteData spData = resAtlas.spriteList[i];
Texture2D newTexture = new Texture2D(spData.width, spData.height);
Color[] needCopy = mainTexture.GetPixels(spData.x, mainTexture.height - (spData.y + spData.height), spData.width, spData.height);
newTexture.SetPixels(0, 0, newTexture.width, newTexture.height, needCopy);
newTexture.Apply();
byte[] pngBytes = newTexture.EncodeToPNG();
string filePath = mainPath + "/" + spData.name + ".png";
Stream st = System.IO.File.Open(filePath, FileMode.OpenOrCreate);
st.Write(pngBytes, 0, pngBytes.Length);
st.Flush();
st.Close();
UnityEngine.Debug.Log(filePath);
}
}
在untiy 手机如何下hga010编辑器下可以拿入选的图集拆出原图,这样就是同时可管组合图集了
Your Comments