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

Unity卡牌开发问题:通过类传递GameObject时提示对象不存在

问题分析与解决方案

从你提供的代码和描述来看,导致Unity提示“对象不存在”的核心问题集中在以下几点:


1. HandManagement类的预制体变量未赋值

你在HandManagement中声明了public GameObject tile;,但如果没有在Unity Inspector面板中给这个变量拖入有效的卡牌预制体,执行Instantiate(tile)时会因为tile为空引用而抛出“对象不存在”的错误。Instantiate必须传入一个已存在的GameObject预制体才能正常工作。

2. Tile脚本中的HandManagement实例未引用

Tile脚本里的tileInHand是HandManagement类型的变量,如果没有在Inspector中将挂载了HandManagement脚本的GameObject拖给这个变量,调用tileInHand.PickTile()时会因为tileInHand为空而触发“对象引用未设置到对象实例”的错误(也就是你看到的“对象不存在”)。

3. 方法名与描述不匹配(潜在逻辑偏差)

你描述中说调用的是AddToHand方法,但实际代码里Tile脚本调用的是PickTile,且HandManagement类中也没有定义AddToHand方法。虽然这不是当前报错的直接原因,但会导致你的逻辑描述与实际代码不符,需要统一方法名或调整调用逻辑。

4. Instantiate后的变量覆盖问题

当前HandManagement中tile = Instantiate(tile);这行代码会把原始预制体的引用覆盖为实例化后的对象,下次调用PickTile时,如果没有重新给tile赋值预制体,会再次引发空引用错误。


修正后的示例代码

Tile脚本修正

public HandManagement tileInHand; // 需在Inspector中拖入HandManagement实例
private Collider m_ObjectCollider;

void Awake()
{
    m_ObjectCollider = GetComponent<Collider>();
    m_ObjectCollider.isTrigger = true;
}

// 鼠标按下检测逻辑
void OnMouseDown()
{
    string tileName = gameObject.name; // 替换为你的tile名称获取逻辑
    tileInHand.PickTile(tileName);
}

HandManagement脚本修正

public GameObject tilePrefab; // 改为预制体变量,在Inspector拖入卡牌预制体
public List<GameObject> hand = new List<GameObject>();

public void PickTile(string pickedTile)
{
    Debug.Log("picked");
    
    // 提前判断预制体是否赋值
    if (tilePrefab == null)
    {
        Debug.LogError("tilePrefab未赋值,请在Inspector中设置卡牌预制体");
        return;
    }
    
    GameObject newTile = Instantiate(tilePrefab);
    newTile.transform.SetParent(transform, false);
    newTile.name = pickedTile; // 设置实例化对象的名称
    hand.Add(newTile);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 03:05:28