Unity开发2D Undertale风格游戏时数组传递报错求助
解决Undertale风格2D游戏中EnemyList数组跨场景传递的问题
问题根源分析
你的代码存在4个核心错误,导致数组传递失败:
- 数组初始化语法错误:C#中不能直接用
{}给已声明的数组赋值,必须显式创建数组实例 - 碰撞回调函数名称错误:Unity的2D碰撞回调函数是
OnCollisionEnter2D,你写的CollisionEnter2D缺少前缀On,导致函数不会被触发 - DataHolder缺少跨场景持久化处理:未添加
DontDestroyOnLoad,场景切换后对象会被销毁,导致GameObject.Find找不到目标 - 空引用风险:未对
GameObject.Find和GetComponent的返回值做判空检查,容易触发空引用异常
修正后的完整代码
EnemyScript 修正版
using System.Collections; using System.Collections.Generic; using UnityEngine; public class EnemyScript : MonoBehaviour { public int spears; public int axes; public int wizard; public int[] EnemyList; DataHolderScript dataHolder; // 直接持有脚本引用,减少重复GetComponent调用 void Start() { // 修正数组初始化方式 EnemyList = new int[] { spears, axes, wizard }; // 查找DataHolder并获取脚本引用,添加判空处理 GameObject holderObj = GameObject.Find("DataHolder"); if (holderObj != null) { dataHolder = holderObj.GetComponent<DataHolderScript>(); } else { Debug.LogError("找不到DataHolder对象,请检查场景中是否存在该对象"); } } // 修正碰撞函数名称:添加On前缀 void OnCollisionEnter2D(Collider2D other) { // 判空后再执行赋值操作 if (dataHolder != null && EnemyList != null) { dataHolder.enemies = EnemyList; Debug.Log("EnemyList已成功传递到DataHolder"); } else { Debug.LogError("无法传递EnemyList:DataHolder或EnemyList为空"); } } }
DataHolderScript 修正版(添加跨场景持久化)
using System.Collections; using System.Collections.Generic; using UnityEngine; public class DataHolderScript : MonoBehaviour { public int[] enemies; void Awake() { // 确保对象跨场景持久化 DontDestroyOnLoad(gameObject); // 可选:防止重复创建多个DataHolder实例 if (FindObjectsOfType<DataHolderScript>().Length > 1) { Destroy(gameObject); } } }
额外注意事项
- 确保场景中的DataHolder对象已添加
DataHolderScript脚本,且对象名称严格为"DataHolder"(和GameObject.Find的参数一致) - 碰撞触发条件:两个碰撞体中至少有一个带有
Rigidbody2D组件,且碰撞体的Is Trigger未勾选(如果用触发器逻辑,需改用OnTriggerEnter2D函数) - 如果
spears/axes/wizard的数值会在运行时改变,需要在碰撞触发前重新初始化EnemyList数组,避免传递旧值
内容的提问来源于stack exchange,提问作者Tinnmy Skyewalker
相关产品推荐
相关产品推荐

