Почему при установке active true для объекта canvas он не устанавливает active true и потомки? - PullRequest
0 голосов
/ 07 февраля 2020
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class DialogueManager : MonoBehaviour
{
    public Text dialogueText;
    public Text nameText;
    public float sentencesSwitchDuration;
    public bool animateSentenceChars = false;
    public GameObject canvas;
    public static bool dialogueEnded = false;
    public ConversationTrigger trigger;

    private Queue<string> sentence;

    // Use this for initialization
    void Start()
    {
        sentence = new Queue<string>();
    }

    public void StartDialogue(Dialogue dialogue)
    {
        dialogueEnded = false;

        canvas.SetActive(true);

        nameText.text = dialogue.Name;

        if(sentence == null)
            sentence = new Queue<string>();

        sentence.Clear();
        foreach (string sentence in dialogue.Sentences)
        {
            this.sentence.Enqueue(sentence);
        }

        DisplayNextSentence();
    }

    public void DisplayNextSentence()
    {
        if (this.sentence.Count == 0)
        {
            EndDialogue();
            return;
        }

        string sentence = this.sentence.Dequeue();
        dialogueText.text = sentence;

        StopAllCoroutines();
        StartCoroutine(DisplayNextSentenceWithDelay(sentence));
    }

    public IEnumerator DisplayNextSentenceWithDelay(string sentence)
    {
        if (animateSentenceChars)
        {
            dialogueText.text = "";
            foreach (char letter in sentence.ToCharArray())
            {
                dialogueText.text += letter;
                yield return null;
            }
        }

        yield return new WaitForSeconds(sentencesSwitchDuration);
        DisplayNextSentence();
    }

    private void EndDialogue()
    {
        dialogueEnded = true;
    }
}

Я делаю:

canvas.SetActive(true);

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

Игра начинается, когда диалог GUI активен, ложь не активна. Затем, через несколько секунд в игре, диалог GUI становится активным истинным, но не дочерним:

Childs of Dialogue GUI are not active

1 Ответ

1 голос
/ 07 февраля 2020

короче: потому что это не то, что SetActive используется для .. это относится только к самому объекту , а не к дочерним элементам.


Вы, кажется, деактивируете каждого ребенка в вашей сцене или сборном, а затем активируете только основной Canvas объект.

Итак, самое тривиальное решение: не отключать какие-либо объекты в сцене, но только сам объект Canvas * 1014. *


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

// returns all recursive children transforms including this transform as well
// by passing true you also get disabled and inactive components
foreach(var obj in GetComponentsInChildren<Transform>(true))
{
    obj.gameObject.SetActive(true);
}

это, конечно, не очень эффективно;)

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