我们发现如果使用CommonUI插件中的CommonInput相关功能,配置了UCommonInputSettings中的InputData项之后,这个资源会在特别早的时机被加载(UCommonInputSubsystem的Initialize时,在创建初始的LocalPlayer时触发),并且没看到相关的设置可以影响它的加载时机。这样的话对运行时中的热更新应该有影响,我们似乎没有合适的策略在下载到更新资源后刷新InpuData中配置的相关内容。(参考 [Content removed] 中的回答)
重现步骤
在项目中使用CommonUI插件,并配置UCommonInputSettings中的InputData
您好,因为InputData是游戏的核心数据啊,在游戏启动的时候肯定要提前加载的,否则游戏将无法响应输入数据了。但是加载完之后就一直留在内存里了,即使你重新mount了新的pak也没法修改这部分的内存数据了,这个是引擎的机制导致的,所有的数据都是如此,因为直接修改内存数据的话太危险了,运行时引擎并不知道有多少逻辑代码是依赖某块内存数据的。直接修改会导致不可预期的结果。
我不确定通过修改bAutoLoadData为False,然后Mount之后再手动调用UCommonInputSettings::LoadData()是否能达到您说的效果,但是这样需要您保证在Mount前不使用任何CommonUI的资源。
确实背景是这样,但是我们比较希望可以在某个时机(比如从网络上下载了某个pak之后)可以热更新其中设置的值。InputData毕竟还是CommonUI插件内的内容,如果更新完成之前不使用依赖CommonUI插件的控件,理论上来说是不是可以等到后续我们要用依赖CommonUI插件的控件前才加载它呢。
或者刚发现虽然UCommonInputSettings中InputDataClass是Private无法获取,但是UCommonUIInputData类的成员都是public的,实际上我们也许也可以在运行时找内存中的UCommonUIInputData对象然后加载新的资源(和开始加载的资源不同Package)然后改里面的属性……这样子不用改目前的引擎,但是还是不太好。