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

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类的实现类型选对应改法即可:

  1. Card为MonoBehaviour子类时的正确实例化逻辑:
public void LoadDeck()
{
    // 先创建承载组件的GameObject
    GameObject cardCarrier = new GameObject("DeckCard");
    // 合法挂载Card组件
    Card newCard = cardCarrier.AddComponent<Card>();
    newCard.UpdateCardState(CardState.DECK);
    _deckCards.Add(newCard);
}
  1. Card为ScriptableObject子类时的正确实例化逻辑:
public void LoadDeck()
{
    Card newCard = ScriptableObject.CreateInstance<Card>();
    newCard.UpdateCardState(CardState.DECK);
    _deckCards.Add(newCard);
}
  1. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 07:45:44