当前位置:主页 > 1.80火龙复古 >

Unity3D的IoC容器

更新时间:2019-06-29 12:28 编辑:1.80复古传奇 来源:http://www.shangkai.cc

注意:这篇文章现已过时,如果你到这里,你应该阅读更新版本:

Unity是一个非常好的游戏开发工具,虽然虽然我喜欢大多数能(并且相信我很难让我开心),但代框架仍然难以使用。
让我解释为什么我说尴尬。 Unity诞生了作为快速应用程序开发工具,由于其质,它很快被许多开发人员采用。然而Unity现在正试图向三A开发迈进,但是虽然该公司主要专注于添加新的编辑器能,但是关于框架本身并没有很多新闻,目前代设计太多了 单人乐队面向。

本文中的注意事项并不适用于由一人或两人开发的简单项目或项目。对于这些特定情况,Unity是完美的。本文中的论点适用于由中型大型团队开发的中型项目。

我不会谈论我发现的所有缺陷,但我会专注于一个,那就是在Unity实体中注入依赖项是多么尴尬。
需要明确的是,依赖项被定义为另一个对象执行其代所需的对象。如果类A需要类B的实例来执行其代,则B是A的依赖项。

问题

Unity基于 EntityFramework 的现代概念。有几个实体框架的实现存在,我甚至自己创建一个。实体框架是一个非常强大的概念,具有许多优点:推动用户支持组合而不是继承,保持课程小而清洁,专注于单一职责,促进模块化。这是一个完美的世界

在Unity中,Entites被称为? GameObjects ?而且这些组件基于? MonoBehaviour ?实现。就个人而言,当我为GameObjects实现MonoBehaviours时,我想要遵循一些黄金规则:

MonoBehaviours应该始终在它们所附着的GameObjects上运行。MonoBehaviours是可重复使用的单一责任类。不应该在没有视图的情况下创建GameObjects(这将是一个网格,对撞机或者真正是游戏中的实体的东西,唯一的例外是用作 文件夹的空游戏对象和其他特定情况我将说明另一个时间)。MonoBehaviours可以使用? GetComponent 知道同一GameObject上的其他组件。应该扩展GameObject的行为,添加MonoBehaviours而不是向单个MonoBehaviour添加方法。

问题是,正如你们许多人所知道的那样,由于必须解决依赖关系的方式,Unity并不真正允许遵循大多数这些规则。事实上,如果组件需要与其他类通信会发生什么?让我们说有一个Level类,由于某些原因,这个类必须知道仍然存在的怪物。当怪物死亡时,如何将事实传达给Level对象?

目前有3个简单的解决方案可以解决这个问题:

Level是在没有视图的GameObject内创建的Monobehaviour。所有怪物都会在?开始?或? Awake ?函数中使用? GameObject.Find ?调用来查找Level类。等级是单身人士。像1一样,但Level是通过? Object.FindObjectOfType。找到的

但是,我认为在遵循所有三种可能的解决方案方面存在问题:

GameObject.Find有什么问题

第一个解决方案打破了我的黄金规则,这不是一个大问题,因为它们实际上是更好的设计准则。相反,真正的问题是使用GameObject.Find。 GameObject.Find是Unity Framework对大型项目开发有多尴尬的例子之一。

如果团队中有人决定重命名GameObject,会发生什么?应该强制一下,GameObjects一旦创建,就不能再重命名(或删除)了吗? GameObject.Find可能导致在编译时无法捕获的几个运行时错误。当通过此能搜索数十个和几十个游戏对象时,这种情况可能非常难以管理。

单身人士怎么了?

Singleton是一个有争议的论点,因为该模式已被发明。我个人反对使用Singleton。但是,如果你问我为什么我反对Singleton我不会用通常的答案回答你(破解封装,依赖隐藏,通过单元测试来测试代的许多问题,绑定到服务的实现而不是它的抽象) ,但随着实践的后见之明

注意:这篇文章现已过时,如果你到这里,你应该阅读更新版本:

Unity是一个非常好的游戏开发工具,虽然虽然我喜欢大多数能(并且相信我很难让我开心),但代框架仍然难以使用。
让我解释为什么我说尴尬。 Unity诞生了作为快速应用程序开发工具,由于其质,它很快被许多开发人员采用。然而Unity现在正试图向三A开发迈进,但是虽然该公司主要专注于添加新的编辑器能,但是关于框架本身并没有很多新闻,目前代设计太多了 单人乐队面向。

本文中的注意事项并不适用于由一人或两人开发的简单项目或项目。对于这些特定情况,Unity是完美的。本文中的论点适用于由中型大型团队开发的中型项目。

我不会谈论我发现的所有缺陷,但我会专注于一个,那就是在Unity实体中注入依赖项是多么尴尬。
需要明确的是,依赖项被定义为另一个对象执行其代所需的对象。如果类A需要类B的实例来执行其代,则B是A的依赖项。

问题

Unity基于 EntityFramework 的现代概念。有几个实体框架的实现存在,我甚至自己创建一个。实体框架是一个非常强大的概念,具有许多优点:推动用户支持组合而不是继承,保持课程小而清洁,专注于单一职责,促进模块化。这是一个完美的世界

在Unity中,Entites被称为? GameObjects ?而且这些组件基于? MonoBehaviour ?实现。就个人而言,当我为GameObjects实现MonoBehaviours时,我想要遵循一些黄金规则:

MonoBehaviours应该始终在它们所附着的GameObjects上运行。MonoBehaviours是可重复使用的单一责任类。不应该在没有视图的情况下创建GameObjects(这将是一个网格,对撞机或者真正是游戏中的实体的东西,唯一的例外是用作 文件夹的空游戏对象和其他特定情况我将说明另一个时间)。MonoBehaviours可以使用? GetComponent 知道同一GameObject上的其他组件。应该扩展GameObject的行为,添加MonoBehaviours而不是向单个MonoBehaviour添加方法。

