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

Unity实例化预制体时触发NullReferenceException问题求助

Unity中Instantiate预制体触发NullReferenceException,但预制体确认非空

我查遍了Stack Overflow和Unity论坛的相关帖子,还是没找到代码报错的原因。多次检查预制体变量,确认card和characterModel100%非空——对应的两条Debug.Log语句都没执行,而且能正常从这两个预制体获取基础数据。另外cardGameObject和characterGameObject是在触发报错的行里初始化的,不可能为空。

代码实现

public void EnterCombat()
{
    card = Resources.Load<GameObject>("Prefabs/Card");
    characterModel = Resources.Load<GameObject>("Prefabs/Character");
    if(card == null)
        Debug.Log("Null Card");
    if(characterModel == null)
        Debug.Log("Null Character");
    GCC = encounter._GCC;
    // ***TEMP***
    DeckManager.SetActiveIndex(0);
    DeckManager.SetCrew(new DeckManager.Deck(new CharacterSO[] {Resources.Load<CharacterSO>("ScriptableObjects/Characters/Temp1"), Resources.Load<CharacterSO>("ScriptableObjects/Characters/Temp2"), Resources.Load<CharacterSO>("ScriptableObjects/Characters/Temp4"), null}), 0);
    // ***TEMP***
    buttons = new bool[]{false, false, false, false};
    for(int i = 3; i <= 10; i++)
            transform.GetChild(i).gameObject.SetActive(false);
    foreach(CharacterSO character in DeckManager.GetActiveCrew().GetCrew())
        if(character != null)
            InstantiateMember(character, true, true, true);
    foreach(CharacterSO character in encounter.GetFirstWave())
        if(character != null)
            InstantiateMember(character, false, false, true);
    GCC.StartTurnSubscription(OnNewTurn);
    GCC.EndTurnSubscription(OnTurnEnd);
    GCC.EndCombatSubscription(OnCombatEnd);
    GCC.JoinCombatSubscription(OnJoiningCombat);
    GCC.StartCombat(this, encounter);
}

private void InstantiateMember(CharacterSO character, bool allied, bool control, bool isCombatStart)
{
    GameObject cardGameObject = Instantiate(card);
    cardGameObject.GetComponent<CardDataImplementor>().Character = character;
    cardGameObject.transform.SetParent(gameObject.transform);
    cardGameObject.GetComponent<ObjectCombatManager>().IsAllied = allied;
    cardGameObject.GetComponent<ObjectCombatManager>().PlayerControl = control;
    cardGameObject.GetComponent<ObjectCombatManager>()._GCC = GCC;
    cardGameObject.GetComponent<CardDataImplementor>()._GCC = GCC;
    GameObject characterGameObject = Instantiate(characterModel);
    cardGameObject.GetComponent<ObjectCombatManager>().CharacterObject = characterGameObject;
    characterGameObject.transform.SetParent(gameObject.transform);
    characterGameObject.GetComponent<CardToCharacter>().Card = cardGameObject;
    characterGameObject.GetComponent<CardToCharacter>()._GCC = GCC;
    characterGameObject.transform.localScale = new UnityEngine.Vector3(40f, 40f, 1f);
    UnityEngine.Vector3 vector = (allied ? alliedAmount : enemyAmount) switch
    {
        0 => new UnityEngine.Vector3(460f * (allied ? 1f : -1f), -15f, 0f),
        1 => new UnityEngine.Vector3(350f * (allied ? 1f : -1f), 125f, 0f),
        2 => new UnityEngine.Vector3(230f * (allied ? 1f : -1f), -15f, 0f),
        3 => new UnityEngine.Vector3(120f * (allied ? 1f : -1f), 125f, 0f),
        _ => UnityEngine.Vector3.zero
    };
    characterGameObject.transform.SetLocalPositionAndRotation(vector, UnityEngine.Quaternion.identity);
    characterGameObject.GetComponent<SpriteRenderer>().sprite = cardGameObject.GetComponent<CardDataImplementor>().Character.CharacterArt;
    if(allied)
        alliedAmount++;
    else
        enemyAmount++;
    if(!isCombatStart)
    {
        characterGameObject.GetComponent<CardToCharacter>().EnterCombat();
        cardGameObject.GetComponent<ObjectCombatManager>().EnterCombat();
        cardGameObject.GetComponent<CardDataImplementor>().EnterEvents();
    }
}

报错位置

NullReferenceException触发在以下两行:

GameObject cardGameObject = Instantiate(card);
GameObject characterGameObject = Instantiate(characterModel);

补充信息

  • 预制体确实存在于Resources/Prefabs文件夹中,附文件夹截图证明
  • 尝试将预制体改为[SerializeField]并从编辑器拖拽赋值,问题依然存在
  • 代码原本运行正常,修改了一个完全无关的类后突然出现崩溃
  • 已经查看过相关排查线程,但无法解决问题,确认指针和预制体均非空

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 11:27:41