OnGUI
вызывается только тогда, когда мышь (перемещается / щелкает) над соответствующим окном -> она не берет almost 5 seconds
, но пока вы снова не наведете указатель мыши на окно.
Чтобы решить эту проблему, вы можете реализовать EditorWindow.OnSelectionChange
и принудительно установить EditorWindow.Repaint
, чтобы ваше окно обновлялось каждый раз, когда меняется Selection
.
private void OnSelectionChange()
{
Repaint();
}
Второй выпуск создается следующим образом:
GUILayout.TextField
вместе с GUILayout.FlexibleSpace
, если не определены иначе, автоматически использует ширину вставленного текста -> Так как у вас есть пустой текст в начале имеет ширину почти 0 ... вы на самом деле можете видеть ваш TextField очень тонким, и он становится больше по мере заполнения:
Использование ящиков из EditorGUILayout
вместо этого решает это:
EditorGUILayout.BeginHorizontal(EditorStyles.toolbar);
GUILayout.FlexibleSpace();
searchString = EditorGUILayout.TextField(searchString, EditorStyles.toolbarTextField);
EditorGUILayout.EndHorizontal();
var items = Selection.gameObjects;
// Do comparison here. For example
foreach (var selectedObject in selected)
{
if (selectedObject .name.Contains(searchString))
{
EditorGUILayout.LabelField(selectedObject.name);
}
}
Подсказка Если вы замените
EditorGUILayout.LabelField(items[i].name);
на
if (GUILayout.Button(selectedObject.name, EditorStyles.label))
{
EditorGUIUtility.PingObject(selectedObject);
}
Вы можете нажать на имя и «пинговать» соответствующий GameObject в иерархии!
Обновление с тех пор, как это было задано в комментариях
Если вы хотите включить всех дочерних элементов в рекурсивную выборку, вы можете сделать что-то вроде (могут быть и лучшие способы это то, что я придумал в течение 10 минут)
private static IEnumerable GetChildrenRecursive(GameObject root)
{
var output = new List();
//add the root object itself
output.Add(root);
// iterate over direct children
foreach (Transform child in root.transform)
{
// add the child itslef
output.Add(child.gameObject);
// Recursion here: Get all subchilds of this child
var childsOfchild = GetChildrenRecursive(child.gameObject);
output.AddRange(childsOfchild);
}
return output;
}
private static IEnumerable GetChildrenRecursive(IEnumerable rootObjects)
{
var output = new List();
foreach (var root in rootObjects)
{
output.AddRange(GetChildrenRecursive(root));
}
// remove duplicates
return output.Distinct().ToList();
}
и используя
var selected = GetChildrenRecursive(Selection.gameObjects);
Другое обновление
Так как это может быть не очень эффективнее, вы, вероятно, должны переместить его в Searching
, а затем обновить значение selected
также в OnSelectionChange
, например,
public class SearchableWindow : EditorWindow
{
private string searchString = "";
private List selected;
[MenuItem("Tools/Searching")]
private static void Searching()
{
const int width = 340;
const int height = 420;
var x = (Screen.currentResolution.width - width) / 2;
var y = (Screen.currentResolution.height - height) / 2;
var window = GetWindow();
window.position = new Rect(x, y, width, height);
window.selected = GetChildrenRecursive(Selection.gameObjects).ToList();
}
private void OnSelectionChange()
{
selected = GetChildrenRecursive(Selection.gameObjects).ToList();
Repaint();
}
private void OnGUI()
{
EditorGUILayout.BeginHorizontal(EditorStyles.toolbar);
GUILayout.FlexibleSpace();
searchString = EditorGUILayout.TextField(searchString, EditorStyles.toolbarTextField);
EditorGUILayout.EndHorizontal();
// only as fallback
if (selected == null)
{
selected = GetChildrenRecursive(Selection.gameObjects).ToList();
}
// Do comparison here. For example
foreach (var selectedObject in selected)
{
if (selectedObject.name.Contains(searchString))
{
if (GUILayout.Button(selectedObject.name, EditorStyles.label))
{
EditorGUIUtility.PingObject(selectedObject);
}
}
}
}
private static IEnumerable GetChildrenRecursive(GameObject root)
{
var output = new List();
//add the root object itself
output.Add(root);
// iterate over direct children
foreach (Transform child in root.transform)
{
// add the children themselves
output.Add(child.gameObject);
var childsOfchild = GetChildrenRecursive(child.gameObject);
output.AddRange(childsOfchild);
}
return output;
}
private static IEnumerable GetChildrenRecursive(IEnumerable rootObjects)
{
var output = new List();
foreach (var root in rootObjects)
{
output.AddRange(GetChildrenRecursive(root));
}
// remove any duplicates that would e.g. appear if you select a parent and its child
return output.Distinct();
}
}
ColorSchemer - хороший для нахождения дополнительных цветов
Можно найти некоторые созданные пользователями цветовые схемы на Kuler:
Я просто собираюсь бросить что-то там, но более важно (IMO) иметь цветовую схему, которая способствует удобству использования по тому, которое эстетически приятно. Это снабжает при Разработке большего количества Применимых веб-сайтов, мог бы представлять интерес, наряду с этим сообщением в блоге, которое обращается и к взгляду и к удобству использования.
Я часто использую kuler.adobe.com. Это довольно полезно.
При нахождении страницы, Вам нравится, можно узнать точные цвета, используемые от, "мне Нравятся Цвета"