哪一个更好?事件还是直接引用



Hi只是想问哪一个更好,为什么?(或者可能还有更好的解决方案,请给我建议(

public class Player
{
GameController _gameController;
public Player
{
_gameController.OnPlayerGetHit += GetHit;
}
private void GetHit(float damage){}
}
public class GameController
{
public delegate void PlayerHitCallback();
public event PlayerHitCallback OnPlayerGetHit;
public OnCollisionHit()
{
OnPlayerGetHit?.Invoke();
}
}

public class Player
{
public void GetHit(float damage){}
}
public class GameController
{
Player _player;
public OnCollisionHit()
{
_player.GetHit(damage);
}
}

我想问一下Top解决方案是好是坏(或者两者都不好(,请帮忙,我需要一些建议。提前感谢!

实际上,对于相同的目标,Unity中有更多的替代方案:在对象之间传递信息和触发操作。

  • 直接方法调用
  • c#事件
  • 团结事件
  • 团结的信息系统
  • 您自己的事件机制

正如我和其他人在评论中所说,"最佳"选择取决于很多事情,比如:应用程序的大小和预期使用寿命、设计选择、程序员的经验、要解决的特定问题、个人偏好。。。

我决不打算对此给出最终答案,但考虑到这些因素,我可以分享一个有根据的观点。

毕竟,我只想和我在评论中说的一样:如果你正在做一个有很多类和组件的大型应用程序,可能是由不同的人开发的,那么让这些类相互了解可能会很糟糕,一个组件的更改可能会导致应用程序中所有地方的中断。但是,如果你的应用程序很小,并且类之间的关系很明显,你就不应该把你的东西做得那么花哨,你应该把注意力放在更重要的事情上,比如运送你的游戏

不过,我想指出的是,在这些工具的预期用途上存在一些差异。

直接在另一个对象上调用一个方法需要调用方做两件事:1(知道谁是calee(有对它的引用(以及其中会发生什么(知道方法名称和目标(。它在很多情况下都是如此。假设你的游戏控制器负责让玩家在世界各地移动。你可能已经有了一个玩家的参考,你想制作它,并且只是,以知道何时移动。你最好打电话给player.move()

调用对象中的方法就像给你的朋友打电话说你今晚可以出去玩一样。

召集一个活动是另一回事。你的玩家可能会死在这个世界上。许多组件可能有兴趣了解玩家刚刚死亡的时间。音频管理器可能想要播放SE。网络控制器可能想要与网络服务器通信。成就系统可能想要奖励,敌人可能想要庆祝。。。所有这些组件都应已订阅player.OnAboutToDie,所有这些都将在适当的情况下发生。通过事件,你正在与所有对你的信息感兴趣的人(也许没有人(交流,而无法控制他们对这些信息做了什么。这就像在你的推特上发布你今晚有空。。。

C#事件和Unity事件扮演着相同的角色,不同的是C#事件在所有C#包和程序中都是通用的,更灵活、更快。非程序员可以在检查器中操纵Unity事件,并具有其他与Unity相关的好处。

还有团结的信息系统。这就是为什么像更新和启动这样的东西可以处理所有的行为和东西。这是对我之前描述的传递信息的比喻的夸大。所有实现类似消息的对象都将由SendMessage触发,甚至它与BroadcastMessage的子对象也会触发。这就像付钱给当地电台宣布你今晚有空。。。

编辑:我刚刚意识到OP从未在问题[:facepalm]中提到Unity。不过,答案仍然适用。

最新更新