繁体   English   中英

如何干净地删除 InputAction 回调?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM