[英]How to cleanly remove InputAction callbacks?
我有一个类负责设置和拆除对 InputAction 事件的回调(来自 Unity 的 Input System 包)。 相关代码如下所示:
private void SetupCallbacks(InputActionMap map)
{
InputAction action = map.FindAction("Action", true);
action.performed += ActionPerformed;
action.canceled += ActionCanceled;
}
private void TeardownCallbacks(InputActionMap map)
{
InputAction action = map.FindAction("Action", true);
action.performed -= ActionPerformed;
action.canceled -= ActionCanceled;
}
显然,这里有很多重复,代码几乎做同样的事情。 这看起来像是 bug 的滋生地,尤其是随着操作数量的增加。 我希望这里有人知道更清洁的解决方案。 请分享你的想法!
Unity 在自动生成的类文件中生成一个名为SetCallbacks()
的公共方法,该方法订阅/取消订阅(释放内存)通过公共接口提供的 ActionMap 中的所有操作和阶段。 此视频中介绍了它。 所以做一些类似的事情(使用我在过场动画中的 SlideController):
public class SlideController : MonoBehaviour, InputControls.ISlidesActions
{
InputControls inputControls;
void Awake()
{
// new instance of input system controls
inputControls = new InputControls();
// *** subscribes ALL events ***
inputControls.ISlidesActions.SetCallbacks(this);
}
// enable / disable action maps for this class
void OnEnable()
{
inputControls.ISlidesActions.Enable();
}
void OnDisable()
{
inputControls.ISlidesActions.Disable();
}
// callbacks => game logic
public void OnNextSlide(InputAction.CallbackContext context)
{
DisplayNextSlide();
}
public void OnPreviousSlide(InputAction.CallbackContext context)
{
DisplayPreviousSlide();
// you have access to the phase here
if (context.started) Debug.Log("Event started");
else if (context.performed) Debug.Log("Event performed");
else if (context.canceled) Debug.Log("Event canceled");
}
// -> ect.
}
在那个视频中,他启用/禁用了整个输入资源,但我认为最好只启用/禁用课程所需的地图。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.