Почему BeginScrollView нормально работает в скрипте редактора инспектора, но не работает в скрипте окна редактора? - PullRequest
0 голосов
/ 08 июля 2019

Это скрипт редактора инспектора, который работает нормально с представлением прокрутки:

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;

[CustomEditor(typeof(ConversationTrigger))]
public class ConversationTriggerEditor : Editor
{
    private Vector2 scrollPos;
    private ConversationTrigger conversationtrigger;

    private void OnEnable()
    {
        conversationtrigger = (ConversationTrigger)target;
    }

    public override void OnInspectorGUI()
    {
        scrollPos = EditorGUILayout.BeginScrollView(scrollPos, GUILayout.Height(250));
        DrawDefaultInspector();
        EditorGUILayout.EndScrollView();

        if (GUILayout.Button("Add new conversation"))
        {
            conversationtrigger.conversations.Add(new Conversation());
        }

        GUILayout.Space(10);
        if (conversationtrigger.conversations.Count == 0)
        {
            GUI.enabled = false;
        }
        else
        {
            GUI.enabled = true;
        }
        if (GUILayout.Button("Remove conversation"))
        {
            if (conversationtrigger.conversations.Count > 0)
                conversationtrigger.conversations.RemoveAt(conversationtrigger.conversations.Count - 1);
        }

        GUILayout.Space(100);
        if (GUILayout.Button("Save Conversations"))
        {
            conversationtrigger.SaveConversations();
        }

        GUILayout.Space(10);
        if (GUILayout.Button("Load Conversations"))
        {
            Undo.RecordObject(conversationtrigger, "Loaded conversations from JSON");
            conversationtrigger.LoadConversations();
        }
    }
}

И это скрипт окна редактора, который использует и показывает то же, что и в инспекторе, но в окне редакторапредставление прокрутки не работает.Я могу прокручивать вверх / вниз полосу прокрутки, просто не двигаясь совсем:

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;

public class ConversationsEditorWindow : EditorWindow
{
    Vector2 scrollPos;

    [MenuItem("Conversations/Conversations System")]
    static void Init()
    {
        const int width = 800;
        const int height = 800;

        var x = (Screen.currentResolution.width - width) / 2;
        var y = (Screen.currentResolution.height - height) / 2;

        GetWindow<ConversationsEditorWindow>().position = new Rect(x, y, width, height);
    }

    void OnGUI()
    {
        var ff = FindObjectOfType<ConversationTrigger>();
        EditorGUILayout.BeginVertical();
        EditorGUILayout.BeginScrollView(scrollPos, GUILayout.Width(800), GUILayout.Height(800));
        var editor = Editor.CreateEditor(ff);
        var tar = editor.targets;
        editor.OnInspectorGUI();
        EditorGUILayout.EndScrollView();
        EditorGUILayout.EndVertical();
        Repaint();
    }
}

И еще одна неприятная вещь, это когда я меняю количество разговоров в окне редактора в поле int или числоДиалоги Мне нужно сначала щелкнуть мышью в некоторой пустой области окна над измененным полем, чтобы изменения вступили в силу.Затем рушится рут, и мне нужно снова его развернуть:

На скриншоте один разговор:

One Conversation

Когда янабираю и меняю вместо 1 например на 20 ничего не происходит: остается только один разговор:

Still one conversation

Мне нужно сначала закрыть корень беседы:

Closed the conversations

Теперь, когда я нажму на него и открою снова, я увижу 20 разговоров:

20 Conversations

  1. Как я могу сделать так, чтобы при изменении размера разговоров и / или диалогов и / или предложений он добавлял / удалял элементы в реальном времени?

  2. На последнем скриншоте вы видите полосу прокрутки, которая не движется.Я не могу переместить его вверх / вниз.

1 Ответ

1 голос
/ 08 июля 2019

Таким образом, вопрос, похоже, на самом деле: почему список в окне Editor не обновляется?

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

[CustomEditor(typeof(ConversationTrigger))]
public class ConversationTriggerEditor : Editor
{
    private Vector2 scrollPos;
    private SerializedProperty conversations;
    private ConversationTrigger conversationTrigger;

    private void OnEnable()
    {
        conversations = serializedObject.FindProperty("conversations");
        conversationTrigger = (ConversationTrigger)target;
    }

