C# 如何找到层次结构中的所有ui文本组件,然后禁用/启用它们?

C# 如何找到层次结构中的所有ui文本组件,然后禁用/启用它们?,c#,unity3d,C#,Unity3d,现在,我创建了文本数组,然后在编辑器中一个接一个地拖动到检查器的数组中。 问题是一些文本ui是childs或childs的childs,要逐个找到它们并不容易 如何循环层次结构或查找所有文本ui,然后禁用/启用它们 我需要它来暂停/恢复比赛 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngi

现在,我创建了文本数组,然后在编辑器中一个接一个地拖动到检查器的数组中。 问题是一些文本ui是childs或childs的childs,要逐个找到它们并不容易

如何循环层次结构或查找所有文本ui,然后禁用/启用它们

我需要它来暂停/恢复比赛

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class BackToMainMenu : MonoBehaviour
{
    public Text[] uiTexts;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            if (Time.timeScale == 0)
            {
                SceneManager.UnloadSceneAsync(0);
                DisableEnableUiTexts(false);
                Cursor.visible = false;
                Time.timeScale = 1;
            }
            else
            {
                Time.timeScale = 0;
                MenuController.LoadSceneForSavedGame = false;
                DisableEnableUiTexts(true);
                SceneManager.LoadScene(0, LoadSceneMode.Additive);
                Cursor.visible = true;
            }
        }
    }

    private void DisableEnableUiTexts(bool uiTextEnabled)
    {
        if (uiTexts.Length > 0)
        {
            foreach (Text ui in uiTexts)
            {
                if (uiTextEnabled)
                {
                    ui.GetComponent<Text>().enabled = false;
                }
                else
                {
                    ui.GetComponent<Text>().enabled = true;
                }
            }
        }
    }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
使用UnityEngine.SceneManagement;
使用UnityEngine.UI;
公共类BacktoMinMenu:MonoBehavior
{
公共文本[]uiTexts;
//在第一帧更新之前调用Start
void Start()
{
}
//每帧调用一次更新
无效更新()
{
if(Input.GetKeyDown(KeyCode.Escape))
{
如果(Time.timeScale==0)
{
SceneManager.UnloadSceneAsync(0);
禁用文本(false);
Cursor.visible=false;
Time.timeScale=1;
}
其他的
{
Time.timeScale=0;
MenuController.LoadSceneForSavedGame=false;
禁用bleuitexts(true);
SceneManager.LoadScene(0,LoadSceneMode.Additional);
Cursor.visible=true;
}
}
}
私有void disableuitexts(bool uitextabled)
{
如果(uiTexts.Length>0)
{
foreach(uiTexts中的文本ui)
{
如果(可扩展)
{
ui.GetComponent().enabled=false;
}
其他的
{
ui.GetComponent().enabled=true;
}
}
}
}
}
更新:

我试过这个:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class BackToMainMenu : MonoBehaviour
{
    [ContextMenuItem("Fetch", nameof(FetchAllTexts))]
    public Text[] uiTexts;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            if (Time.timeScale == 0)
            {
                SceneManager.UnloadSceneAsync(0);
                DisableEnableUiTexts(false);
                Cursor.visible = false;
                Time.timeScale = 1;
            }
            else
            {
                Time.timeScale = 0;
                MenuController.LoadSceneForSavedGame = false;
                DisableEnableUiTexts(true);
                SceneManager.LoadScene(0, LoadSceneMode.Additive);
                Cursor.visible = true;
            }
        }
    }

    private void FetchAllTexts()
    {
        var tmp = new List<Text>();
        for (var i = 0; i < SceneManager.sceneCount; i++)
        {
            foreach (var root in SceneManager.GetSceneAt(i).GetRootGameObjects())
            {
                tmp.AddRange(root.GetComponentsInChildren<Text>(true));
            }
        }
        Text[] texts = tmp.ToArray();

        uiTexts = texts;
    }

    private void DisableEnableUiTexts(bool uiTextEnabled)
    {
        if (uiTexts.Length > 0)
        {
            foreach (Text ui in uiTexts)
            {
                ui.enabled = uiTextEnabled;
            }
        }
    }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
