Unity重新加载场景后触发InputAction出现MissingReferenceException异常
问题根因
异常由旧场景中已销毁的玩家组件残留回调触发,和新场景内的有效对象无关。你在首次加载场景时注册了InputAction的
started阶段回调,场景卸载时没有主动解绑该回调,输入系统的事件列表会同时保留旧回调和新场景加载后重新注册的新回调。触发输入时旧回调先执行,访问已经被销毁的Rigidbody2D抛出异常;后续新回调正常执行,所以实际功能不受影响。
修复方案
- 将所有InputAction、PlayerInput的事件订阅逻辑从
Awake/Start方法移到OnEnable中,同时在OnDisable中编写对应的解绑逻辑,示例代码如下:
private void OnEnable() { // 单Action订阅示例 yourMoveAction.started += OnMoveStart; // PlayerInput全局事件订阅示例 GetComponent<PlayerInput>().onActionTriggered += OnInputTriggered; } private void OnDisable() { // 必须和订阅逻辑一一对应解绑 yourMoveAction.started -= OnMoveStart; GetComponent<PlayerInput>().onActionTriggered -= OnInputTriggered; }
- 如果PlayerInput当前使用
Send Messages/Broadcast Messages通知模式,切换为Invoke Unity Events模式,手动管理事件的订阅和解绑,避免消息自动发送到已销毁的对象上。 - 若项目中设置了Input Action Asset加载不销毁,注意不要重复创建实例、重复注册回调。
- 临时兜底方案:在所有InputAction回调开头先判断Rigidbody2D是否为空,非空再执行业务逻辑,可以直接屏蔽报错,但没有解决回调残留的根因:
private void OnMoveStart(InputAction.CallbackContext context) { if(rb == null) return; // 原有业务逻辑 }
内容的提问来源于stack exchange,提问作者jordanmccollam
相关产品推荐
相关产品推荐

