您好,我想问问哪个更好,为什么? (或者也许有更好的解决方案,请咨询)
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);
}
}
我想问一句顶级解决方案比后者更好或更糟(或者它们两者都不好),请帮忙,我需要一些建议。 预先感谢!
答案 0 :(得分:2)
实际上,对于同一目标,Unity中提供了更多替代方案:传递信息并触发对象之间的动作。
正如我和其他人在评论中所说,“最佳”选择取决于很多因素,例如:应用程序的大小和预期使用寿命,设计选择,编码人员的经验,要解决的特定问题,个人喜好...
绝不打算对此给出最终的答案,但我可以分享一个既定的观点,并考虑到这些因素。
毕竟,我只想说出我在评论中说的相同的内容:如果您正在做一个大型应用程序,其中包含许多类和组件,可能是由不同的人开发的,则这些类需要彼此了解很多可能会很不好,并且一个组件的更改可能会导致应用程序中各个位置的中断。但是,如果您的应用程序很小,并且类之间的关系非常明显,那么您就不应该费心把东西花哨,而应该费心处理更重要的事情,例如运送游戏。>
尽管如此,我想指出的那些工具的预期用途还是有一些差异。
直接在另一个对象上调用方法需要您的调用者执行以下两项操作:1)知道谁是调用对象(具有引用)以及在其中发生的事情(了解方法名称和目标)。它在很多情况下都可以使用。假设您的游戏控制器负责使玩家环游世界。您可能已经有一个球员的参考资料,并且想要修改,以知道何时移动。您最好致电player.move()
。
在对象中调用方法就像打电话给您的朋友说您今晚有空闲逛。
调用事件是其他事情。您的玩家可以死在世界上。许多组件可能会对知道玩家何时死亡的兴趣。音频管理员可能要播放SE。网络控制器可能希望与Web服务器通信。成就系统可能想要奖励,敌人可能想要庆祝...所有这些组成部分都应该已经订阅player.OnAboutToDie
,并且所有这些都将在适当的情况下发生。通过事件,您可以与每个对您的消息感兴趣的人(也许没有人)进行交流,而无法控制他们对该信息的处理方式。就像您在Twitter上发布您今晚有空...
C#事件和Unity事件起着相同的作用,不同之处在于c#事件在所有c#软件包和程序中都是通用的,更加灵活和快速。非程序员可以在检查器中操纵统一事件,并具有其他与统一相关的好处。
还有Unity的消息系统。这就是使“更新”和“开始”之类的东西适用于所有单行为和事物的原因。这是我之前描述的消息传递隐喻的夸大其词。实现名为消息的消息的所有对象都将由SendMessage
触发,甚至是带有BroadcastMessage
的子对象。就像付钱给当地广播电台宣布您今晚有空...
编辑:我只是意识到OP在问题[:facepalm]中从未提到Unity。答案仍然适用。