    public override void OnInspectorGUI()
    {
        scrollPos = EditorGUILayout.BeginScrollView(scrollPos, GUILayout.Height(250));
        DrawDefaultInspector();
        EditorGUILayout.EndScrollView();

        // Load the current values from the real component into the serialized copy
        serializedObject.Update();

        if (GUILayout.Button("Add new conversation"))
        {
            conversations.arraySize++;
        }

        GUILayout.Space(10);
        if (conversations.arraySize != 0)
        {
            if (GUILayout.Button("Remove conversation"))
            {
                if (conversations.arraySize > 0) conversations.arraySize--;
            }
        }

        GUILayout.Space(100);
        if (GUILayout.Button("Save Conversations"))
        {
            conversationTrigger.SaveConversations();
        }

        GUILayout.Space(10);
        if (GUILayout.Button("Load Conversations"))
        {
            // Depending on what this does you should consider to also 
            // change it to using the SerializedProperties!
            Undo.RecordObject(conversationtrigger, "Loaded conversations from JSON");
            conversationTrigger.LoadConversations();
        }

        serializedObject.ApplyModifiedProperties();
    }
}

Как вы можете видеть, прокрутка отлично работает для меня:


И еще раз, я могу только настоятельно рекомендовать использовать ReorderableList для того, что вы делаете.Его немного сложнее настроить, но он чрезвычайно мощный:

[CustomEditor(typeof(ConversationTrigger))]
public class ConversationTriggerEditor : Editor
{
    private Vector2 scrollPos;
    private SerializedProperty conversations;
    private ConversationTrigger conversationTrigger;
    private ReorderableList conversationList;

    private void OnEnable()
    {
        conversations = serializedObject.FindProperty("conversations");
        conversationTrigger = (ConversationTrigger)target;


        conversationList = new ReorderableList(serializedObject, conversations)
        {
            displayAdd = true,
            displayRemove = true,
            draggable = true,

            drawHeaderCallback = rect =>
            {

                EditorGUI.LabelField(new Rect(rect.x, rect.y, 100, rect.height), "Conversations", EditorStyles.boldLabel);

                var newSize = EditorGUI.IntField(new Rect(rect.x + 100, rect.y, rect.width - 100, rect.height), conversations.arraySize);

                conversations.arraySize = Mathf.Max(0, newSize);
            },

            drawElementCallback = (rect, index, isActive, isSelected) =>
            {
                var element = conversations.GetArrayElementAtIndex(index);

                var name = element.FindPropertyRelative("Name");
                // do this for all properties

                var position = EditorGUI.PrefixLabel(rect, new GUIContent(name.stringValue));

                EditorGUI.PropertyField(position, name);
            },

            elementHeight = EditorGUIUtility.singleLineHeight
        };
    }

    public override void OnInspectorGUI()
    {
        // Load the current values from the real component into the serialized copy
        serializedObject.Update();

        scrollPos = EditorGUILayout.BeginScrollView(scrollPos, GUILayout.Height(250));

        GUILayout.Space(10);
        conversationList.DoLayoutList();

        EditorGUILayout.EndScrollView();

        GUILayout.Space(100);
        if (GUILayout.Button("Save Conversations"))
        {
            conversationTrigger.SaveConversations();
        }

        GUILayout.Space(10);
        if (GUILayout.Button("Load Conversations"))
        {
            Undo.RecordObject(conversationtrigger, "Loaded conversations from JSON");
            conversationTrigger.LoadConversations();
        }

        serializedObject.ApplyModifiedProperties();
    }
}

enter image description here


И используйте это, чтобы исправить EditorWindow

public class ConversationsEditorWindow : EditorWindow
{
    private ConversationTriggerEditor editor;

    [MenuItem("Conversations/Conversations System")]
    static void Init()
    {
        const int width = 800;
        const int height = 800;

        var x = (Screen.currentResolution.width - width) / 2;
        var y = (Screen.currentResolution.height - height) / 2;

        var window = GetWindow<ConversationsEditorWindow>();
        var ff = FindObjectOfType<ConversationTrigger>();
        window.position = new Rect(x, y, width, height);
        window.editor = (ConversationTriggerEditor)Editor.CreateEditor(ff);
    }

    void OnGUI()
    {
        editor.OnInspectorGUI();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...