【问题标题】:Is there a way I can simplify this boilerplate event handler code in Unity?有没有办法可以在 Unity 中简化这个样板事件处理程序代码?
【发布时间】:2018-07-11 15:02:05
【问题描述】:

有没有一种方法可以减少这个样板代码而不会太聪明?

我有一堆这样的事件回调:

HandleFooFinished() {
  FooFinished = true;
}

HandleBarFinished() {
  BarFinished = true;
}

可以使用 lambdas 将它们连接起来以减少回调代码,除了我需要引用处理程序来取消订阅,就像这样。

SubscribeToEvents() {
  GameState.Subscribe("OnFooFinished", HandleFooFinished);
  GameState.Subscribe("OnBarFinished", HandleBarFinished);
}

UnsubscribeToEvents() {
  GameState.Unsubscribe("OnFooFinished", HandleFooFinished);
  GameState.Unsubscribe("OnBarFinished", HandleBarFinished);
}

你问,为什么我什至需要设置这些标志?我正在设计一些逻辑来处理场景转换,所以我正在整合这样的流程逻辑:

TransitionFromSceneAToSceneB {
  GameState.FireEvent("DoFooInAnotherScene")
  yield return new WaitUntil(FooFinished);

  // Do bar and baz after foo is done, wait until they both finish 
  GameState.FireEvent("DoBarInAnotherScene");
  GameState.FireEvent("DoBazInAnotherScene");
  yield return new WaitUntil(BarFinished);
  yield return new WaitUntil(BazFinished);

  // Celebrate 
  ...
}

你怎么看?有标志的查找字典和处理订阅和取消订阅的辅助方法吗?做一些完全不同的事情,因为这是一种愚蠢的幼稚方法?

【问题讨论】:

  • 这可能更适合codereview.stackexchange.com
  • 谢谢!我看着那里,似乎他们想要实际的工作代码而不是这个伪代码。

标签: c# unity3d


【解决方案1】:

具有用于订阅和管理回调的静态方法的帮助类是我的首选方法,通常与 OnEnable 和 OnDisable 配对

虽然有很多方法可以做到这一点,并且从类中处理逻辑当然是有效的,但迟早你会开始将功能推送到你继承的父类,这实际上类似于推送对单独对象的处理,但会限制您的继承树。

还可以考虑将订阅模型基于实现接口而不是具体的类结构

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2021-08-28
    相关资源
    最近更新 更多