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

Unity中如何将Text拖入列表?井字棋开发拖拽问题排查

井字棋开发问题:无法将Text对象拖入MainController列表

问题背景

我正在跟着教程开发Unity井字棋游戏,在教程的图41步骤卡住了,需要把Text对象拖进MainController的space_list列表里,但遇到了以下问题:

  • SpaceText是不是必须变成蓝色才能拖拽到列表里?怎么解决?
  • SpaceText没法拖拽到Assets文件夹里。

补充:进入SpaceText预制体模式后拖拽到Assets的情况(附截图)

相关截图

  • 拖拽问题截图1:拖拽问题截图1
  • 拖拽问题截图2:拖拽问题截图2
  • 预制体拖拽后截图:预制体拖拽后截图

相关代码

Space.cs

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

public class Space : MonoBehaviour
{
    public Button button;
    public Text button_text;
    private MainController main_controller;

    public void SetControllerReference(MainController control)
    {
        main_controller = control;
    }

    public void SetSpace()
    {
        button_text.text = main_controller.GetSide();
        button.interactable = false;
        main_controller.EndTurn();
    }
}

MainController.cs

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

public class MainController : MonoBehaviour
{

    public TextMeshProUGUI[] space_list;
    public GameObject game_over_panel;
    public TextMeshProUGUI game_over_text;
    public GameObject restart_button;
    private string side;
    private int moves;
    
    void Start()
    {
        SetMainControllerReferenceForButtons();
        side = "X";
        game_over_panel.SetActive(false);
        moves = 0;
        restart_button.SetActive(false);
    }

    
    void SetMainControllerReferenceForButtons()
    {
        for (int i = 0; i < space_list.Length; i++){
            space_list[i].GetComponentInParent<Space>().SetControllerReference(this);
        }
    }

    public string GetSide()
    {
        return side;
    }

    void ChangeSide()
    {
        if (side == "X")
        {
            side = "O";
        } else {
            side = "X";
        }
    }

    public void EndTurn()
    {
        moves++;
        if (space_list[0].text == side && space_list[1].text == side && space_list[2].text == side)
        {
            GameOver();
        }
        else if (space_list[3].text == side && space_list[4].text == side && space_list[5].text == side)
        {
            GameOver();
        }
        else if (space_list[6].text == side && space_list[7].text == side && space_list[8].text == side)
        {
            GameOver();
        }
        else if (space_list[0].text == side && space_list[3].text == side && space_list[6].text == side)
        {
            GameOver();
        }
        else if (space_list[1].text == side && space_list[4].text == side && space_list[7].text == side)
        {
            GameOver();
        }
        else if (space_list[2].text == side && space_list[5].text == side && space_list[8].text == side)
        {
            GameOver();
        }
        else if (space_list[0].text == side && space_list[4].text == side && space_list[8].text == side)
        {
            GameOver();
        }
        else if (space_list[2].text == side && space_list[4].text == side && space_list[6].text == side)
        {
            GameOver();
        }

        if (moves >= 9)
        {
            game_over_panel.SetActive(true);
            game_over_text.text = "平局";
            restart_button.SetActive(true);
        }
        ChangeSide();
    }

    void GameOver()
    {
        game_over_panel.SetActive(true);
        game_over_text.text = side + " 获胜!";
        restart_button.SetActive(true);
        for (int i = 0; i < space_list.Length; i++)
        {
            SetInteractable(false);
        }
    }

    void SetInteractable(bool setting)
    {
        for (int i = 0; i < space_list.Length; i++)
        {
            space_list[i].GetComponentInParent<Button>().interactable = setting;
        }
    }

    public void Restart()
    {
        side = "X";
        moves = 0;
        game_over_panel.SetActive(false);
        SetInteractable(true);
        restart_button.SetActive(false);
        for (int i = 0; i < space_list.Length; i++)
        {
            space_list[i].text = "";
        }
    }
}

解决方案

1. SpaceText拖拽到列表的问题

不需要把SpaceText变成蓝色(蓝色代表预制体),直接拖拽Hierarchy面板中每个SpaceText实例到MainController的space_list列表里即可。教程里的蓝色是指预制体,但实际操作中,你只需要将场景中的Text对象拖入,因为space_list是TextMeshProUGUI[]类型,只要对象带有该组件就能拖入。

如果拖不进去,检查以下两点:

  • 确认SpaceText对象上挂载的是TextMeshProUGUI组件,而非普通Text组件(你的MainController定义的是TextMeshProUGUI[],但Space.cs里用的是Text button_text,类型不匹配,建议统一成TextMeshProUGUI避免后续报错)。
  • 选中MainController对象,在Inspector面板展开space_list,将列表长度调整为9,再逐个拖入Hierarchy中的SpaceText。

2. SpaceText无法拖拽到Assets的问题

只有预制体才能拖入Assets文件夹。正确制作预制体的步骤是:

  • 在Hierarchy中选中SpaceText(或包含Button和Text的整个Space父对象)。
  • 直接拖到Assets文件夹,无需进入预制体模式——进入预制体模式是编辑内容,此时无法再拖入Assets。
  • 从截图看你已成功创建预制体,现在可以将场景中的SpaceText替换为预制体实例,再把这些实例的Text组件拖入MainController的列表。

额外注意:组件类型匹配

代码里存在组件类型不匹配问题:

  • MainController的space_list是TextMeshProUGUI[],但Space.cs里的button_text是Text类型。如果你的UI用的是TextMeshPro,建议把Space.cs里的button_text改成TextMeshProUGUI,并在Inspector中重新指定组件,避免运行时找不到组件的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:45:32