哪一个更好 ?事件还是直接参考?

Which one is better ? event or straight reference?

你好只是想问一下哪个更好,为什么? (或者也许有更好的解决方案请我需要建议)

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# 事件;
  • 团结事件;
  • unity的消息系统;
  • 你自己的事件机制...

正如我和其他人在评论中所说,"best" 选择取决于很多因素,例如:应用程序的大小和预期寿命、设计选择、编码人员的经验、要解决的具体问题解决,个人喜好...

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

毕竟,我只是说我在评论中说的一样:如果你正在做一个有很多 类 和组件的大型应用程序,可能是由不同的人开发的,有 类 需要彼此了解很多可能是一件坏事,一个组件的更改可能会导致应用程序中各个地方的中断。但是,如果您的应用程序很小并且 类 之间的关系非常明显,那么您不应该费心让您的东西变得那么花哨,而应该费心于更重要的事情,例如 发布您的游戏.

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

直接在其他对象上调用方法要求调用者做两件事:1) 知道谁是被调用者(引用它)以及那里会发生什么(知道方法名称和 objective).它的立场有很多情况。假设您的游戏控制器负责让玩家在世界各地移动。您可能已经有了对某个玩家的引用,并且您想要创建它,只需 即可知道何时移动。你最好打电话给player.move().

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

调用事件是另一回事。你的玩家可以死在世界上。许多组件可能有兴趣了解玩家何时死亡。音频管理员可能想要播放 SE。网络控制器可能想要与网络服务器通信。一个成就系统可能想要奖励,敌人可能想要庆祝......所有这些组件都应该已经订阅了player.OnAboutToDie,这一切都会在适当的场合发生。通过事件,您可以与对您的消息感兴趣的每个人(也许没有人)进行交流,而无需控制他们使用这些信息做什么。这就像在您的 Twitter 上发布您今晚有空...

C#事件和Unity事件起着相同的作用,不同的是c#事件在所有c#包和程序中是通用的,更加灵活和快速。非程序员可以在检查器中操作 Unity 事件,并具有其他与 Unity 相关的好处。

还有Unity的消息系统。这就是使 Update 和 Start 之类的东西适用于所有单一行为和东西的原因。这是对我之前描述的消息传递隐喻的夸大。所有实现同名消息的对象都将由 SendMessage 触发,甚至它是 BroadcastMessage 的子对象。这就像支付当地广播电台宣布您今晚有空...

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