Как я могу добавить диалоги на верхнем уровне над диалогами? - PullRequest
0 голосов
/ 30 марта 2019

В верхней части сценария триггера диалога я добавил новую строку типа списка:

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

public class DialogueTrigger : MonoBehaviour
{
    public List<string> conversation = new List<string>();
    public List<Dialogue> dialogue = new List<Dialogue>();

    [HideInInspector]
    public int dialogueNum = 0;

    private bool triggered = false;
    private List<Dialogue> oldDialogue;

    private void Start()
    {
        //oldDialogue = dialogue.ToList();
    }

    public void TriggerDialogue()
    {
        if (triggered == false)
        {
            if (FindObjectOfType<DialogueManager>() != null)
            {
                FindObjectOfType<DialogueManager>().StartDialogue(dialogue[dialogueNum]);
                dialogueNum += 1;
            }
            triggered = true;
        }
    }

    private void Update()
    {
        if (DialogueManager.dialogueEnded == true)
        {
            if (dialogueNum == dialogue.Count)
            {
                return;
            }
            else
            {
                FindObjectOfType<DialogueManager>().StartDialogue(dialogue[dialogueNum]);
                DialogueManager.dialogueEnded = false;
                dialogueNum += 1;
            }
        }
    }
}

Затем в сценарии редактора:

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

[CustomEditor(typeof(DialogueTrigger))]
public class DialogueTriggerEditor : Editor
{
    private SerializedProperty _dialogues;
    private SerializedProperty _conversations;

    private void OnEnable()
    {
        // do this only once here
        _dialogues = serializedObject.FindProperty("dialogue");
        _conversations = serializedObject.FindProperty("conversation");
    }

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

        serializedObject.Update();

        _conversations.arraySize = EditorGUILayout.IntField("Conversation Size", _conversations.arraySize);

        // Ofcourse you also want to change the list size here
        _dialogues.arraySize = EditorGUILayout.IntField("Dialogue Size", _dialogues.arraySize);

        for (int x = 0; x < _conversations.arraySize; x++)
        {
            for (int i = 0; i < _dialogues.arraySize; i++)
            {
                var dialogue = _dialogues.GetArrayElementAtIndex(i);
                EditorGUILayout.PropertyField(dialogue, new GUIContent("Dialogue " + i), true);
            }
        }

        // Note: You also forgot to add this
        serializedObject.ApplyModifiedProperties();
    }
}

Я выполняю цикл _conversationsна петле _dialogues.Но это не то, что я хотел.

Я хочу, чтобы в Инспекторе на верхнем уровне был только «Размер беседы».

Если Размер беседы равен 0, то ничего не происходит.Но если размер беседы, например, равен 5.

, то он создаст 5 бесед (беседа 1, беседа 2 ... беседа5).И под каждым Разговором будет Размер Диалога, и тогда я смогу сделать много диалогов за беседу.

Таким образом, будет легче идентифицировать последующие беседы и диалоги.Вместо этого, как и раньше, было одно длинное диалоговое окно.

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

Это сценарии согласно решению:

Создан класс:

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

[System.Serializable]
public class Conversation
{
    public string Id;
    public List<Dialogue> Dialogues = new List<Dialogue>();
}

Затем триггерный скрипт:

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

public class DialogueTrigger : MonoBehaviour
{
    public List<Conversation> conversations = new List<Conversation>();
    public List<Dialogue> dialogue = new List<Dialogue>();

    [HideInInspector]
    public int dialogueNum = 0;

    private bool triggered = false;
    private List<Dialogue> oldDialogue;

    private void Start()
    {
        //oldDialogue = dialogue.ToList();
    }

    public void TriggerDialogue()
    {
        if (triggered == false)
        {
            if (FindObjectOfType<DialogueManager>() != null)
            {
                FindObjectOfType<DialogueManager>().StartDialogue(dialogue[dialogueNum]);
                dialogueNum += 1;
            }
            triggered = true;
        }
    }

