有没有一种方法可以简化Unity中的样板事件处理程序代码?

时间:2018-07-10 15:29:37

标签: c# unity3d

有什么办法可以减少这种样板代码而又不会太聪明?

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

HandleFooFinished() {
  FooFinished = true;
}

HandleBarFinished() {
  BarFinished = true;
}

可以使用lambda将它们连接起来以减少回调代码,除了我需要像这样取消订阅的处理程序这一事实之外。

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 
  ...
}

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

1 个答案:

答案 0 :(得分:0)

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

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

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