unity 2d游戏开发pdf问题

专访张路斌:从HTML5到Unity的游戏开发之路
发表于 08:24|
作者单明珠
摘要:社区之星52期采访了非计算机专业出身、热爱游戏的张路斌,为了离梦想近一些,毕业后前往日本,选择在游戏行业发展。在这段时间里,他在CSDN博客里撰写了几十篇技术文章,并著有《HTML5 Canvas游戏开发实战》一书。
张路斌,英文名Lufy( ),非计算机专业出身,由于本身喜欢玩游戏,毕业后千里迢迢前往日本,从事游戏开发工作。一开始接触Java、.Net和PL/SQL开发工作,由于碰上金融危机公司裁员,便跳槽至一家小公司做了半年手机游戏开发,随后到一家互联网公司工作。现在在一家游戏公司上班,接触最多的是Unity开发。Lufy曾开发《杨家将传奇》、大型网页游戏《アイドルバトル》、《Flash游戏ポイガチャ》、多平台三国记系列游戏,以及数十款手机小游戏。在CSDN博客上撰写了几十篇的技术博文,还著有《HTML 5 Canvas游戏开发实战》一书,并独立开发了HTML5游戏引擎lufylegend。近日Lufy接受CSDN社区之星栏目的专访,让我们一起来看看他在日本游戏发展道路上的点点滴滴。CSDN:请先介绍下自己。Lufy:大学毕业后,我最先接触Java开发,后来到日本做.Net和PL/SQL开发。很不巧的是,我在日本碰到了严重的经济危机,一起出来的小伙伴们都回国了。相比下,我运气较好,找到了一家做手机游戏开发的小公司,后又跳槽至另一家互联网公司,主要接触PHP、JavaScript和Flash。现在在一家游戏公司工作,接触最多的是Unity。CSDN:非计算机专业出身,为什么会选择到日本,在游戏行业发展?Lufy:我做这个行业,主要是因为我喜欢玩游戏。游戏玩多了,自然就会有“游戏中的某个地方要是如何如何设计,或许会更好玩”之类的想法,就会想要自己去做一款游戏。大学时,我做了一款《杨家将传奇》,在同类游戏中,它的人气还算不错,现在也有不少人在玩。这款游戏对我的影响非常大,也更让我坚信游戏开发之路。毕业后来到日本,很大一部分原因是我比较喜欢日本的游戏,到日本发展或许会让自己离梦想更近。实际上,到去年年末之前,我都不算是一个全职的游戏开发者,我之所以一直在坚持,是因为我很喜欢游戏开发。HTML5的游戏开发经验之谈——缩短开发周期,并想办法维护CSDN:我们知道您曾独立开发大型网页游戏《アイドルバトル》、《Flash游戏ポイガチャ》、多平台三国记系列游戏,以及数十款手机小游戏,能和我们分享下经验吗?Lufy:经验谈不上,我就根据自身开发经验简单的说下。之前我开发的有点规模的游戏,现在都已下线了。前几天我听了一个游戏经验的分享,和我的想法不谋而合,我在这里和大家分享下。游戏开发者都知道,一款游戏是否会火,根本就是不可预计的,有的游戏画面特效做得相当绚丽,有的游戏内容非常有意思,有的游戏玩法特别新颖,但最后都被淘汰了。当然,以上这些因素都是一款好游戏应该具备的,但也不是必要的。有时你觉得远不如自己的游戏反而一夜之间火爆了,有些简单的不能再简单的游戏,反而取得了很大成功。所以,经验告诉我们,游戏开发,就是不断的重复再重复,挑战再挑战,没人知道这个游戏是否会让你或者你的团队“一夜暴富”。此外,我认为游戏开发应该尽可能的缩短开发周期,让市场来决定你的游戏是否生存下去,然后再想办法维护。就像很多美剧一样,拍摄几集就开始播,先观察观众的反映和需求,反映不好还可以调整,或者直接放弃。当然,还有一些开发者开发游戏是为了自己的兴趣或者单纯的为了实现自己的某个理想,对他们而言,游戏做出来了,就已经算成功了。CSDN:2013年时,您写了一本名为《HTML5 Canvas游戏开发实战》的书,能介绍下吗?Lufy:这本书有对HTML5
canvas的API的详细介绍,也有对lufylegend.js引擎的使用详解,更重要的是,书中以实例为向导,详细讲述对休闲、射击、物理以及网络游戏等各种类型游戏的开发流程,包括游戏分析、开发过程、代码解析和小结等相关内容,帮助读者了解每种类型游戏开发的详细步骤,让读者彻底掌握各种类型游戏的开发思想。最后,书中通过数据对比分析,指导读者提升程序的性能、写出高效的代码,从而开发出运行流畅的游戏。CSDN:既然您提到了HTML5游戏引擎lufylegend,那么能否介绍下为什么会有自己开发引擎的想法?Lufy:至于我为什么想开发自己的HTML5游戏引擎lufylegend,这里我依然引用《HTML5 Canvas游戏开发实战》一书前言中的一段话来回答我开发HTML5引擎的原由:我是一个喜欢不断学习新知识的人,所以当HTML5作为一种新技术出现的时候,我没有理由不去了解它。由于本身对JavaScript有一定的了解,所以我在学习HTML5的Canvas时,上手非常快。出于对ActionScript的喜爱,我一开始便试着在JavaScript中模仿ActionScript的API来做开发,并且在博客上发表了《用仿ActionScript的语法来编写HTML5》系列文章,这便是最初的lufylegend开源库件的构建过程。当我把自己研究的类库整合到一起后,发现它使用起来十分方便,使用它来开发游戏可以节约大量的开发时间,于是我将其分享到了网上供大家免费使用,希望给相关开发者提供便利。CSDN:lufylegend有哪些优势呢?Lufy:lufylegend的优势在于入门简单、性能高等特点。其实所有的引擎都有一套自己的标准,并在这个标准上进行封装和扩展,所以在渲染过程中必然要增加很多额外的处理和计算等,但这些都会导致引擎效率的降低。而我在这款引擎的设计和维护上,一直坚持以高性能为第一目标,尽量简化渲染流程,以达到接近原生渲染的速度。我之前做过一个测试发现,在Canvas 2D基础上,lufylegend的渲染速度高出其他引擎很大一截。目前,lufylegend正在追加WebGL渲染功能,相信不久后的2.0版本,lufylegend在渲染速度上依然会保持领先。当然一款引擎只比性能是不够的,还要比易用性。在lufylegend交流群里,很多人都说,lufylegend太简单了,用它一天就可以开发出一款简单的小游戏。这个绝不是吹牛,lufylegend在设计上模仿了Flash的API。此外,在lufylegend中还有显示列表、对象、继承、事件等,极大的弥补了JavaScript在开发过程中的不足。lufylegend中还提供了对Box 2D的简易封装,以及Tween,不同屏幕的自动适配等功能。此外,我还引入了一些在Unity开发中自己发现的一些比较实用的小功能,这都让lufylegend更方便使用。CSDN:HTML5浏览器兼容性问题让人很头疼,你怎么看待这样问题?Lufy:说到兼容性,这也是出现许多引擎的原因之一。不同浏览器会有不同的处理,比如不同屏幕大小的自动适配,比如各个浏览器对音频的支持度等。开发者要么自己进行处理,要么就接触第三方工具或者引擎来处理。一款引擎,只有帮助开发者解决问题,才能受到欢迎。我觉得大家可以对兼容性持乐观态度,因为,兼容性的问题不可能会完全消失,但随着一系列标准的完善,这类兼容性问题会越来越小,未来会更小。所以,兼容性、渲染性等问题,应该交给引擎和框架来解决,开发者应该把重心放在自己的产品和开发上。CSDN:你觉得HTML5在开发游戏时有哪些优势?对它未来发展有哪些看法?Lufy:用HTML5开发游戏最大优势在于它的跨平台性,即无需进行下载就可进入游戏。一个链接一个二维码就可以在任何平台上向其他人分享你的游戏,还有比这个更简单的传播方式吗?再一个开发JavaScript人员储备充足,这也是一个很大的优势。HTML5出现的时候,我认为它是未来Web的方向。在移动开发方面,HTML5已经是主流了,这个不用多说。随着移动端和PC端对WebGL等新功能的支持,也让HTML5有了更大的发展空间,我觉得不光是在游戏领域,未来HTML5一定会渗入到各个领域。Unity能够缩短游戏开发周期,但学习成本高CSDN:您最近刚换了工作,现任工作最多接触的是Unity开发,可以说您现在也是一位Unity初学者,请问在学习Unity时,遇到了哪些难题?Lufy:我本身英语比较差,unity的界面是全英文的,所以遇到第一个问题就是打开unity后,眼睛看到的基本都是问号。这个难题我只能自己去查资料、摸索,慢慢学习资料查多了,再多的问号也就变成了文字。我比较喜欢Flash开发,对于Flash的设计理念根深蒂固,所以刚接触Unity时,遇到2D界面的开发,我总是将Flash的思路带入到Unity中,不过经过公司Unity大牛的指点,最终回归正途。此外,Unity还有自己的一套标准,如果只是将以前完全不同领域的思路或做法强加到Unity当中,只会让后期开发变得越来越困难,这也是导致很多Unity开发者失败的原因之一。再一个就是unity太复杂,并不是短时间内就可以掌握的,我接触时间还比较短,现在依然在逐步深入学习当中。CSDN:Unity在3D引擎方面具备卓越的品质和优势,同时也支持2D游戏的开发,您觉得它和HTML5相比,有哪些不同和优劣势?Lufy:其实Unity和HTML5基本没有冲突点,Unity主要是App开发,而HTML5的优势主要是页游开发或者是依赖于WebView的端游开发,这要看公司的产品侧重哪一块了。不过既然问到了,我简单说一下自己对Unity的看法。Unity的优点很多,简单总结的话,主要有以下几个方面:相对于游戏引擎来说,功能非常完善;学习资料丰富,交流社区也很强大,开发案例多;可以在PC端预览,Debug方便;Editor的扩展方便;GUI、以及NGUI等UI组件丰富;多平台支持;可以直接在AssetStore中购买所需素材或组件等。因为以上优点,使用Unity开发,能够有效的缩短游戏的开发周期。当然缺点也有,比如说学习成本比较高,想短时间深入了解Unity是不可能的。CSDN:给我们简单的介绍下日本游戏市场吧?Lufy:这个问题比较大了,我只能简单的说下我对日本手游的一点了解。日本手游中卡牌游戏居多,游戏一般都采取免费下载、内部收费的形势。
日本的手游的发布渠道比较单一,一般只考虑苹果以及谷歌旗下的应用商店就可以了。日本用户消费意识很高,日本人对扭蛋尤其钟爱,其也是日本手游的主要收费方式之一,卡牌类、RPG类、养成类、战略类,无论什么类型,扭蛋几乎无处不在,而且所有人都会大把的往里砸钱。日本手机网速比较快,而且手机上网基本上都是包月形势,所以不用担心游戏流量问题。日本人对手机游戏的狂热程度绝对超出你的想象,路上、电车上、厕所里,任何地方都能看到低头摆弄手机玩游戏的人。这也决定了,能够适应碎片化时间的游戏会比较卖座。CSDN:以后会回国发展吗?怎样看待国内游戏市场的发展?Lufy:这个当然,以后肯定会回到国内发展的。其实我觉得无论国内还是国外,手游开发都将成为未来游戏开发的主流。而且国内有着全世界最大的用户群,很多国外公司都开始进军中国手游市场,把中国当成最大的游戏市场,包括我现在的公司也是。现在智能手机在国内已经很普遍了,而且性能越来越高,再加上微信等各种平台渠道的推广,所以未来国内的游戏市场也就是手游市场,手游市场必将取代PC游戏市场。CSDN:给同样热爱编程游戏的小伙伴们提供一些学习建议吧。Lufy:这是一个老生常谈的问题,之前也有很多人总结过了,我再总结一遍吧。自己多动手,有些东西看一百遍或者听一百遍,也不如自己写一遍理解的透彻。多看代码,现在开源的代码库这么多,这绝对是提高自己编程能力的一个捷径。多跟人交流,有些问题可能自己通过调查解决了,但如果听下其他人的想法,或许会学到更多。尤其在你刚接触到某个新领域的时候,一定要多看书,这个书包括电子书,或者互联网上一些从基础到深入的连载文章。在开发过程中,最忌讳的就是遇到问题不思考就发问,虽然我觉得大家都知道这样不好,但是这类人确实有很多。举个简单的例子,一个对象的某个属性可以设定为两个不同的值,对于会学习的人来说,他会将这两个值分别设定,然后看一下结果有什么不同。而另一部分人,会直接到论坛或者QQ群等地方去问。这就是自学能力差异的体现。若想获悉张路斌更多动态,请关注。
CSDN博客: 新浪微博:
社区之星访谈上期回顾:
更多精彩内容,请点击查看。CSDN社区之星专访栏目,欢迎推荐采访人或自荐,来分享你的成长经历和相关技术,相关信息请发送邮件至:shanmz#csdn.net(#换成@)。
推荐阅读相关主题:
CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
相关热门文章Unity 4.x 2D游戏开发基础教程
淘宝网店购买地址:/item.htm?spm=686.Il2aP&id=&试读文档下载&
第一章下载地址:/s/1mgp3hZq&
第二章下载地址:/s/1hqmn5i8&
第十章下载地址:/s/1qWLjfWw&
合订本下载地址:/s/1i3GDEjb&&&&Unity是一款综合性的游戏开发工具,也是一款全面整合的专业游戏引擎。它可以运行在Windows和Mac OS X下,并提供交互的图形化开发环境为首要操作方式。使用Unity开发的游戏,可以部署到所有的主流游戏平台,而无需任何修改。这些平台包括Windows、Linux、Mac OS X、iOS、Android、Xbox 360、PS3、WiiU和Wed等。开发者无需过多考虑平台之间的差异,只需把精力集中到制作高质量的游戏即可,真正做到&一次开发,到处部署&。&据权威机构统计,国内53.1%的人使用Unity进行游戏开发;有80%的手机游戏是使用Unity开发的;苹果应用商店中,有超过1500款游戏使用Unity开发。&网上有为数众多的2D和3D游戏。稍微关注一下,就会发现2D游戏才是主流,如植物大战僵尸、愤怒的小鸟、打飞机、2048等。而且,问问身边的人让他们印象深刻的游戏是什么,你会惊讶的发现,大部分游戏同样是2D的。&基于以上不可忽略的事实,本书决定着眼于讲解使用Unity开发2D游戏的基础知识,且书中包含了两个生动的2D游戏示例,相信读者会喜欢它们的。&学习所需的系统和软件&安装Windows 7操作系统&安装Unity 4.5.1&目录&第1章 &Unity及其组成的介绍&1.1 &Unity概述&1.2 &项目、资源和场景&1.2.1 &项目&1.2.2 &资源&1.2.3 &场景&1.3 &场景视图的操作&1.3.1 &使用快捷键操作场景视图&1.3.2 &使用Gizmo操作场景视图&1.4 &游戏对象和组件&1.5 &脚本与脚本编辑器&1.5.1 &创建脚本&1.5.2 &脚本编辑器&1.6 &脚本的调试&1.6.1 &调试方法一&1.6.2 &调试方法二&第2章 &材质和纹理&2.1 &材质和纹理的使用&2.1.1 &使用材质&2.1.2 &不同的材料类型&&着色器&2.1.3 &使用纹理&2.2 &应用于2D游戏的材质&2.2.1 &缘由&2.2.2 &技巧一:使用白色的环境光&2.2.3 &技巧二:使用光不敏感着色器&2.3 &纹理使用规则&2.3.1 &规则1:分辨率是2的次方&2.3.2 &规则2:保证&质量&&2.3.3 &规则3:增加阿尔法通道(Alpha Channel)&2.4 &导入纹理&2.4.1 &导入纹理时默认设置介绍&2.4.2 &含有透明信息的纹理&第3章 &着手开发一个简单的2D游戏&3.1 &开始开发2D游戏&3.1.1 &导入纹理资源&3.1.2 &新建材质资源&3.1.3 &修改场景的环境光以及游戏时的屏幕尺寸&3.2 &为场景添加游戏对象&3.2.1 &调整游戏对象的角度&3.2.2 &改变游戏对象的位置&3.2.3 &游戏对象的&碰撞&组件&3.3 &让飞船动起来&3.4 &让飞船发射子弹&3.4.1 &在场景中添加子弹&3.4.2 &游戏时,让子弹在场景中移动&3.4.3 &生成子弹的预设&3.4.4 &设置子弹的发射位置&3.4.5 &在恰当的时机发射子弹&3.5 &让外星飞船动起来&3.5.1 &编写脚本&3.5.2 &设置外星飞船的触发器&3.5.3 &为子弹预设添加刚体组件&3.6 &为游戏添加背景&第4章 &使用编辑器类自定义编辑器&4.1 &编辑器类&4.2 &开始使用编辑器类编写工具&4.2.1 &为项目添加脚本&4.2.2 &创建指定名称的文件夹&4.3 &把工具添加到菜单&4.3.1 &CreateWizard函数&4.3.2 &测试脚本的实现效果&4.4 &读取场景中选择的对象&4.4.1 &在脚本中使用Selection类&4.4.2 &测试脚本的实现效果&4.5 &为工具窗口添加用户输入框&4.6 &完成工具的所有功能&第5章 &图片与几何图形对象&5.1 &2D游戏常用的图片&5.1.1 &精灵&5.1.2 &图块集&5.1.3 &图形绘制中的问题&5.1.4 &设想&5.2 &开始编写编辑器工具&5.3 &设置四边形的轴点&5.4 &指定四边形资源的存放路径&5.5 &生成四边形&5.5.1 &阶段一:创建构成四边形的顶点、UV和三角形&5.5.2 &阶段二:在资源面板中生成四边形&5.5.3 &阶段三:在场景中实例化一个四边形&5.6 &使用四边形生成工具&第6章 &生成纹理图集&6.1 &为什么要使用纹理图集&6.1.1 &降低绘制调用的次数&6.1.2 &便于灵活的使用纹理&6.1.3 &便于管理纹理&6.2 &开始编写生成纹理图集的工具&6.3 &添加组成纹理图集的纹理&6.4 &UV对纹理图集的重要性&6.5 &生成纹理图集&6.5.1 &步骤一:优化输入的纹理&6.5.2 &步骤二:构建纹理图集&6.5.3 &步骤三:保存图集的预置&6.6 &脚本文件TexturePacker代码汇总&6.7 &测试工具的使用效果&第7章 &UV和动画&7.1 &生成一个可停靠的编辑器&7.2 &编辑工具窗口的界面&7.2.1 &添加预置资源选择区域&7.2.2 &添加纹理选择区域&7.2.3 &添加纹理选择的两种方式&7.2.4 &编写用于修改网格对象UV坐标的函数&7.2.5 &添加应用所有设置的按钮&7.3 &工具脚本代码的汇总与使用&7.4 &一个播放动画的平面对象&第8章 &益于2D游戏的摄像机与场景设置&8.1 &摄像机类型:透视与正交&8.2 &世界单元与像素&8.3 &世界单元与像素的转换&8.3.1 &添加纹理和四边形对象&8.3.2 &调整四边形与摄像机的位置&8.3.3 &世界单元:像素 = 1:1&8.3.4 &对齐屏幕和场景坐标的原点&8.4 &纹理图片的完美显示&8.5 &其它有用的设置技巧&8.5.1 &调节深度&8.5.2 &合成视图&第9章 &获取玩家对2D游戏的输入&9.1 &自动检测鼠标单击事件&9.2 &手动检测鼠标单击事件&9.2.1 &鼠标按下的键及其位置&9.2.2 &鼠标点击的第一个对象&9.2.3 &鼠标点击的所有对象&9.3 &修改游戏中的鼠标图标&9.3.1 &准备所需的资源,并做适当设置&9.3.2 &编写脚本&9.3.3 &两个坐标系导致的问题&9.3.4 &查看游戏视图中的效果&9.4 &使用键盘控制鼠标移动&9.5 &对输入的抽象&&输入轴&9.5.1 &了解输入轴&9.5.2 &输入轴在输入过程中的应用&9.6 &来自移动设备的输入&9.6.1 &检测移动设备上的触摸操作&9.6.2 &把触摸操作当作鼠标操作&9.6.3 &有选择的编译代码&第10章 &2D卡片游戏&&记忆大作战&10.1 &游戏设计文档&10.2 &开始着手创建游戏&10.2.1 &在资源面板创建文件夹&10.2.2 &创建一个纹理图集&10.2.3 &创建四边形对象&10.2.4 &修改四边形的材质和UV&10.2.5 &设置摄像机和游戏视图的分辨率&10.3 &设置场景中的卡片&10.3.1 &设置卡片的属性&10.3.2 &定位卡片的位置&10.3.3 &编写控制卡片行为的脚本&10.3.4 &补全场景中其余的卡片&10.4 &游戏管理类&10.4.1 &重置卡片&10.4.2 &处理玩家输入&10.4.3 &响应玩家输入&10.4.4 &游戏管理类代码汇总&10.5 &完善并运行游戏&10.5.1 &替换系统鼠标图标&10.5.2 &游戏运行效果展示&第11章 &可联机玩的游戏&&记忆大作战&11.1 &网络连接&11.2 &建立服务器端&11.3 &建立客户端&11.4 &测试网络连接的功能&11.5 &网络视图组件&11.6 &构建授权服务器&11.7 &建立游戏输入操作的秩序&11.7.1 &游戏启动时,禁止输入操作&11.7.2 &连接建立后,允许服务器端的输入操作&11.7.3 &服务器端远程调用客户端上的函数&11.7.4 &客户端远程调用服务器端上的函数&11.8 &修改游戏管理类脚本&11.9 &游戏运行效果展示&11.10 &为游戏添加分数记录&第12章 &优化游戏的方法&12.1 &最优化,如你所想吗?&12.2 &减少顶点的数目&12.3 &减少材质&12.4 &减少UV接缝&12.5 &不同平台下,纹理的不同设置&12.6 &对象缓存组件&12.7 &避免频繁使用Update()函数&12.8 &合理使用Collider组件&12.9 &避免使用OnGUI()和GUI类&12.10 &使用静态批处理&12.11 &使用天空盒子&使用Unity创建2D游戏
本文主要译自。
简介在这篇文章中,将讲解怎样使用C#和Unity创建移动2D游戏。将使用Unity杜比音频插件展示游戏音频体验。游戏很简单,到达另外一边,躲避敌人,收集金币。
在这篇文章中,将学习Unity游戏开发的以下方面:
在Unity中设置2D项目
创建Prefabs(预设)
移动和动作的按钮
运用物理碰撞
使用sprite sheet(精灵表)
集成杜比音频API
步骤和说明以下一共34个步骤。
我使用的Unity版本是:4.3.4f1
1. 创建新的Unity项目打开Unity,在File菜单中选择New Project,打开新项目对话框:
设置项目保存的路径
设置为2D项目
2. 构建设置创建项目后,会进入Unity用户界面。
在File菜单中选择Build Settings,然后选择Android作为目标平台。
3. 设备当开发2D游戏的时候,第一件事情是选择平台,之后就是选择艺术素材的尺寸。因为Android是开放的平台,因此市场上,有各种设备,它们有各不相同的屏幕分辨率和像素密度。比如以下是比较常见的:
Samsung Galaxy SIII: 720px x 1280px, 306 ppi
Asus Nexus 7 Tablet: 800px x 1280px, 216 ppi
Motorola Droid X: 854px x 480px, 228 ppi
虽然本文使用的是Android平台,但使用相同代码,可构建到Unity支持的其他目标平台上。
4. 导出图为了适应使用的设备,你可能需要将艺术素材转换为推荐的尺寸和像素密度。这件事情可以用你喜欢的图片编辑器完成。
我使用Mac OSX,预览就有这个功能,菜单项在这里:
然后在这个对话框里设置转换的参数:
5. Unity用户界面在开始之前,还需要调整一下Unity界面。
设置场景为2D(默认是3D的):
另外,可在Game控制面板里设置分辨率:
6. 游戏界面
游戏界面和直白。上面截图,可让你了解到艺术粗才最终在游戏界面的样子。后续文章将给出艺术素材的源文件。
7. 编程语言在Unity中,可选的编程语言有3种:
UnityScript,一个JavaScript的变种
以上语言各有利弊,你需要根据自己喜好选择其中的一种。
文章作者选择了C#,我打算先按照作者的C#过一遍,然后再用UnityScript替代。
如果选择其他语言,可参阅。
8. 2D图Unity是一个在不同平台上创建3D游戏的著名平台,比如微软的Xbox360,任天堂的Wii,Web,以及其他移动平台。
不过,在Unity4.3版本以后,它也可用于2D游戏开发。因为是2D游戏,我们将使用图片作为精灵表,而不是使用3D游戏中的材质。
9. 音效本文将使用一系列声音创建良好的游戏音效。本文中使用的音效来源于:
10. 导入Assets在写代码之前,需要加入asserts到Unity项目中。可使用以下几种方式之一:
在Assets菜单中选择Import New Asset
将assets条目加入到项目的assets文件夹中
将assets拖拽到项目窗口中
我一般用最后一种。
这一步做好,就可在Project面板的Assets文件夹中看到这些assets。
11. 创建场景将对象拖拽到Hierachy面板或者Scene面板中,就会创建默认场景。
另外,只要在创建项目后command+s保存,也可以创建默认场景。
12. 背景将背景图片拖拽到Hierarchy面板中,会自动显示在Scene面板中。
我在操作的时候,怎么拽图片,也无法放在Hierarchy面板里去。
后来借助文章,找到问题了:
The Default Behavior Mode defines the default import settings for your project’s art assets. When set to 3D, Unity assumes you want to create a Texture asset from an imported image file (e.g. a .PNG file); when set to 2D, Unity assumes you want an asset of type Sprite. You’ll read more details about Sprite assets and import settings throughout this tutorial.
需要设置:
然后,如果你之前就没有设置项目的这个属性,重新将图片拽到Assets面板中,然后再拖拽到Hierarchy面板中。
另外,需要将Main Camera在Inspector面板中的属性做下修改,透视投影改为正交投影,Size设置为1.58。
13. 地面将地面的素材图,导入到Assets,然后,拖拽到Scence面板中,再微调拼接好。
看起来效果是这样的:
14. 地面碰撞为了让人物在接触到地面时被检测到,我们需要为地面增加Component,Box Collider 2D。
在Scene面板中选择地面,然后打开Inspector面板,点击Add Component按钮,在Component列表中的Physics 2D中选择Box Collider 2D,见下面图:
15. 跳跃按钮我们将使用按钮控制游戏中的主要人物。拖拽跳跃按钮图到Scene面板,然后为它加上Circle Collider2D组件。
完成这步后,可在Game面板看到类似这样的效果:
做到这里碰到了问题,跳跃按钮会在运行时,会隐藏在当前图的后面,我现在的解决办法是:
Order in layer默认都是0,设置为1,就可见了。
16. 跳跃的声音在Scene面板里选择跳跃按钮,然后在Inspector面板里点击Add Component按钮。在Audio里选择Audio Source。
然后需要取消Play on Awake勾选项。再然后做如下操作,见图:
17. 跳跃脚本现在需要创建脚本来控制人物。选择跳跃按钮,点击Add Component按钮,选择New Script,命名脚本为Jump,不要忘记选择C#语言,默认的脚本语言是JavaScript。
系统将自动呼出MonoDevelop作为脚本的IDE。将下面代码粘贴进去:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465using UnityEusing System.Cpublic class Jump : MonoBehaviour{ public float jumpF private GameO
void Start() {
hero = GameObject.Find("Hero");
void Update() {
if (Application.platform == RuntimePlatform.Android)
if (Input.touchCount & 0)
if (Input.GetTouch(0).phase == TouchPhase.Began)
CheckTouch(Input.GetTouch(0).position, "began");
} else if (Input.GetTouch(0).phase == TouchPhase.Ended)
CheckTouch(Input.GetTouch(0).position, "ended");
if (Application.platform == RuntimePlatform.OSXEditor)
if (Input.GetMouseButtonDown(0))
CheckTouch(Input.mousePosition, "began");
if (Input.GetMouseButtonUp(0))
CheckTouch(Input.mousePosition, "ended");
} }
void CheckTouch(Vector3 pos, string phase) {
Vector3 wp = Camera.main.ScreenToWorldPoint(pos);
Vector2 touchPos = new Vector2(wp.x, wp.y);
Collider2D hit = Physics2D.OverlapPoint(touchPos);
if (hit.gameObject.name == "JumpButton" && hit && phase == "began")
hero.rigidbody2D.AddForce(new Vector2(0f, jumpForce));
audio.Play();
} }}
这部分代码很直白。获取hero对象,这是一个GameObject类的实例。我们后面会用到它。然后,我们检测用户是否点击了跳跃按钮,如果是这样,就给hero对象一个力,最后,我们播放跳跃的声音。
为了能立即执行这个代码,比如在andorid下,我屏蔽了部分还用不上的代码,比如创建hero对象。
做到这一步,我们就可以通过Build & Run部署到Android设备上运行了。或者直接在Game视图中运行。目前的一个问题是,只要点击了跳跃按钮,声音就开始不停的重复播放。需要做如下设置:
18. 移动按钮在界面中添加按钮asserts,左和右。
其实2个按钮是同一个图片asserts,需要将图形做一个转换:
19. 移动脚本创建一个新的脚本,名为MoveLeft,附加在向左移动的按钮上:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677using UnityEusing System.Cpublic class MoveLeft : MonoBehaviour{
public Vector3 moveSpeed = new Vector3();
private bool moving = false;
private GameObject[]
private GameO
void Start()
scene = GameObject.FindGameObjectsWithTag("Moveable");
bg = GameObject.Find("Background");
void Update()
if (Application.platform == RuntimePlatform.Android)
if (Input.touchCount & 0)
if (Input.GetTouch(0).phase == TouchPhase.Began)
CheckTouch(Input.GetTouch(0).position, "began");
} else if (Input.GetTouch(0).phase == TouchPhase.Ended)
CheckTouch(Input.GetTouch(0).position, "ended");
if (Application.platform == RuntimePlatform.OSXEditor)
if (Input.GetMouseButtonDown(0))
CheckTouch(Input.mousePosition, "began");
if (Input.GetMouseButtonUp(0))
CheckTouch(Input.mousePosition, "ended");
if (moving && bg.transform.position.x & 4.82f)
for (int i = 0; i & scene.L i++)
if (scene [i] != null)
scene [i].transform.position += moveS
void CheckTouch(Vector3 pos, string phase)
Vector3 wp = Camera.main.ScreenToWorldPoint(pos);
Vector2 touchPos = new Vector2(wp.x, wp.y);
Collider2D hit = Physics2D.OverlapPoint(touchPos);
if (hit.gameObject.name == "LeftButton" && hit && phase == "began")
moving = true;
if (hit.gameObject.name == "LeftButton" && hit && phase == "ended")
moving = false;
} }
这里要提到,tag(标签),是操作多个GameObject(游戏对象)的方法。我们可以在Unity界面中给多个游戏对象,比如floor(地面)和Background(背景)对象标识为Moveable的标签。
这样,如果我们需要Hero(英雄)移动的时候,可以反方向移动floor(地面)和Background(背景)。
tag是需要添加的:
添加后就可以这样设置tag:
类似的,我们可以创建MoveRight脚本,将它附加在向右移动的按钮上。代码类似这样:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126using UnityEusing System.Cpublic class MoveRight : MonoBehaviour{
public Vector3 moveSpeed = new Vector3();
private bool moving = false;
private GameObject[]
private GameO
public AudioClip completeS
private GameObject[]
private GameObject completeT
private bool ended = false;
public Font goodD
void Start()
scene = GameObject.FindGameObjectsWithTag("Moveable");
bg = GameObject.Find("Background");
buttons = GameObject.FindGameObjectsWithTag("Buttons");
void Update()
if (Application.platform == RuntimePlatform.Android)
if (Input.touchCount & 0)
if (Input.GetTouch(0).phase == TouchPhase.Began)
CheckTouch(Input.GetTouch(0).position, "began");
} else if (Input.GetTouch(0).phase == TouchPhase.Ended)
CheckTouch(Input.GetTouch(0).position, "ended");
if (Application.platform == RuntimePlatform.OSXEditor)
if (Input.GetMouseButtonDown(0))
CheckTouch(Input.mousePosition, "began");
if (Input.GetMouseButtonUp(0))
CheckTouch(Input.mousePosition, "ended");
if (moving && bg.transform.position.x & -4.8f)
for (int i = 0; i & scene.L i++)
if (scene [i] != null)
scene [i].transform.position -= moveS
if (bg.transform.position.x &= -4.8f && ended == false)
Alert("complete");
void CheckTouch(Vector3 pos, string phase)
Vector3 wp = Camera.main.ScreenToWorldPoint(pos);
Vector2 touchPos = new Vector2(wp.x, wp.y);
Collider2D hit = Physics2D.OverlapPoint(touchPos);
if (hit.gameObject.name == "RightButton" && hit && phase == "began")
moving = true;
if (hit.gameObject.name == "RightButton" && hit && phase == "ended")
moving = false;
public void Alert(string action)
ended = true;
completeText = new GameObject();
completeText.AddComponent("GUIText");
completeText.guiText.font = goodD
completeText.guiText.fontSize = 50;
completeText.guiText.color = new Color(255, 0, 0);
if (action == "complete")
AudioSource.PlayClipAtPoint(completeSound, transform.position);
completeText.guiText.text = "Level Complete!";
completeText.guiText.transform.position = new Vector3(0.24f, 0.88f, 0);
} else
completeText.guiText.text = "Game Over";
completeText.guiText.transform.position = new Vector3(0.36f, 0.88f, 0);
bg.GetComponent&AudioSource&().Stop();
for(int i = 0; i & buttons.L i++)
buttons[i].renderer.enabled = false;
Invoke("restart", 2);
void restart()
Application.LoadLevel(Application.loadedLevel);
}}
这里的Alert函数用来创建提示玩家的信息,并播放附加在对应背景对象的声音。然后让所有按钮隐藏,然后间隔2秒后重新开始游戏。
TODO 这里播放声音需要解释
20. 精灵表我们将使用精灵表(sprite sheet)展现游戏的其他元素。Unity有一个精灵表编辑器,使得设置精灵表变得很容易。
精灵表是一张图:
这张图来源于:
需要将它导入到Unity,成为asserts。然后,在Inspector面板中设置它为Multiple,默认是Single:
然后,点击Sprite Editor按钮,在弹出的对话框里点击Slice,这是自动识别精灵表的每个元素:
这之后,精灵表看起来就是这样的了:
21. 英雄然后,我们就可以从精灵表中将英雄拖拽到Scene视图中:
然后,给它加上Collider 2D组件,这是原文的写法,不过有多种Collider 2D组件,我先使用Box Collidar 2D组件,如果以后发现不妥再修改。
22. 英雄2D刚体为了能对英雄检测碰撞,需要至少给碰撞的一方设置位RigidBody 2D组件。也就是2D刚体。我们给英雄设置一下这个组件。
我们不希望英雄在碰撞后发生角度变化,因此需要勾选Fixed Angle:
如果地面当时忘记设置Box Collider 2D,那么设置RigidBody 2D后,英雄会掉落而不是站在地面上。
这时候,可以运行一下这个游戏,看是否能借助前面跳跃的脚本,让英雄跳跃起来。
23. 英雄的声音当英雄被敌人击中,我们要为游戏玩家播放另外一个声音。首先需要加入这个声音,和跳跃按钮添加声音类似。
24. 收集金币收集金币,是很多2D游戏有的需求。我们需要在游戏中多次使用金币。后面我们会将金币转换为Prefab(预设),这样就可以在所有需要的地方添加它了。
在这一步,我们还是将金币的图,从Assets中拖拽到游戏场景中,然后像上面类似的为它添加Box Collider2D组件。
25. 金币的声音和添加英雄声音类似,给金币设置声音。
26. 金币的脚本和Prefab(预设)和跳跃脚本的添加方式类似,代码是:
123456789101112131415161718using UnityEusing System.Cpublic class GrabCoin : MonoBehaviour{
void OnTriggerEnter2D(Collider2D other) {
Debug.Log("play sound....");
if (other.gameObject.name == "Hero")
audio.Play();
Destroy(gameObject.collider2D);
gameObject.renderer.enabled = false;
Destroy(gameObject, 0.47f);
} }}
另外,别忘记给金币设置为trigger:
否则当英雄碰撞金币的时候不会触发OnTriggerEnter2D方法。
然后是将这个金币生成为Prefab,操作很简单,只需要将Hierarchy面板中的coin拖拽到下面的Assets中即可。
27. 敌人和上面操作类似,添加敌人:
需要为敌人创建2个Collider 2D,下面的是检测敌人碰到英雄的(失败),另外一个放在敌人头上,用于检测英雄从上面下来碰撞到敌人(敌人被杀死)
不要忘记勾选Is Trigger
然后是添加脚本,见下面
最后,将敌人设置为Prefab
123456789101112131415161718192021222324252627282930313233343536373839404142using UnityEusing System.C public class Enemy : MonoBehaviour{
public Vector3 moveS
public AudioClip hitS
public GameObject alertB
void Start()
void Update()
transform.position -= moveS
void OnCollisionEnter2D(Collision2D other)
if (other.gameObject.name == "Hero")
AudioSource.PlayClipAtPoint(hitSound, transform.position);
Destroy(gameObject);
void OnTriggerEnter2D(Collider2D other)
if (other.gameObject.name == "Hero")
other.gameObject.audio.Play();
Destroy(other.gameObject.collider2D);
other.gameObject.renderer.enabled = false;
Destroy(other.gameObject, 0.626f);
alertBridge.GetComponent().Alert("gameover");
}}
28. 砖头砖头的逻辑比较简单,无非是:
添加Collider 2D组件
转换为Prefab
29. 结束最后,我们需要创建一个重点游戏对象。当英雄碰到它触发完成游戏。
30. 杜比音频插件略。
31. 测试略。
32. 播放器设置略。
33. 图标和开场画面略。
34. 构建和播放略。

我要回帖

更多关于 unity 5 2d游戏开发 的文章

 

随机推荐