【问题标题】:How do I use a void function using delegates?如何使用委托使用 void 函数?
【发布时间】:2017-06-29 06:21:20
【问题描述】:

我一直在尝试对游戏的输入使用事件处理。当看到其他人使用类似的方法时,他们能够在委托变量中添加一个 void 函数而不会出错。 每当我尝试将 Move() 函数添加到 OnAxisChange 时,都会收到以下错误:

无法将类型“void”隐式转换为“CharacterView.InputAction”

public class CharacterView : MonoBehaviour {
    public delegate void InputAction();
    public static event InputAction OnAxisChange;

    public Vector2 InputAxis
    {
        get
        {
            float x = Input.GetAxisRaw("Horizontal");
            float y = Input.GetAxisRaw("Vertical");
            return (new Vector2(x, y));
        }
    }

    private void Update()
    {

        Vector2 input = InputAxis;
        if (input.x != 0 || input.y != 0)
        {
            if (OnAxisChange != null)
            {
                OnAxisChange();
            }
        } 
    }
}

以下是处理事件的类。

public class CharacterController : MonoBehaviour {

    private void OnEnable()
    {
        CharacterView.OnAxisChange += Move();
    }
    private void OnDisable()
    {
        CharacterView.OnAxisChange -= Move();
    }

    public void Move()
    {
        Debug.Log("Entered the move function!");
    }

}

使用委托进行事件处理对我来说仍然有点陌生,所以我认为我误解了一些东西。

【问题讨论】:

  • 与其创建自己的委托,不如考虑使用 EventHandler。 msdn.microsoft.com/en-us/library/…
  • @RandRandom 这样做有什么先天优势吗?
  • 使用EventHandler 的唯一优势是它强制执行object sender, EventArgs e 的标准.NET 事件模式签名。否则,它与使用标准委托相同。
  • @RichardMcilwain 对我来说唯一真正的原因是,我是一个懒惰的混蛋,更喜欢使用 EventHandler 而不是编写自己的委托。我只是想用我的懒惰感染你。 :)

标签: c# delegates event-handling


【解决方案1】:

您需要在Move 之后删除()。就像您正在调用您的方法并尝试添加它的返回类型一样,这没什么。只需将其更改为以下内容。

CharacterView.OnAxisChange += Move;

CharacterView.OnAxisChange -= Move;

【讨论】:

  • 你从哪里得到"Event declaration adds a layer of protection on the delegate instance..." 的报价,你为什么把它放在答案中?跟这个问题有什么关系?
  • 您为什么建议使用EventHandler 而不是委托?它仍然是一个委托。
  • @Enigmativity 我从另一个问题中得到它,我把它放进去是因为他使用委托作为事件处理程序。 EventHandlers 不能像委托一样直接重置。还是你不同意?
  • @Enigmativity 但如果你认为它没有任何区别,甚至糟糕到值得一票否决,我可以再次删除它。我只是不明白为什么
  • @Enigmativity 嗯...啊,现在我明白了。感谢您的解释.. 我觉得 corese EventHandler 只是一个代表...
猜你喜欢
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-26
  • 1970-01-01
  • 2013-02-20
相关资源
最近更新 更多