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
相关产品推荐
相关产品推荐

