Unity开发inputSystem的重复注册问题的解决

Unity新版输入系统的事件重复注册问题

最近在学习unity,边学别做了个小游戏。发现一个奇怪的bug,游戏在加载的时候会莫名其妙的报错,出现空指针异常。还会让我的ScriptableObject的文件失效。

Unity的inputSystem意外的错误截图.51389011e20cad79.png

反复测试发现,错误出现都是在场景加载的时候。进一步发现是在暂停回到主菜单后再次开始游戏的时候。

游戏暂停截图画面.b6ae1386cbcf81bc.png

检查后发现是inputSystem的问题,这里是我的源码:

1
2
3
4
5
6
7
8
9
10
11
private void Awake()
{
instance = this;
gameControl = new GameControl();
// 启动玩家控制
gameControl.Player.Enable();

gameControl.Player.Interact.performed += Interact_Performed;
gameControl.Player.Operate.performed += Operate_Performed;
gameControl.Player.Stop.performed += Stop_performed;
}

只看这段代码其实没问题。但是,游戏在回到开始界面的时候,这里的inputSystem会再次重复执行Awake()。这样就会有两个gameControl同时存在。事件也会注册两次,这样就会出现异常。

解决方法就是写个资源回收的函数OnDestroy,以下是代码:

1
2
3
4
5
6
7
8
private void OnDestroy()
{
gameControl.Player.Interact.performed -= Interact_Performed;
gameControl.Player.Operate.performed -= Operate_Performed;
gameControl.Player.Stop.performed -= Stop_performed;

gameControl.Dispose();
}

这里取消了事件,删除了gameControl就解决问题了。