Rect GetImageUVRect(Image image, Rect localRect, Vector2[] uv) { Rect imageRect = new Rect(0, 0, image.size.x, image.size.y); Rect bound = ToolSet.Intersection(ref imageRect, ref localRect); Rect uvRect = image.texture.uvRect; if (image.scale9Grid != null) { Rect gridRect = (Rect)image.scale9Grid; float sourceW = image.texture.width; float sourceH = image.texture.height; uvRect = Rect.MinMaxRect(Mathf.Lerp(uvRect.xMin, uvRect.xMax, gridRect.xMin / sourceW), Mathf.Lerp(uvRect.yMin, uvRect.yMax, (sourceH - gridRect.yMax) / sourceH), Mathf.Lerp(uvRect.xMin, uvRect.xMax, gridRect.xMax / sourceW), Mathf.Lerp(uvRect.yMin, uvRect.yMax, (sourceH - gridRect.yMin) / sourceH)); float vw = imageRect.width - (sourceW - gridRect.width); float vh = imageRect.height - (sourceH - gridRect.height); uvRect = Rect.MinMaxRect(Mathf.Lerp(uvRect.xMin, uvRect.xMax, (bound.x - gridRect.x) / vw), Mathf.Lerp(uvRect.yMin, uvRect.yMax, (imageRect.height - bound.yMax - (sourceH - gridRect.yMax)) / vh), Mathf.Lerp(uvRect.xMin, uvRect.xMax, (bound.xMax - gridRect.x) / vw), Mathf.Lerp(uvRect.yMin, uvRect.yMax, (imageRect.height - bound.yMin - gridRect.y) / vh)); } else { uvRect = Rect.MinMaxRect(Mathf.Lerp(uvRect.xMin, uvRect.xMax, bound.xMin / imageRect.width), Mathf.Lerp(uvRect.yMin, uvRect.yMax, (imageRect.height - bound.yMax) / imageRect.height), Mathf.Lerp(uvRect.xMin, uvRect.xMax, bound.xMax / imageRect.width), Mathf.Lerp(uvRect.yMin, uvRect.yMax, (imageRect.height - bound.yMin) / imageRect.height)); } uv[0] = uvRect.position; uv[1] = new Vector2(uvRect.xMin, uvRect.yMax); uv[2] = new Vector2(uvRect.xMax, uvRect.yMax); uv[3] = new Vector2(uvRect.xMax, uvRect.yMin); if (image.texture.rotated) { ToolSet.RotateUV(uv, ref image.texture.uvRect); } return(uvRect); }