我一直在阅读关于将输入与逻辑/行为分开的建议,这在组织和行为可重用性方面是一个合理的概念。然而,我不认为我完全理解这意味着什么或包含什么,特别是“新”输入系统已经处理了输入映射,而我在脚本中只需要订阅到该输入事件。 我将其理解为订阅事件的脚本和引用它时需要。因此,我有:

  • InputReader类订阅不同的输入以移动、跳跃、转向、激活增强功能、使用增强功能动作(如射击)等...
  • InputReader存储Vector2或浮点值(封装在公共获取和私有设置中)。
  • PlayerMovement脚本在FixedUpdate()中基于InputReader的Vector2值移动玩家。
  • PlayerJumpingPlayerTurning脚本类似。
    我不清楚这里的好处,因为例如,PlayerMovement脚本仍然需要该输入值,因此它不能真正被其他角色移动而不需要输入重用。
  • 增强功能激活是不同的,因为我不想在Update()FixedUpdate()中不断检查存储的输入值。这会引入很多不必要的开销。因此,在InputReader的订阅中我调用PowerupManager.ActivatePowerup(),它处理检查玩家是否有可用的增强功能并忽略输入的逻辑。
    我仍然不清楚将输入订阅放在InputReader中而不是在PowerupManager自身中会带来什么好处,后者也允许进一步优化,只订阅输入当至少有一个增强功能可用时。
  • 我打算让每个增强功能自己的脚本(带有PowerupEffect类的基类)并在需要时启用/禁用适当的组件。
    我的最后一个(和最大的)问题是使用某些增强功能的重复动作。一些增强功能提供持续效果不需要额外输入(如定时盾牌)。其他增强功能需要玩家提供额外输入来触发动作(如射击子弹或冲刺)。我可以做一些类似于如何订阅PowerupManager.ActivatePowerup()的东西,但这会带来大量开销,因为事件处理被调用以做nothing当玩家按下该输入时但没有那些增强功能活跃。因此,还是不应该在需要该输入的增强功能脚本中订阅输入吗?我很感谢任何有关此问题的见解。我不确定我的头脑是如何工作的。