Open z466chen opened 2 years ago
这个Latent Action不能取消的问题我看了一下,好像是因为latent function使用的FLatentInfo的ExecutionTarget都是UnLuaManager(resume point 是 UnLuaManager::OnLatentActionCompleted), 但是取消是通过取消当前WorldContextObject的所有latent action实现的。比如我在Widget1这个实例里边call delay,注册的FLatentActionInfo的WorldContextObject就是Widget1 而不是UnLuaManager。 我现在的想法是再给当前的WorldContextObject注册一个FPendingLatentAction,然后在LatentAction里边监听NotifyActionAborted和NotifyObjectDestroyed。原来latent function使用的FLatentInfo 的target和resume point设在一个新的CallerObject里边,等NotifyActionAborted或NotifyObjectDestroyed事件发生之后就清空这个CallerObject绑定的latent action(因为latentactionmanager好像不能移除指定的latentaction)。我试了这个方法可行。但是这样的话每个latent action就要绑定一个单独的object,会不会有额外的开销呢?
UMG蓝图类内置了一个函数CancelLatentActions可以清除掉所有timer和异步信息,但是如果该蓝图类bind了lua script,那么无论在蓝图上call cancelLatentAction还是在c++或者lua里call cancellatentactions都不能正常清除掉latentaction了。可能是因为CancelLatentAction作用于原生的LatentActionManager而不是UnLuaManager,所以当从latentactionmanager remove之后没有通知到UnLuaManager这个latent action失效了?可不可以通过register LatentActionsChangedDelegate使UnLuaManager的active latent action和LatentActionManager的ActionList同步呢?
$\color{red}复现办法$:创建一个如下图一样的携程,delay2秒后创建一个相同的widget并add to viewport(图中CreateWidget是一个蓝图函数) 。
在Button Click的时候removefromparent并且CancelLatentActions。结果是两秒之后新的widget仍然出现
https://user-images.githubusercontent.com/39448339/174607106-5190f465-7a00-412c-b6a1-1579a3c86ad4.mp4