Как я могу проверить, является ли флаг ложным / истинным, а затем решить, следует ли включить ложную / истинную кнопку в OnGUI? - PullRequest
0 голосов
/ 28 августа 2018

Сценарий имеет тип EditorWindow.

Переменная wasUndo является глобальным типом bool. Я хочу использовать этот флаг, чтобы решить, когда включить / выключить кнопку «Отменить последнее».

Проблема в том, что он внутри OnGUI и все время делает цикл. Я хочу, чтобы, если файл json существует, а размер файла велик, то 0, а если один или несколько объектов в списке выбора имеют значение null, тогда включите кнопку true, а затем при нажатии кнопки снова установите кнопку включения false.

То же самое происходит и сейчас, когда я удаляю объект в Иерархии, который является частью списка выбора. Кнопка становится активированной, но затем, когда я нажимаю кнопку, он снова становится активным ложным и никогда не поворачивает активирующее истинное.

private void OnGUI
{

    //The saving part:

    var selections = Selection.objects.OfType<GameObject>().ToList();
    if (selections.Count > 0)
    {
        for (var i = selections.Count - 1; i >= 0; --i)
        {
            var selected = selections[i];
            transformSelection.Add(selected.transform);
        }

        TransformSaver.SaveTransform(transformSelection.ToArray());

        tempTransformSelection = transformSelection;
        transformSelection = new List<Transform>();
    }

    //The loading part:

    var file = @"d:\json\json.txt";
    FileInfo fi = new FileInfo(file);

    for (int i = 0; i < tempTransformSelection.Count(); i++)
    {
        if (File.Exists(@"d:\json\json.txt") 
            && fi.Length > 0 
            && tempTransformSelection[i] == null 
            && wasUndo == false)
        {
            GUI.enabled = true;
            wasUndo = false;
        }
        else
        {
            GUI.enabled = false;
        }
    }

    if (GUILayout.Button("Undo last"))
    {
        TransformSaver.LoadTransform();
        wasUndo = true;
    }
}

1 Ответ

0 голосов
/ 28 августа 2018

Вы можете сделать рисунок кнопки зависимым от wasUndo. Но на самом деле вам не нужна глобальная переменная для этого. Я просто использовал showButton .. если хочешь, можешь в любом случае придерживаться своего wasUndo, просто используя его таким же образом

private void OnGUI
{
    var file = @"d:\json\json.txt";
    FileInfo fi = new FileInfo(file);

    // By default asume you don't want to show the button
    // it will than only be enabled if the later conditions match
    bool showButton = false;

    // you can check this already here not in the loop
    // if no file -> nothing to do
    if(!File.Exists(@"d:\json\json.txt") || fi.Length <= 0) return;


    // This is only reached if the file exists and is not empty

    // check for null transforms
    for (int i = 0; i < tempTransformSelection.Count(); i++)
    {
        // if not null do nothing
        if(tempTransformSelection[i] != null) continue;

        // otherwise enable the button and leave the loop
        showButton = true;
        break;
    }

    // if not true then button won't be shown
    if(!showButton ) return;

    if (GUILayout.Button("Undo last"))
    {
        TransformSaver.LoadTransform();
        showButton = false;
    }
}

Обновление

Если вы хотите просто отключить кнопку вместо того, чтобы она полностью исчезла, вы можете просто обернуть ее в EditorGUI.BeginDisabledGroup(bool disabled)

Так что вместо

if(!showButton) return;

...

Вы бы сделали

EditorGUI.BeginDisabledGroup(!showButton);

if(GUILayout.Button("..."){ //... }

EditorGUI.EndDisabledGroup();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...