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

