Обычно ведь классы GUILayout или EditorGUILayout хорошо справляются с автоматической подгонкой элементов. Может вы их не используете?
Но если вам всё таки надо вручную выставить позиции каждых элементов, то для быстрого варианта можно временно создать окно для таких настроек. Правда для каждого параметра, который вы хотите менять, придётся создавать переменную.
Например у вас есть окно с двумя кнопками и вы ещё не знаете, в какую позицию захотите их поставить. Для каждой кнопки создаём переменную в которой будет хранится её положение. А при клике ПКМ в любом месте окна, будем вызывать дополнительно окно с настройками.
Окно настроек запоминает ссылку на то окно, чьи переменные будет менять.
И так же в этом окне настроек придётся продублировать эти переменные.
Меняя в окне настроек свойства позиций, кнопки в оригинальном окне так же будут менять своё положение. После того, как вы довольны результатом, то можно уже вручную прописать конкретные позиции для каждой кнопки в оригинальном скрипте и удалить лишние строки в скрипте настроек.
Пробовал на таком скрипте (в одном файле)
Используется csharp
using UnityEditor;
using UnityEngine;
public class MyWindow : EditorWindow
{
[MenuItem("Samana/MyWindow")]
static void ShowWindow()
{
GetWindow<MyWindow>();
}
public Vector2Int buttonLeft = new Vector2Int(117,81);
public Vector2Int buttonRight = new Vector2Int(230,79);
private void OnGUI()
{
if (Event.current.type == EventType.MouseDown && Event.current.button == 1)
{
GenericMenu menu = new GenericMenu();
menu.AddItem(new GUIContent("Settings"), false, createSettingsWindow);
menu.ShowAsContext();
}
GUI.Button(new Rect(buttonLeft.x, buttonLeft.y, 100, 30), "Left");
GUI.Button(new Rect(buttonRight.x, buttonRight.y, 100, 30), "Right");
}
public void createSettingsWindow()
{
GetWindow<TempSettings>().setRef(this);
}
}
public class TempSettings : EditorWindow
{
MyWindow win;
public Vector2Int buttonLeft;
public Vector2Int buttonRight;
public void setRef(MyWindow win)
{
this.win = win;
buttonRight = win.buttonRight;
buttonLeft = win.buttonLeft;
}
private void OnGUI()
{
buttonLeft = EditorGUILayout.Vector2IntField("buttonLeft", buttonLeft, GUILayout.ExpandWidth(false));
buttonRight = EditorGUILayout.Vector2IntField("buttonRight", buttonRight, GUILayout.ExpandWidth(false));
applySettings();
}
private void applySettings()
{
win.buttonLeft = buttonLeft;
win.buttonRight = buttonRight;
win.Repaint();
}
}
*gif-ка почему-то обрезана справа, но я там просто вбивал цифры позиций.