使用UnityEngine.SceneManagement;
使用UnityEngine.UI;
公共类BacktoMinMenu:MonoBehavior
{
[ContextMenuItem(“Fetch”,nameof(fetchAllText))]
公共文本[]uiTexts;
//在第一帧更新之前调用Start
void Start()
{
}
//每帧调用一次更新
无效更新()
{
if(Input.GetKeyDown(KeyCode.Escape))
{
如果(Time.timeScale==0)
{
SceneManager.UnloadSceneAsync(0);
禁用文本(false);
Cursor.visible=false;
Time.timeScale=1;
}
其他的
{
Time.timeScale=0;
MenuController.LoadSceneForSavedGame=false;
禁用bleuitexts(true);
SceneManager.LoadScene(0,LoadSceneMode.Additional);
Cursor.visible=true;
}
}
}
私有void FetchAllTexts()
{
var tmp=新列表();
对于(变量i=0;i0)
{
foreach(uiTexts中的文本ui)
{
ui.enabled=ui可扩展;
}
}
}
}
但我在任何地方都看不到“获取”上下文菜单项。已尝试右键单击层次结构中脚本附加到的对象已尝试在编辑器菜单中尝试的资源中尝试,但它不在那里。

如前所述,使用

它迭代所有加载的场景,并获取所有当前处于非活动或禁用状态的实例


然后,您可以在
Start
中或甚至更早地通过Inspector本身获取此一次,这样您就不必在每次应用程序启动时都执行此操作

为什么这是件好事?如前所述,您不必每次都在
Start
中启动,从而将应用程序的启动延迟到完成

相反,您已经通过Inspector将所有引用存储在一个序列化字段中,因此当您的应用程序启动时,该组件已经“知道”这些引用,您不必首先获取它们

只需右键单击Inspector中的
uiTexts
字段,然后点击
Fetch


一般来说,你只需要写

private void DisableEnableUiTexts(bool uiTextEnabled)
{
    foreach (Text ui in uiTexts)
    {
        ui.enabled = uiTextEnabled;
    }
}

FindObjectsOfType()将以文本[]的形式返回场景中的所有活动文本对象。我在任何地方都看不到“Fetch”ContextMenuItem。已尝试在层次结构中的对象上单击鼠标右键,脚本将附加到该对象上。在编辑器菜单中尝试的资产中,该对象不存在。右键单击检查器中的字段
uiTexts
)我必须在uitext的inspector中创建一个空的数组字段,然后右键单击该空字段,给出Fetch选项。仅仅在用户界面上输入文本是行不通的。不管怎样,工作得很好谢谢,哦,对不起。。忘记了Inspector中数组字段的Unity hickup ^^^或者,您也可以标记方法本身
[ContextMenu(“Fetch text”)]
,然后在Inspector中打开组件的上下文菜单并在那里找到它;)如果这回答了你的问题,请随意接受答案
var tmp = new List<Text>();
for(var i = 0; i < SceneManager.sceneCount; i++)
{
    foreach(var root in SceneManager.GetSceneAt(i).GetRootGameObjects)
    {
        tmp.AddRange(root.GetComponentsInChildren<Text>(true));
    }
}
Text[] texts = tmp.ToArray();
public class BackToMainMenu : MonoBehaviour
{
    [ContextMenuItem("Fetch", nameof(FetchAllTexts)]
    public Text[] uiTexts;

    private void FetchAllTexts()
    {
        uiTexts = // One of the methods shown above
    }

    ...
}
private void DisableEnableUiTexts(bool uiTextEnabled)
{
    foreach (Text ui in uiTexts)
    {
        ui.enabled = uiTextEnabled;
    }
}