Когда-то пытался написать окошко с выбором текстуры как в TerrainEditor.
Теперь смог написать))
Кнопки хорошо масштабируется и автоматически переносится на новую строку.

private static int SelectionSpriteGrid(int selected, XAtlas atlas, int approxSize) {
Texture texture = atlas.GetMaterial().mainTexture;
List<XSprite> sprites = atlas.GetSprites();
const int yIndent = 5;
int xCount = Screen.width / approxSize;
GUILayout.BeginVertical("box");
for(int i=0; i<sprites.Count;) {
GUILayout.BeginHorizontal();
for(int x=0; x<xCount; x++, i++) {
Rect itemRect = GUILayoutUtility.GetAspectRect((float)approxSize/(approxSize+yIndent));
if(i >= sprites.Count) continue;
if(selected == i) {
Rect selectRect = new Rect(itemRect.x+1, itemRect.yMax-yIndent, itemRect.width-2, yIndent);
Color color = new Color(0.23f, 0.5f, 0.99f, 1f);
DrawRect(selectRect, color);
}
itemRect.xMin += 1;
itemRect.xMax -= 1;
itemRect.yMin += 1;
itemRect.yMax -= 1+yIndent;
if(Event.current.type == EventType.MouseDown && itemRect.Contains(Event.current.mousePosition)) {
selected = i;
GUI.changed = true;
}
GUI.DrawTextureWithTexCoords(itemRect, texture, sprites[i].GetFixedRect());
}
GUILayout.EndHorizontal();
}
GUILayout.EndVertical();
return selected;
}
private static void DrawRect(Rect rect, Color color) {
Vector3 a = new Vector3(rect.xMin, rect.yMin, 0);
Vector3 b = new Vector3(rect.xMax, rect.yMin, 0);
Vector3 c = new Vector3(rect.xMax, rect.yMax, 0);
Vector3 d = new Vector3(rect.xMin, rect.yMax, 0);
GL.Color(color);
GL.Begin(GL.TRIANGLES);
GL.Vertex(a);
GL.Vertex(b);
GL.Vertex(c);
GL.Vertex(c);
GL.Vertex(d);
GL.Vertex(a);
GL.End();
}
Только данный код для моих спрайтов, но переделать будет легко.