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

Unity开发首个游戏实现房间跳转时触发NullReferenceException报错

报错原因

你遇到的两个NullReferenceException报错均由cam变量未成功初始化导致:

  1. Start方法第14行报错:执行Camera.main.GetComponent<CameraMovement>()时没有拿到有效对象
  2. OnTriggerEnter2D方法第26行报错:调用cam.minPosition时cam为空

触发该问题的两种常见场景:

  • 场景中不存在标记为MainCamera标签的激活态相机,Camera.main返回空
  • 主相机上没有挂载CameraMovement脚本,GetComponent调用返回空

修复步骤

  1. 检查主相机标签设置
    选中你的场景主视角相机,查看Inspector面板顶部的Tag字段,确认已设置为MainCamera,同时相机对象处于激活状态(名称左侧的勾选框为选中状态)。

  2. 检查脚本挂载状态
    选中主相机,查看Inspector面板的组件列表,确认已经挂载了你自定义的CameraMovement脚本。如果没有挂载,直接将脚本拖到Inspector面板,或者点击Add Component搜索脚本名称添加即可。

  3. 可选:添加空判断避免后续崩溃
    你可以修改代码增加防御性判断,同时添加错误日志方便后续定位问题:

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class RoomMove : MonoBehaviour
{
    public Vector2 cameraChangeMax;
    public Vector2 cameraChangeMin;
    public Vector3 playerChange;
    private CameraMovement cam;
    
    // Start is called before the first frame update
    void Start()
    {
        if (Camera.main != null)
        {
            cam = Camera.main.GetComponent<CameraMovement>();
        }
        if (cam == null)
        {
            Debug.LogError("主相机未挂载CameraMovement脚本,请检查场景设置", this);
        }
    }

    private void OnTriggerEnter2D(Collider2D player)
    {
        if (cam == null) return;
        if (player.CompareTag("Player"))
        {
            cam.minPosition += cameraChangeMin;
            cam.maxPosition += cameraChangeMax;
            player.transform.position += playerChange;
        }
    }
}

额外排查提示(如果修复空引用后功能仍不触发)

  • 确认你挂载了RoomMove脚本的碰撞体对象,已经在Inspector面板勾选了碰撞体组件的Is Trigger选项
  • 确认玩家对象上同时挂载了Collider2D组件和Rigidbody2D组件(Unity2D的触发检测要求至少碰撞双方有一方携带Rigidbody2D)

内容的提问来源于stack exchange,提问作者Seven X Twelve

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:24:03