问题是,正如你们许多人所知道的那样,由于必须解决依赖关系的方式,Unity并不真正允许遵循大多数这些规则。事实上,如果组件需要与其他类通信会发生什么?让我们说有一个Level类,由于某些原因,这个类必须知道仍然存在的怪物。当怪物死亡时,如何将事实传达给Level对象?

目前有3个简单的解决方案可以解决这个问题:

Level是在没有视图的GameObject内创建的Monobehaviour。所有怪物都会在?开始?或? Awake ?函数中使用? GameObject.Find ?调用来查找Level类。等级是单身人士。像1一样,但Level是通过? Object.FindObjectOfType。找到的

但是,我认为在遵循所有三种可能的解决方案方面存在问题:

GameObject.Find有什么问题

第一个解决方案打破了我的黄金规则,这不是一个大问题,因为它们实际上是更好的设计准则。相反,真正的问题是使用GameObject.Find。 GameObject.Find是Unity Framework对大型项目开发有多尴尬的例子之一。

如果团队中有人决定重命名GameObject,会发生什么?应该强制一下,GameObjects一旦创建,就不能再重命名(或删除)了吗? GameObject.Find可能导致在编译时无法捕获的几个运行时错误。当通过此能搜索数十个和几十个游戏对象时,这种情况可能非常难以管理。

单身人士怎么了?

Singleton是一个有争议的论点,因为该模式已被发明。我个人反对使用Singleton。但是,如果你问我为什么我反对Singleton我不会用通常的答案回答你(破解封装,依赖隐藏,通过单元测试来测试代的许多问题,绑定到服务的实现而不是它的抽象) ,但随着实践的后见之明

注意:这篇文章现已过时,如果你到这里,你应该阅读更新版本:

Unity是一个非常好的游戏开发工具,虽然虽然我喜欢大多数能(并且相信我很难让我开心),但代框架仍然难以使用。
让我解释为什么我说尴尬。 Unity诞生了作为快速应用程序开发工具,由于其质,它很快被许多开发人员采用。然而Unity现在正试图向三A开发迈进,但是虽然该公司主要专注于添加新的编辑器能,但是关于框架本身并没有很多新闻,目前代设计太多了 单人乐队面向。

本文中的注意事项并不适用于由一人或两人开发的简单项目或项目。对于这些特定情况,Unity是完美的。本文中的论点适用于由中型大型团队开发的中型项目。

我不会谈论我发现的所有缺陷,但我会专注于一个,那就是在Unity实体中注入依赖项是多么尴尬。
需要明确的是,依赖项被定义为另一个对象执行其代所需的对象。如果类A需要类B的实例来执行其代,则B是A的依赖项。

问题

Unity基于 EntityFramework 的现代概念。有几个实体框架的实现存在,我甚至自己创建一个。实体框架是一个非常强大的概念,具有许多优点:推动用户支持组合而不是继承,保持课程小而清洁,专注于单一职责,促进模块化。这是一个完美的世界

在Unity中,Entites被称为? GameObjects ?而且这些组件基于? MonoBehaviour ?实现。就个人而言,当我为GameObjects实现MonoBehaviours时,我想要遵循一些黄金规则:

MonoBehaviours应该始终在它们所附着的GameObjects上运行。MonoBehaviours是可重复使用的单一责任类。不应该在没有视图的情况下创建GameObjects(这将是一个网格,对撞机或者真正是游戏中的实体的东西,唯一的例外是用作 文件夹的空游戏对象和其他特定情况我将说明另一个时间)。MonoBehaviours可以使用? GetComponent 知道同一GameObject上的其他组件。应该扩展GameObject的行为,添加MonoBehaviours而不是向单个MonoBehaviour添加方法。

问题是,正如你们许多人所知道的那样,由于必须解决依赖关系的方式,Unity并不真正允许遵循大多数这些规则。事实上,如果组件需要与其他类通信会发生什么?让我们说有一个Level类,由于某些原因,这个类必须知道仍然存在的怪物。当怪物死亡时,如何将事实传达给Level对象?

目前有3个简单的解决方案可以解决这个问题:

Level是在没有视图的GameObject内创建的Monobehaviour。所有怪物都会在?开始?或? Awake ?函数中使用? GameObject.Find ?调用来查找Level类。等级是单身人士。像1一样,但Level是通过? Object.FindObjectOfType。找到的

但是,我认为在遵循所有三种可能的解决方案方面存在问题:

GameObject.Find有什么问题

第一个解决方案打破了我的黄金规则,这不是一个大问题,因为它们实际上是更好的设计准则。相反,真正的问题是使用GameObject.Find。 GameObject.Find是Unity Framework对大型项目开发有多尴尬的例子之一。

如果团队中有人决定重命名GameObject,会发生什么?应该强制一下,GameObjects一旦创建,就不能再重命名(或删除)了吗? GameObject.Find可能导致在编译时无法捕获的几个运行时错误。当通过此能搜索数十个和几十个游戏对象时,这种情况可能非常难以管理。

单身人士怎么了?

Singleton是一个有争议的论点,因为该模式已被发明。我个人反对使用Singleton。但是,如果你问我为什么我反对Singleton我不会用通常的答案回答你(破解封装,依赖隐藏,通过单元测试来测试代的许多问题,绑定到服务的实现而不是它的抽象) ,但随着实践的后见之明

上一篇:Prima写书

下一篇:没有了

相关内容