    private void Update()
    {
        if (DialogueManager.dialogueEnded == true)
        {
            if (dialogueNum == dialogue.Count)
            {
                return;
            }
            else
            {
                FindObjectOfType<DialogueManager>().StartDialogue(dialogue[dialogueNum]);
                DialogueManager.dialogueEnded = false;
                dialogueNum += 1;
            }
        }
    }
}

И последнийскрипт редактора триггеров:

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

[CustomEditor(typeof(DialogueTrigger))]
public class DialogueTriggerEditor : Editor
{
    private SerializedProperty _dialogues;
    private SerializedProperty _conversations;

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

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

        serializedObject.Update();

        _conversations.arraySize = EditorGUILayout.IntField("Conversations Size", _conversations.arraySize);

        for (int x = 0; x < _conversations.arraySize; x++)
        {
            var conversation = _conversations.GetArrayElementAtIndex(x);

            var Id = conversation.FindPropertyRelative("Id");
            EditorGUILayout.PropertyField(Id);

            _dialogues = conversation.FindPropertyRelative("Dialogues");

            _dialogues.arraySize = EditorGUILayout.IntField("Dialogues size", _dialogues.arraySize);

            for (int i = 0; i < _dialogues.arraySize; i++)
            {
                var dialogue = _dialogues.GetArrayElementAtIndex(i);
                EditorGUILayout.PropertyField(dialogue, new GUIContent("Dialogue " + i), true);
            }
        }

        serializedObject.ApplyModifiedProperties();
    }
}

и результат скриншота:

Conversations

Я думаю, что все идентификаторы в Инспекторе должныбыть потомками размера беседы, а все размеры диалогов должны быть потомками идентификатора, и тогда диалоги должны быть потомками размера диалогов.

Conversation Size
   Id 1
    Dialogues Size
      Dialogue 1
        Name
        Sentences
      Dialogue 2

Что-то в этом роде.

1 Ответ

1 голос
/ 30 марта 2019

Вместо этого у вас должен быть правильный класс

[Serializable]
public class Conversation
{
    public string Id;
    public List<Dialogue> Dialogues = new List<Dialogue>();
}

, и вместо этого у вас должен быть список этого класса в

public DialogueTrigget : MonoBehaviour
{
    public List<Conversation> Conversations = new List<Conversation> ();
    ...
}

Чем вы можете использовать точно такой же скрипт, который я далВы в прошлый раз, но с

_conversations = serializedObject.FindProperty("Conversations");

и, соответственно, одним циклом for, более похожим на то, что вы уже пробовали .. что-то вроде

[CustomEditor(typeof(DialogueTrigger))]
public class DialogueTriggerEditor : Editor
{
    private SerializedProperty _dialogues;
    private SerializedProperty _conversations;

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

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

        serializedObject.Update();

        _conversations.arraySize = EditorGUILayout.IntField("Conversation Size", _conversations.arraySize);

        for (int x = 0; x < _conversations.arraySize; x++)
        {
            var conversation = _conversations.GetArrayElementAtIndex(x);

            var id = conversation.FindPropertyRelative("I'd");

            EditorGUI.indentLevel ++;
            EditorGUILayout.PropertyField(Id);

            var dialogues = conversation.FindPropertyRelative("Dialogues");

            dialogues.arraySize = EditorGUILayout.IntField("Dialogues size", dialogues.arraySize);

            for (int i = 0; i < dialogues.arraySize; i++)
            {
                var dialogue = _dialogues.GetArrayElementAtIndex(i);
                EditorGUI.indentLevel++;
                EditorGUILayout.PropertyField(dialogue, new GUIContent("Dialogue " + i), true);

                EditorGUI.indentLevel--;
            }

            EditorGUI.indentLevel--;
        }

        serializedObject.ApplyModifiedProperties();
    }
}

или просто

EditorGUILayout.PropertyField(_conversations, new GUIContent ("Conversations"), true);

но это не напечатало бы «Диалог 1, Диалог 2» и т. д.


Опять же, я настоятельно рекомендую вам взглянуть на вложенный ReorderableList , вы увидите, что это здорово, как только вы получилиэто работает.


Набрано на моем смартфоне, поэтому никаких гарантий

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