网站公告 | 泰斗网校全新上线了,可以和论坛用户登录同步,如果遇到登录问题联系管理员解决
查看: 14370|回复: 5
收起左侧

[已翻译] Unity:你现在正用组件思维思考

[复制链接]

[已翻译] Unity:你现在正用组件思维思考[复制链接]

1375134064 发表于 2018-4-10 14:30:39 [显示全部楼层] |只看大图 回帖奖励 |倒序浏览 |阅读模式 回复:  5 浏览:  14370
翻译:赵菁菁(轩语轩缘)  审校:李笑达(DDBC4747)

Unity是一个非常优秀的游戏开发平台,但是想要习惯它的话,你需要做一点准备工作:你可能需要转变认知来深入理解Unity的“基于组件”架构模式。
尽管经典的面向对象编程(OOP)确实可以、并且正在使用,但是Unity工作流是高度围绕组件架构建立的,这需要基于组件的思想。如果你熟悉组件,那太好了;如果不熟悉,那也没有问题。在这里,我会为你讲一堂Unity的组件速成课。

什么是组件?
在我们进入如何利用组件工作并进行思考问题之前,让我们明确大家都已经完全理解组件到底是什么了。在编程世界里,组件和去耦的概念并存。可以将组件看作一个大型机器的一小部分,每个组件都有其特定工作,而且通常(并且最佳地)可以不依靠任何外部资源就完成其任务或达到其目的。此外,组件很少只属于一台机器,组件可以结合各种各样的系统来完成它们的特定任务,但就全局而言会得到不同结果,这是因为组件不仅不考虑全局,甚至不知道全局的存在。
关于组件的典型例子是汽车零件——但那太无聊了,因为我不怎么喜欢汽车。 相反,想想[url=]Xbox 360[/url]手柄,它有两个摇杆、各式各样的按钮和扳机等等。不仅整个手柄本身是一个组件,手柄中的每个独立个体也是一个组件。
DSC0000.png
对于X按钮:可以按压,发出它已经被按压的信息;可以松开,发出它已经被松开的信息。X按钮不知道它周围还存在其他按钮,它也不在意。
手柄本身是一个组件,它由其他组件(所有按钮、摇杆和扳机)组成。因为它会向任何与之连接的设备发送数据,但是它不关心接入的对象是什么(Xbox,PC,一些Arduino产品,诸如此类)。X按钮或者手柄本身都不需要了解你在玩什么游戏,因为它们不会管信息的接收方而一直做本职工作。
手柄的功能是一条单行线,它的任务不会因接入对象的不同而改变,这使得它成为一个成功的组件,不仅因为它可以作为一个独立设备进行工作,而且也因为它可以和多个设备一起进行它自己的工作。

Unity如何以及为何支持组件?
Unity是用组件建立的,并且它也表现出来了。Unity最具价值、最与众不同的方面之一就在于它是一个完全可视的程序。我现在已经在游戏开发领域工作了多年,除了我很早工作在Flash IDE的日子外,我多数时间工作在PNG精灵表单和像FlashDevelop这样的代码编辑器——它们都不是可视的。
[url=]Unity[/url]恰恰相反,Unity实时地让你看到你正在做的一切。这意味着你可以测试你的项目,在独立窗口看你的项目运行,编辑你的代码或者游戏对象,还可以实时看到这些编辑引起的变化。这个系统给予开发者的能量是巨大的,并且在我看来,这是目前现代游戏开发的一个重要方面。以上的所有成为可能都因为Unity是基于组件架构的。

