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

Unity中为预制体赋值GameObject/TMP文本时出现类型不匹配错误

解决Unity预制体公共列表赋值时的"Type Mismatch"错误

问题核心原因

预制体是存储在Project面板的项目资源,而场景中的TMP文本框是场景实例对象。Unity不允许预制体直接绑定场景中的对象引用——强行赋值会触发类型不匹配错误,且保存预制体后场景对象的引用会直接丢失,因为预制体无法持久化引用场景内的实例。你之前尝试的直接给预制体列表赋值场景文本框,本质上违反了Unity资源与场景实例的引用规则。

修复方案

方案1:通过场景管理器动态传递UI引用

避免预制体直接依赖场景UI,改为在实例化预制体后,由场景内的管理器脚本传递UI列表:

1.1 修改OreMiner脚本

移除原有的SetOre引用,新增外部初始化UI的方法:

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

public class OreMiner : MonoBehaviour
{
    public float miningRate = 1.0f; // 每秒挖矿数量
    public List<string> oreTags; // 矿石类型标签列表
    public List<TMP_Text> oreCountTexts; // UI文本列表
    private Dictionary<string, int> totalOres = new Dictionary<string, int>();

    void Start()
    {
        // 初始化矿石计数
        foreach (string tag in oreTags)
        {
            totalOres[tag] = 0;
        }
        StartCoroutine(MineOres());
    }

    // 新增:外部传入UI文本列表的初始化方法
    public void InitializeOreUI(List<TMP_Text> uiTexts)
    {
        if (uiTexts == null || uiTexts.Count != oreTags.Count)
        {
            Debug.LogError("UI文本列表数量与矿石标签数量不匹配");
            return;
        }
        oreCountTexts = uiTexts;
    }

    IEnumerator MineOres()
    {
        while (true)
        {
            yield return new WaitForSeconds(1.0f / miningRate);
            CollectOres();
        }
    }

    void CollectOres()
    {
        foreach (string oreTag in oreTags)
        {
            Collider[] oresInRange = Physics.OverlapBox(transform.position, transform.localScale / 2, Quaternion.identity, LayerMask.GetMask(oreTag));
            foreach (var ore in oresInRange)
            {
                totalOres[oreTag]++;
                Destroy(ore.gameObject);
            }
        }
        UpdateUI();
    }

    void UpdateUI()
    {
        if (oreCountTexts == null || oreCountTexts.Count != oreTags.Count)
        {
            Debug.LogError("UI文本列表未正确初始化");
            return;
        }
        for (int i = 0; i < oreTags.Count; i++)
        {
            string oreTag = oreTags[i];
            oreCountTexts[i].text = $"{oreTag} Collected: {totalOres[oreTag]}";
        }
    }
}

1.2 创建场景管理器脚本

挂载到场景空对象上,负责实例化预制体并传递UI引用:

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

public class OreUIManager : MonoBehaviour
{
    public SetOreCountTexts oreUITexts; // 绑定场景中存储UI列表的对象
    public OreMiner oreMinerPrefab; // 绑定你的挖矿机预制体
    private OreMiner spawnedMiner;

    void Start()
    {
        // 实例化预制体
        spawnedMiner = Instantiate(oreMinerPrefab);
        // 传递UI文本列表
        spawnedMiner.InitializeOreUI(oreUITexts.textList);
    }
}

方案2:运行时动态查找UI(无需管理器)

给每个TMP文本设置统一命名规则(比如OreIronText对应Iron标签),让预制体实例在运行时自动查找:

// 修改OreMiner的Start方法
void Start()
{
    oreCountTexts = new List<TMP_Text>();
    foreach (string tag in oreTags)
    {
        totalOres[tag] = 0;
        // 根据命名规则查找UI文本
        TMP_Text text = GameObject.Find($"Ore{tag}Text")?.GetComponent<TMP_Text>();
        if (text != null)
        {
            oreCountTexts.Add(text);
        }
        else
        {
            Debug.LogError($"未找到对应{tag}的UI文本,请检查命名");
        }
    }
    StartCoroutine(MineOres());
}

操作步骤

  1. 清空预制体OreMiner组件中所有场景对象的引用(包括SetOre和oreCountTexts)
  2. 按照上述方案修改脚本
  3. 在场景中配置管理器或UI命名,运行测试

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 11:12:03