我基本都是做移动端,但也涉及到网页端,主要还是针对移动端优化,优化涉及到的问题基本都是图片的使用方式,图片一定要使用2的N次方,这个是一定一定的,NGUI图集默认是大图是2的N次方,所以使用他的图集的时候不用考虑,大图烘焙图我建议使用2的N次方的大小的图,要不大家迟早会跳进这个坑,然后如果你使用的图的大小比实际图小的时候,可以使用uv算法,也可以用裁剪法,
public Vector2[] ReturnNewUV(Vector2[] uvpoints, Texture2D tex, Vector2[] ActualPoint)
{
float length = 0;//需要图的长度
float width = 0;//需要图的宽度
Vector2 v2_default = ActualPoint[0];
float minX = v2_default.x;
float maxX = v2_default.x;
float minZ = v2_default.y;
float maxZ = v2_default.y;
for (int i = 0; i < ActualPoint.Length; i++)
{
Vector2 v2 = ActualPoint[i];
if (minX > v2.x)
{
minX = v2.x;
}
if (maxX < v2.x)
{
maxX = v2.x;
}
if (minZ > v2.y)
{
minZ = v2.y;
}
if (maxZ < v2.y)
{
maxZ = v2.y;
}
}
length = (maxX - minX) ;//根据你的点集,算出你使用的长度
width = (maxZ - minZ) ;//根据你的点集,算出你使用的宽度
float minXX = uvpoints[0].x;
float maxXX = uvpoints[0].x;
float minZZ = uvpoints[0].y;
float maxZZ = uvpoints[0].y;
for (int i = 0; i < uvpoints.Length; i++)
{
Vector2 v2 = uvpoints[i];
if (minXX > v2.x)
{
minXX = v2.x;
}
if (maxXX < v2.x)
{
maxXX = v2.x;
}
if (minZZ > v2.y)
{
minZZ = v2.y;
}
if (maxZZ < v2.y)
{
maxZZ = v2.y;
}
}//uv点集中最大x,y值
//把这些uv点除以最大x,y值,保证uv在(0~1)之间,这样就可以把一张图铺上去,如果想根据你的需要去使用这张图的比例,就乘以你的使用大小/图片的实际大小
for (int i = 0; i < uvpoints.Length; i++)
{
//uvpoints[i].x / maxX 缩小uv的X保证x在0~1之间
//uvpoints[i].y / maxZ) 缩小uv的Z保证z在0~1之间
//length / tex.width 当前长度与图片长度的比例
//wight / tex.height 当前宽度与图片宽度的比例
uvpoints[i] = new Vector2((uvpoints[i].x / maxXX*length / tex.width ) , (uvpoints[i].y / maxZZ*wight / tex.height ) );
}
return uvpoints;
}
使用方法mesh.uv = ReturnNewUV(,,,,)还有一种方法是图片裁剪的方法
float xNum = 0;
float yNum = 0;
xNum = Mathf.Abs(maxX - minX) ;
yNum = Mathf.Abs(maxZ - minZ) ;
float imgWidth = texture.width;//texture原始图片
float imgHeight = texture.height;
int pixelsW = (int)imgWidth;
int pixelsH = (int)imgHeight;
Color[] colors = texture.GetPixels(0, 0, pixelsW, pixelsH);//获取从(0~pixeW)宽度,(0~pixeH)高度的图片裁剪
curNewT2D = new Texture2D(pixelsW, pixelsH);//new一个新的需要这个大小的图片
curNewT2D.SetPixels(colors);//把上面获得的赋给它
curNewT2D.Apply();//curNewT2D就是新的一张图,就是自己设定的大小