监视面板
如果你不熟悉Unity,那我就解释一下监视面板。这是Unity中的一个面板,它显示一个游戏对象的所有属性。如果你点击了界面中的游戏角色(运行时或运行前)你可以看到关于该对象的所有内容。
如果你的角色化身上有六个组件,每个组件都会在单独的标签中以列表形式显示,而且你可以看到每个公有变量并进行调整。如果你的角色化身有物品清单,你不仅可以看到他拥有的物品清单,你也可以看到其中的物品,以及每个特定物品在列表或者数组中的坐标。如果你在测试时选择游戏中的一个新物品,你可以看到该物品被实时添加到角色的物品清单中。你甚至可以向清单中添加或从中移除物品,这样你就可以迅速测试新物品,你甚至可以在游戏运行中创建新物品。
image002.1464680547.png
Unity监视面板
尽管实时编辑简直是强大得丧心病狂,但在组件使用上它并不是完全可靠的。你可以修改脚本,实时看到那些修改产生的影响,但是这与组件允许你做的相比较还是有限的。
想想不使用组件的情况,当你在其他大多数环境下测试项目时,你会看你的游戏是如何运行的,做些笔记,然后回到代码进行修改内容,只能再次编译项目来测试那些修改点。如果你有实时机制,你可以在运行中修改代码,并且在游戏运行时看到那些变化,这样要好得多。话虽这么说,但如果你没使用组件,为了看到任重大影响,你需要修改大量代码——这需要时间,而且这根本没有达到实时编辑的目的。
如果你正使用组件,你可以在仅两秒内添加新组件,你可以把你船上的枪换成Boss的枪(如果你将组件设计为作用于自身,这是好的组件应该做的),你可以把你的五条生命系统做修改,改成你之前为另一个游戏设计的那种很酷的带光晕的武力可再充满的盾牌。你可以给你的角色之一加大量的spell,这都在几秒钟之内实现。
DSC0002.png
你不需要修改任何代码,你不需要重新编译,你只需要拖拽,或者从下拉列表中选择你想要的组件,之后功能就加上了。这种功能对于游戏平衡来讲是无价的,它节省了大量的时间。

切换至基于组件的思考模式
使用组件最困难的部分,在于学习如何在使用时组织你的项目。对于大多数程序员来讲,这可能意味着你将会创建更多脚本,每个脚本会完成更小的、更精确的任务。
脚本间如何通信也是一个相当大的障碍,因为你会有更多的零散碎片和更少的大型类,在这些大型类中每个对象都知道所有其他对象。关于这个问题有一些显而易见的方法,比如给你的游戏的核心组件设置静态变量(角色、分数等),但是很少有效(而且不建议使用),有更高级的方法来正确地组织你的组件同时保证解耦。
幸运的是,Unity是基于组件建立的,它有大量内置函数可以帮助我们实现上述目标。Unity有一些函数,包括:得到特定组件的引用、检查所有的对象来寻找哪个包含特定组件等。有了这些多种多样的函数,你可以轻松地检索所需信息来创建那条神奇的知识单行线,在这条路上组件可以与它们影响的对象进行交流,但是组件本身不知道对象到底是什么。把这与接口使用结合起来,你就会得到足够的编程能力来处理任何问题,无论简单的还是复杂的。

