Синтаксис:
Используется csharp
public static void OnGUI() {
_DragAndDrop = EditorGUILayout.BeginScrollView(_DragAndDrop, false, true, GUILayout.Width(Screen.width), GUILayout.Height(Screen.height * 2 / 10f));
EditorGUILayout.BeginVertical(new GUIStyle(), GUILayout.MaxHeight(10));
foreach (Furniture c in ListOfFurniture.GetClearFurniture.Values) {
new FixFurnitureGui().OnGUI(c);
}
EditorGUILayout.EndVertical();
EditorGUILayout.EndScrollView();
}
_DragAndDrop = EditorGUILayout.BeginScrollView(_DragAndDrop, false, true, GUILayout.Width(Screen.width), GUILayout.Height(Screen.height * 2 / 10f));
EditorGUILayout.BeginVertical(new GUIStyle(), GUILayout.MaxHeight(10));
foreach (Furniture c in ListOfFurniture.GetClearFurniture.Values) {
new FixFurnitureGui().OnGUI(c);
}
EditorGUILayout.EndVertical();
EditorGUILayout.EndScrollView();
}
для отображения каждой записи есть скрипт FixFurnitureGui()
Синтаксис:
Используется csharp
public class FurnitureGui {
internal bool isOpenedDescription = false;
internal int index;
internal int price;
internal Furniture.ProcessingType type;
public void OnGUI(Furniture data) {
EditorGUILayout.BeginVertical();
EditorGUILayout.BeginHorizontal();
GUILayout.Label(data.Name);
type = data.TypeFurniture;
EditorGUI.BeginChangeCheck();
type = (Furniture.ProcessingType)EditorGUILayout.EnumPopup(type, GUILayout.Width(50));
if (EditorGUI.EndChangeCheck()) {
data.ChangeTypeFurniture(type);
ListOfFurniture.RemoveClearFurniture(data.Key);
}
}
EditorGUI.BeginChangeCheck();
price = EditorGUILayout.IntField(price, GUILayout.Width(30));
if (EditorGUI.EndChangeCheck()) {
data.ChangePriceOrder(price);
}
EditorGUILayout.EndHorizontal();
isOpenedDescription = EditorGUILayout.Foldout(isOpenedDescription, "описание");
if (isOpenedDescription) {
GUILayout.Label(data.Description);
GUILayout.Label("Объем " + data.Geometry);
GUILayout.Label("Цена: " + data.Price);
GUILayout.Label("Ключ: " + data.Key);
}
EditorGUILayout.EndVertical();
var rect = EditorGUILayout.BeginHorizontal();
Handles.color = Color.gray;
Handles.DrawLine(new Vector2(rect.x - 15, rect.y), new Vector2(rect.width + 15, rect.y));
EditorGUILayout.EndHorizontal();
EditorGUILayout.Space();
}
internal bool isOpenedDescription = false;
internal int index;
internal int price;
internal Furniture.ProcessingType type;
public void OnGUI(Furniture data) {
EditorGUILayout.BeginVertical();
EditorGUILayout.BeginHorizontal();
GUILayout.Label(data.Name);
type = data.TypeFurniture;
EditorGUI.BeginChangeCheck();
type = (Furniture.ProcessingType)EditorGUILayout.EnumPopup(type, GUILayout.Width(50));
if (EditorGUI.EndChangeCheck()) {
data.ChangeTypeFurniture(type);
ListOfFurniture.RemoveClearFurniture(data.Key);
}
}
EditorGUI.BeginChangeCheck();
price = EditorGUILayout.IntField(price, GUILayout.Width(30));
if (EditorGUI.EndChangeCheck()) {
data.ChangePriceOrder(price);
}
EditorGUILayout.EndHorizontal();
isOpenedDescription = EditorGUILayout.Foldout(isOpenedDescription, "описание");
if (isOpenedDescription) {
GUILayout.Label(data.Description);
GUILayout.Label("Объем " + data.Geometry);
GUILayout.Label("Цена: " + data.Price);
GUILayout.Label("Ключ: " + data.Key);
}
EditorGUILayout.EndVertical();
var rect = EditorGUILayout.BeginHorizontal();
Handles.color = Color.gray;
Handles.DrawLine(new Vector2(rect.x - 15, rect.y), new Vector2(rect.width + 15, rect.y));
EditorGUILayout.EndHorizontal();
EditorGUILayout.Space();
}
но вот возникло пару трудностей:
1. как отловить окончание изменения цены(поле больше не выделено, или нажата кнопка Enter)? пытался делать через EditorGUI.EndChangeCheck(), но он отлавливает любое изменение поля.
2. как можно заставить перерисоваться контейнер OnGUI? если поле type меняется, запись в GetClearFurniture удаляется, но отображение записи остается в окне чистой фурнитуры
3. вопрос со звездочкой. есть ли в новой версии юнити функция отрисовки линии? на просторах зарубежного форума нашлось пару старых костылей, но неужели нет норм функции. я помню что раньше(когда я только изучал юнити) было что-то простое, поддерживающее стили.