Unity检视面板中动态创建的Card实例为何显示为None
问题根因
该问题由Unity序列化系统规则和对象实例化方式不匹配导致,对应两种常见情况:
- 若
Card类继承自UnityEngine.Object(含MonoBehaviour、ScriptableObject等Unity原生类型子类):
这类对象禁止直接用new关键字实例化。MonoBehaviour必须依附GameObject存在,只能通过AddComponent<Card>()创建;ScriptableObject作为数据资产类,只能通过ScriptableObject.CreateInstance<Card>()创建。用new生成的这类对象脱离Unity对象生命周期管理,序列化系统无法识别为合法引用,Inspector中就会显示为None。 - 若
Card是不继承UnityEngine.Object的普通C#自定义类:
自定义普通类默认不被Unity序列化系统识别,必须给类定义添加[System.Serializable]特性,否则序列化系统无法解析列表内的自定义类实例,列表条目就会显示为空。
对应修复方案
根据你Card类的实现类型选对应改法即可:
- Card为MonoBehaviour子类时的正确实例化逻辑:
public void LoadDeck() { // 先创建承载组件的GameObject GameObject cardCarrier = new GameObject("DeckCard"); // 合法挂载Card组件 Card newCard = cardCarrier.AddComponent<Card>(); newCard.UpdateCardState(CardState.DECK); _deckCards.Add(newCard); }
- Card为ScriptableObject子类时的正确实例化逻辑:
public void LoadDeck() { Card newCard = ScriptableObject.CreateInstance<Card>(); newCard.UpdateCardState(CardState.DECK); _deckCards.Add(newCard); }
- Card为普通C#类时,先给类添加序列化特性:
using System; using UnityEngine; // 添加该特性标记类可被Unity序列化 [Serializable] public class Card { private CardState _currentState; public void UpdateCardState(CardState targetState) { _currentState = targetState; } }
注意:用普通C#类+
[Serializable]实现时,列表中存储的是类实例的序列化副本而非引用,后续修改列表内某张卡牌的属性时,不会同步修改其他位置持有的同个Card对象,需要根据实际业务需求选择实现方式。
内容的提问来源于stack exchange,提问作者Rokugatsu29
相关产品推荐
相关产品推荐