例子:敌人类型
在一个OOP继承系统中,你可以有一个Enemy基类,该类包含大多数敌人所拥有的或会用到的功能,之后你可以扩展这个类来添加特定功能。
如果你曾经真的实现过这样的系统,你会发现在你的Enemy基类和也许是你的GameObject基类(或者差不多这样的类)之间,你会因许多无用混乱而终止,这些混乱来自源一些类需要但一些其他类不需要的变量和方法。接口可以解决这个问题,但接口不总是解决方案。
现在,让我们看看同样的机制,但是用组件思维来思考。你仍然有不同敌人,所有人都共享许多通用功能,但是每个人还有独特的特点。
第一步是把所有功能分解。一个人可能认为有生命值和死亡是同一系统的一部分,但是甚至这个例子也可以分解为生命系统组件和死亡系统组件。这是因为你的生命就是你的生命,不再是其他东西。当生命值达到0时,生命系统不负责决定接下来发生什么,它只负责知道生命值确实到0了。其他系统,如死亡系统,可以读该信息,然后它们爱做什么做什么。
可能死亡系统会产生一个新敌人(想想一个巨大的敌人分解为粉末);可能系统会降低能量提升;可能系统会给屏幕加上爆炸效果。无论发生了什么,生命系统都不能作为一部分,这就是我们建立干净、有用组件的方法。
当我们考虑移动时,我们可能认为所有的移动都需要在一个单独脚本中,但是一些游戏中的一些敌人不能行走,他们只能跳跃;一些敌人可以行走,但是不能跳跃。考虑这些事情就是我们确定组件可以在哪儿以及是否存应当在。至于移动性,我们可以将跳跃从走路或跑步中单分出来,单分出飞行等等——这样做会使我们的代码更整洁、更多用。
DSC0003.png
组件让我们的代码更简洁(没有不需要的变量和方法),但它也使创建敌人的过程愈发灵活和令人愉悦。敌人的每一个功能块都被设置为一个组件,我们可以拖拽敌人的各个方面,看他们如何表现——如果我们使用Unity,效果甚至都是实时的。
让我们假设下面所有的特征都已经被编码了。在我们的敌人创建过程中,我们可以创建三个空白敌人,在Unity中他们都只是空预置。然后我们可以拖上一个生命系统,一个物品丢弃系统和一个死亡系统,因为我们知道我们所有敌人无论有什么区别,都会有生命、死亡和物品丢弃。实际上,我们可以立刻选择所有这三个预置,之后再把这些组件拖拽到监视面板中,并且把三个都同时更新。
接下来,我们知道一个敌人可以飞,所以我们选择一个敌人,把飞行组件拖到他身上。另一个敌人可以在游戏中锁定目标并向其开火,所以我们在目标组件脚本上扔一个“开火”。第三个敌人可以在短时间内举起障碍来阻挡所有攻击,所以我们扔一个“障碍”组件。
现在我们已经有三个独特的敌人了,他们都共享一些特定组件,但是也有只适用于他们的组件。令人愉悦的部分是,这样做使这些敌人变得简单,用新变化来实验就和拖拽一样简单。想要一个能举起障碍、锁定目标向其开火的飞行敌人吗?把上面所有的组件都拖到一个敌人身上,你就成功了!

结论
用组件来思考可能并不简单,但是它确实有其益处,你可以在日后编程中继续使用组件的同时使用继承,但是通过不同角度观察来扩展你处理相同问题的方法是极其宝贵的。
就Unity而言,你可以使用你偏爱的任何方法,但是组件思想是一定要赞成的,只是与这样一个极好的工作流作对没什么意义(因为Unity工作流本身就是基于组件的)。学习Unity,转变我的思考方法,利用组件工作一直都是一个克服起来相对困难的障碍,但是我已经熬过来了,我想我永远都不会走回头路了。
原文链接:
原文作者未做权利声明,视为共享知识产权进入公共领域,自动获得授权;

+1
14368°C
5
  • qq1186351245
  • qq1186351245
  • 无敌了咋办
  • 十方开心
  • snakebbf
过: 他们
因分享而快乐,学习以自强!
qq1186351245 发表于 2018-4-10 16:50:14 显示全部楼层
很不错,组件的学习使用。。。
因分享而快乐,学习以自强!
qq1186351245 发表于 2018-4-10 16:53:41 显示全部楼层
很不错,组件的学习使用。。。
因分享而快乐,学习以自强!
无敌了咋办 发表于 2018-4-11 08:10:57 显示全部楼层
感谢分享,学到了一些东西
因分享而快乐,学习以自强!
十方开心 发表于 2018-4-11 09:19:40 显示全部楼层
感谢分享!!!!!!!!!!!
因分享而快乐,学习以自强!
snakebbf 发表于 2018-4-12 01:27:13 显示全部楼层
学新发型!!!!
因分享而快乐,学习以自强!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

VR/AR版块|Unity3d|Unreal4|新手报道|小黑屋|站点地图|沪ICP备14023207号-9|【泰斗社区】-专注互联网游戏和应用的开发者平台 ( 浙ICP 备 13006852号-15 )|网站地图

© 2001-2013 Comsenz Inc.  Powered by Discuz! X3.4

1
QQ