Как я могу обнаружить при изменении размера списка в инспекторе? - PullRequest
1 голос
/ 16 мая 2019

Это текущий размер элементов списка 3 в Инспекторе:

List in Inspector

При изменении размера, например, на 4, дублируется последнийпредмет, но я хочу, чтобы он добавил новый пустой предмет беседы: есть два предмета из запертой комнаты:

Last item is duplicated instead creating a new conversation item

Вот как я объявил Список:

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

public class ConversationTrigger : MonoBehaviour
{
    public List<Conversation> conversations = new List<Conversation>();

Что я пробовал до сих пор:

Создан скрипт редактора с кнопкой:

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

[CustomEditor(typeof(ConversationTrigger))]
public class ConversationTriggerEditor : Editor
{
    private SerializedProperty _conversations;

    private void OnEnable()
    {
        _conversations = serializedObject.FindProperty("conversations");
    }

    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();

        if(GUILayout.Button("Add new item"))
        {

        }
    }
}

Но теперь у меня две проблемы:

  1. Кнопка отменяет действие двух других кнопок, которые у меня уже были: «Загрузить и сохранить», и я хочу, чтобы эта кнопка «Добавить новый элемент» всегда находилась перед холстом и после последнего элемента.

  2. Как увеличить значение List внутри события кнопки в сценарии редактора?

after changes

Сценарий, как сейчас:

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

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

    private void OnEnable()
    {
        conversationtrigger = FindObjectOfType<ConversationTrigger>();
    }

    public override void OnInspectorGUI()
    {
        DrawDefaultInspector();

        if(GUI.Button(new Rect(0.2f,0.3f,0,0), "Add new item"))
        {
            conversationtrigger.conversations.Add(new Conversation());
        }
    }
}

Я изменил кнопку на GUI. Кнопка вместо GUILayout.Button, чтобы установить положение кнопки.

Но кнопка теперь исчезла, а также две другие кнопки из моего первого верхнего скриншота. Загрузка и сохранение также исчезли.

Это скрипт для кнопок загрузки и сохранения:

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

[CustomEditor(typeof(ConversationTrigger))]
public class SaveConversationsButton : Editor
{
    public override void OnInspectorGUI()
    {
        DrawDefaultInspector();

        ConversationTrigger dialoguetrigger = (ConversationTrigger)target;

        if (GUILayout.Button("Save Conversations"))
        {
            dialoguetrigger.SaveConversations();
        }

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

1 Ответ

2 голосов
/ 16 мая 2019

Использование MonoBehaviour.OnValidate() метод

Отредактировано из этого блога :

using UnityEngine;
using System.Collections;

public class OnValidateExample : MonoBehaviour
{
    public List<Conversation> conversations;
    private int previousConversationsCount;
    private int currentConversationsCount;

    void OnValidate()
    {
        currentConversationsCount = conversations.Count();

        if (previousConversationsCount != currentConversationsCount)
            Debug.Log($"Conversations count has changed: {previousConversationsCount} => {currentConversationsCount}");

        previousConversationsCount = currentConversationsCount;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...