pax, так правильно заработало.
GUILayout.Space(30+Mathf.Ceil(GUI.skin.toggle.padd ing.horizontal/2f))
Использовал Handles.FreeMoveHandle. Нужно было определить какой из этих шариков сейчас активный. Узнать это можно только использовав GUI.SetNextControlName и GetNameOfFocusedControl, что оказалось очень тормозным. Правда шариков у меня было 100.
Пришлось с помощью рефлекций добираться до внутреннего метода юнити. Вообщем вот что получилось
delegate Vector3 FreeMove(int id, Vector3 position, Quaternion rotation, float size, Vector3 snap, Handles.DrawCapFunction capFunc);
private static FreeMove freeMove;
static MyHandles() {
var assembly = Assembly.GetAssembly( typeof(Handles) );
Type type = assembly.GetType("UnityEditorInternal.FreeMove");
var method = type.GetMethod("Do");
freeMove = (FreeMove)Delegate.CreateDelegate( typeof(FreeMove), method );
}
Это чтобы можно было рисовать FreeMoveHandle, со своим ID. Ну а дальше генерирую свой id EditorGUIUtility.GetControlID(FocusType.Keyboard), рисую шарик и сверяю EditorGUIUtility.hotControl со своим ID.
Вот теперь думаю они вообще занимаются своим редактором?
Ведь достаточно было сделать возможность получить последний сгенерированный ID или сделать проверку на фокус последнего контрола.