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

Unity开发2D Undertale风格游戏时数组传递报错求助

解决Undertale风格2D游戏中EnemyList数组跨场景传递的问题

问题根源分析

你的代码存在4个核心错误,导致数组传递失败:

  1. 数组初始化语法错误:C#中不能直接用{}给已声明的数组赋值,必须显式创建数组实例
  2. 碰撞回调函数名称错误:Unity的2D碰撞回调函数是OnCollisionEnter2D,你写的CollisionEnter2D缺少前缀On,导致函数不会被触发
  3. DataHolder缺少跨场景持久化处理:未添加DontDestroyOnLoad,场景切换后对象会被销毁,导致GameObject.Find找不到目标
  4. 空引用风险:未对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 18:23:26