You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建TMP_Text变量列表并通过索引调用?

动态调用TMP_Text的解决方案

这种通过列表索引调用TMP_Text的方式完全可行,你之前失败大概率是初始化时机不对、变量未赋值或索引越界导致的。下面是正确的实现步骤和替代方案:

一、正确的列表实现方式

先确保单个TMP_Text变量已正确赋值,再在合适的生命周期函数中初始化列表,同时加入索引合法性检查避免报错:

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

public class TextManager : MonoBehaviour
{
    // 声明单个文本变量,通过Inspector拖拽赋值
    [SerializeField] private TMP_Text Text1;
    [SerializeField] private TMP_Text Text2;
    [SerializeField] private TMP_Text Text3;
    [SerializeField] private TMP_Text Text4;
    [SerializeField] private TMP_Text Text5;
    [SerializeField] private TMP_Text Text6;
    [SerializeField] private TMP_Text Text7;

    public List<TMP_Text> ExampleTexts = new List<TMP_Text>();

    private void Awake()
    {
        // 在Awake/Start中初始化列表,保证单个变量已完成赋值
        ExampleTexts.AddRange(new[] { Text1, Text2, Text3, Text4, Text5, Text6, Text7 });
    }

    public void ExampleFunction(int i)
    {
        // 检查索引是否在合法范围内
        if (i >= 0 && i < ExampleTexts.Count)
        {
            ExampleTexts[i].text = i.ToString("0");
        }
        else
        {
            Debug.LogError($"索引{i}超出列表范围,列表当前元素数量:{ExampleTexts.Count}");
        }
    }
}

常见失败原因排查

  • 变量未赋值:检查Inspector面板中,Text1~Text7是否已拖拽对应TMP_Text组件;若变量是private,需加[SerializeField]才能在Inspector显示。
  • 初始化时机错误:不要在字段声明时直接初始化列表(如public List<TMP_Text> ExampleTexts = new List<TMP_Text>{Text1,...};),此时Unity还未完成组件赋值,列表元素会是null。
  • 索引越界:调用ExampleFunction时,传入的i必须满足0 ≤ i < 7,否则会触发空引用或索引越界错误。

二、其他动态调用方案

1. 自动获取子物体的TMP_Text

如果7个文本都是当前物体的子物体,可通过代码自动获取,无需手动拖拽:

private void Awake()
{
    // 获取所有子物体(包括禁用的)的TMP_Text组件,按Hierarchy顺序加入列表
    TMP_Text[] textComponents = GetComponentsInChildren<TMP_Text>(true);
    ExampleTexts.AddRange(textComponents);
    // 若需指定顺序,可给子物体添加排序组件或按名称排序后再加入列表
}

2. 使用字典按名称调用

如果需要按文本名称而非索引调用,可使用Dictionary:

private Dictionary<string, TMP_Text> textDictionary = new Dictionary<string, TMP_Text>();

private void Awake()
{
    textDictionary.Add("Text1", Text1);
    textDictionary.Add("Text2", Text2);
    // 依次添加剩余文本
}

// 调用示例
public void UpdateText(string textName, string content)
{
    if (textDictionary.TryGetValue(textName, out var textComponent))
    {
        textComponent.text = content;
    }
    else
    {
        Debug.LogError($"未找到名为{textName}的TMP_Text组件");
    }
}

内容的提问来源于stack exchange,提问作者Cinnabar Brenneka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 03:33:26