Unity开发首个游戏实现房间跳转时触发NullReferenceException报错
报错原因
你遇到的两个NullReferenceException报错均由cam变量未成功初始化导致:
Start方法第14行报错:执行Camera.main.GetComponent<CameraMovement>()时没有拿到有效对象OnTriggerEnter2D方法第26行报错:调用cam.minPosition时cam为空
触发该问题的两种常见场景:
- 场景中不存在标记为
MainCamera标签的激活态相机,Camera.main返回空 - 主相机上没有挂载
CameraMovement脚本,GetComponent调用返回空
修复步骤
检查主相机标签设置
选中你的场景主视角相机,查看Inspector面板顶部的Tag字段,确认已设置为MainCamera,同时相机对象处于激活状态(名称左侧的勾选框为选中状态)。检查脚本挂载状态
选中主相机,查看Inspector面板的组件列表,确认已经挂载了你自定义的CameraMovement脚本。如果没有挂载,直接将脚本拖到Inspector面板,或者点击Add Component搜索脚本名称添加即可。可选:添加空判断避免后续崩溃
你可以修改代码增加防御性判断,同时添加错误日志方便后续定位问题:
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
相关产品推荐
相关产品推荐

