unity怎么让游戏unity3d让物体旋转执行另一个指定的活动后在继续当前活动

当前位置: >>
一个基于Unity3d游戏引擎的体感游戏研究与实现
中山大学硕士学位论文一个基于 Unity3d 游戏引擎的体感游戏研究与实现中山大学硕 士 学 位 论 文一个基于 Unity3d 游戏引擎的体感游戏研究与实现专业名称: 软件工程? 作者姓名: 吴志达?? 指导老师: 陈有青??二○一二年六月 论文原创性声明本人郑重声明:所呈交的学位论文,是本人在导师的指导下,独立进行研究 工作所取得的成果。 除文中已经注明引用的内容外, 本论文不包含任何其他个人 或集体已经发表或撰写过的作品成果。对本文的研究做出重要贡献的个人和集 体, 均已在文中以明确方式标明。 本人完全意识到本声明的法律结果由本人承担。学位论文作者签名: 日期: 年 月 日 一个基于 Unity3d 游戏引擎的体感游戏研究与实现摘 要论文题目:一个基于 Unity3d 游戏引擎的体感游戏研究与实现 专 业:软件工程硕 士 生:吴志达 指导教师:陈有青 副教授摘要近年来,游戏的形式越来越丰富,作为其中之一的体感游戏逐渐受到人们的 关注。 体感游戏一出现就颠覆了游戏单调的操作,使得人机互动的模式展现得更 完美。 微软推出的 XBOX360 体感外设 Kinect, 已经在家用机上取得巨大的成功。 玩家在玩游戏时不再需要外部控制器的支持, Kinect 可以依靠摄像头捕捉玩家在 三维空间的运动,这大大简化了游戏的操作。 当前,体感游戏还没能够在投币游戏机和家庭游戏机中推广,原因在于体感 游戏在这些平台上还没有丰富的游戏产品,绝大部分的体感游戏都依赖于 XBOX360 主机。微软在 2012 年初发布了供 PC 平台商用的开发工具包,不少开 发者已经使用 OpenNI 为 Kinect 提供了驱动支持, 但是现在还没有出现成熟的游 戏。 为了解决这些问题, 本文使用 Unity3d 开发一款使用 Kinect 外设的体感游戏, 为使用 Kinect 开发体感游戏的开发者提供参考。在基础研究部分,阐述了使用 Unity3d 开发游戏需要的设计方法和美术效果;探讨了游戏设计的知识要点;类 比了体感游戏不同的实现方法,得出他们的优劣。在实现部分,结合 Unity3d 引 擎设计了游戏的主要框架结构, 设计了不同游戏模块的具体实现;研究了游戏高 级图形用户界面的实现、 游戏补间动画的内部实现;对传统游戏的开发方法进行 了改进,并针对体感游戏提出了不同的开发方法;最后把 Kinect 和 Unity3d 完 美地结合起来,同时支持 OpenNI 和 KinectSDK。本文设计和实现了一个体感游 戏,经过测试,使用 Unity3d 结合 Kinect 实现体感游戏是可行的,同时表明使 用其他设备实现体感游戏也是可行的, 本文可以为希望使用 Unity3d 进行体感游 戏开发的开发者提供实例参考。 关键词 :Kinect、体感游戏、Unity3d、游戏系统、游戏引擎I 一个基于 Unity3d 游戏引擎的体感游戏研究与实现AbstractTitle:Research and Implementation of a Somatic Game Based on the Unity3d Game EngineMajor: Name: Supervisor:Software Engineering Zhida WU Prof. Chenyou QingAbstractIn recent years, the form of playing games became more and more rich. People pay more attention to the Somatic game gradually. Somatic game appeared to subvert the game’s monotonous operations, making human-computer interaction concepts become more perfect. Microsoft's XBOX360 Somatic peripheral Kinect, has been a huge success since it released. The players playing the game no longer need the support of an external controller. Kinect can rely on the camera to capture the movement of players in the three-dimensional space, which greatly simplifies the operation of the game. Somatic game have not been able to promote in coin-operated games and home consoles because of the Somatic games on these platforms do not have a wealth of game products, most of the Somatic game are dependent on the XBOX360 console. Microsoft in early 2012 release the Kinect development kit for the PC platform, however, the toolkit is not yet complete. Many developers are already using OpenNI to provide driver support for the Kinect, but this has not yet been applied to a mature game. To solve the problems mentioned above, this paper use unity to develop a Somatic game using the Kinect sensor. This paper first discusses the basic methods to design a Somatic game and the art effects used in the somatic game. The article explains the basic knowledge of key points of the game design, and the ways on how to combine Unity3d to carry out on these points. In the specific game, discuss the module design of the somatic game, and use analogy analysis method to draw their strengths and weaknesses. In the specific module design part, combines Unity3dIII 一个基于 Unity3d 游戏引擎的体感游戏研究与实现Abstractengine to design the framework of the game, and achieve the basic functionality of the game, including the physics system, particle system and the animation system. This somatic game use OpenNI as a framework to drive the Kinect sensor. However, it also support the Microsoft Kinect SDK.This paper investigates the possibility to make it runnable.This paper discusses the process to make a somatic game based on unity3d. The game uses the kinect sensor as an input device, which can be driven by OpenNI or Kinect SDK. This paper put forward views on the game's advanced features module and bring forward the way to make unity3d to use Kinect as a sensor for playing game. Most importantly, this paper provides a reference for developers who want to use Unity3d to develop somatic games. Keywords: Kinect, somatic game, Unity3d, game system, game engineIV 一个基于 Unity3d 游戏引擎的体感游戏研究与实现目 录目摘录要 ..................................................................................................................... IAbstract ................................................................................................................. III 目 录 .................................................................................................................... V第一章 绪论 ...........................................................................................................1 1.1 课题背景和研究意义................................................................................. 1 1.2 项目背景介绍 ............................................................................................ 2 1.3 论文主要工作 ............................................................................................ 3 1.4 论文的组织结构 ........................................................................................ 4 第二章 开发游戏所需的知识系统.........................................................................7 2.1 游戏策划的重要性..................................................................................... 7 2.2 制作游戏使用的程序技术 ........................................................................ 11 2.3 提升游戏的美术效果............................................................................... 17 2.4 游戏音效 .................................................................................................. 29 第三章 Unity3d 体感游戏设计 ............................................................................ 31 3.1 框架结构 .................................................................................................. 31 3.2 基础功能系统 .......................................................................................... 37 3.3 高级功能系统 .......................................................................................... 43 第四章 主要功能模块的实现 .............................................................................. 51 4.1 高级图形用户界面的实现 ....................................................................... 51 4.2 补间动画系统 .......................................................................................... 55 4.3 联机游戏 .................................................................................................. 57 4.4 游戏展示 .................................................................................................. 59 4.5 总结.......................................................................................................... 63 第五章 Kinect 和 Unity3d 的结合 ........................................................................ 65 5.1 体感框架 .................................................................................................. 65 5.2 模块实现 .................................................................................................. 66 5.3 同时支持 OpenNI 和 KinectSDK .............................................................. 69V 一个基于 Unity3d 游戏引擎的体感游戏研究与实现目 录5.4 Kinect 接入游戏 ...................................................................................... 70 第六章 总结与展望.............................................................................................. 73 6.1 总结.......................................................................................................... 73 6.2 展望.......................................................................................................... 74 参考文献 ............................................................................................................... 75 致 谢 ................................................................................................................... 79VI 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第一章 绪论第一章 绪论本文主要研究体感游戏的设计与实现。体感游戏作为一种新兴的游戏类型, 已经得到越来越多人的关注。本文对当前体感游戏这个热门的课题进行研究,对 体感游戏的设计思路与实现方法进行了探讨。 在本章中,主要对体感游戏进行一 个大致的介绍,对国内外体感游戏的发展现状进行分析;对本人的论文工作和文 章的组织结构进行说明。1.1 课题背景和研究意义下面对本文的课题背景和研究意义进行说明。1.1.1 当前游戏行业介绍游戏产业作为一门新兴的娱乐产业,已经在世界范围内得到迅猛的发展。玩 家进行游戏时, 对游戏的操控性与游戏的代入感的要求也逐渐提高。体感游戏作 为一种依托于新技术的游戏, 不需要外置的游戏控制器,因此凭借其操控性以及 可玩性得到越来越多的玩家欢迎[1]。世界知名的游戏品牌公司都在自己的游戏中 添加了自然用户交互的支持, 把体感游戏推广到家庭用户,让越来越多的玩家可 以感受得到体感游戏的快乐,体感游戏是当前视频游戏发展的方向。1.1.2 体感游戏行业的发展与现状目前,在国内外使用 Unity3d 进行游戏开发的人员都很多,但是在体感游戏 即将成为游戏市场主流的现在,国外还没有成功使用 Unity3d 开发过基于 PC 的 体感游戏,各大公司也仅仅是在微软的 XBOX Slim 下提供了一些游戏的展示效 果,并没有在 PC 上成功发行基于 Kinect 的体感游戏,体感游戏的开发还没有十 分成熟[2]。 在国外的著名游戏展 E3 以及最近的德国科隆游戏展上,各大游戏公司都提 供了最新的体感游戏支持,体感游戏即将成为未来游戏的主流,在这个阶段,体 感游戏让我们看到了巨大的机遇与挑战, 如果能够在 PC 上使用 Kinect 开发出一 款体感游戏,那么获得的收益是巨大的。1 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第一章 绪论国外的开发者在体感游戏上的研究还处在探究阶段, 在开发出来的展示上也 没有提供十分完善的游戏支持,还处在 Demo 的阶段,没有开发出完整的成品, Kinect 作为一个划时代的设备,还具有继续研究学习的潜力;国内的开发者考虑 到市场因素, 大多数还处在观望的状态,仅有一些关心的开发者开发出来一些小 的 Demo,与国外有一定的差距。1.1.3 研究意义本文研究基于 Unity3d 的体感游戏的开发[3]。 Unity3d 作为一款通用的游戏引 擎,在游戏的多个平台上都有很多的应用,在国内外使用十分广泛。至今为止, 还没有使用 Unity3d 进行跨平台体感游戏开发的案例,国内外的开发者都还在对 体感游戏在 PC 上运行进行探索学习,体感游戏还处在不断发展的阶段 [4] 。 Microsoft Kinect SDK 是微软在 2012 年 2 月发布的开发人员使用的 SDK,还处 在商用测试阶段,提供了包括 NUI 以及声控的支持,在未来是体感游戏开发的 重要工具包,当前并没有成功的案例[5]。本文在分析 Unity3d 的对外通信接口以 及 Unity3d 插件的基础上, 针对当前微软提供的 Kinect 体感设备, 类比了 OpenNI 中的一些体感游戏实现的常规方法, 使用 Unity3d 作为游戏引擎, Microsoft Kinect SDK 以及 OpenNI 作为开发工具进行体感游戏开发[6]。旨在为未来体感游戏的开 发提供最新的研究方向, 为研究体感游戏的开发者提供研究资料和成果,推动体 感游戏在国内的发展,具有创新以及借鉴参考的意义[7]。1.2 项目背景介绍本论文以中山大学动漫实验室对未来体感游戏类型研究为背景, 寻找实现一 款体感游戏的最佳解决方案, 目的是为了推动游戏的发展,同时对新的游戏类型 进行探索。 本项目结合使用最新的技术,同时使用了最新的游戏引擎 Unity3d[8],开发 一款基于 Unity3d 的体感游戏。游戏具有十分丰富的游戏系统,以实现一款跨平 台的体感游戏为目标,游戏有丰富的角色、对抗以及任务系统,提供十分优秀的 物理引擎碰撞效果,绚丽的粒子效果,用于开创国内体感游戏的先河,不断缩小 与国外体感游戏的水平差距。2 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第一章 绪论项目使用了当前十分热门的游戏引擎 Unity3d,计划实现基本的游戏联机系 统,游戏客户端能够提供十分优秀的游戏效果,不同的游戏动态环境,还能够支 持 Kinect 输入的游戏系统。1.3 论文主要工作我在开发体感游戏的过程中担任主程序和美术项目负责人, 主要内容包括制 作游戏所需要的美术素材, 然后使用程序把这些美术素材应用到制作的体感游戏 中,同时自己完成了游戏部分数值策划的工作。 ? 我在游戏制作前期的工作: 1. 调研了当前体感游戏发展的现状,对比了当前体感游戏发展的情况,了 解了当前不同厂商体感游戏效果。 2. 对使用 Unity3d 开发游戏所需要的关键技术,如游戏策划、游戏模型制 作和动画模型制作进行研究,同时对游戏程序使用方法进行对比。 3. 对于游戏的实用性和有效性进行了调研,研究了当前市场对体感游戏的 需求。 ? 我在游戏程序部分的工作: 1. 设计了游戏的整体框架。 2. 在游戏程序部分,完成了游戏的逻辑脚本编写,内容涉及到游戏的主要 玩法、关卡逻辑。 3. 完成游戏基本模块的整合,对游戏的各个基础模块进行分析设计。编写 游戏的部分高级模块,对原有的高级模块部分基础插件进行扩展以适应 游戏的具体需求。 4. 编写游戏中功能模块对应的脚本。 5. 编写 Kinect 接入 Unity3d 的输入部分,编写 Unity3d 中与 Kinect 之间进 行数据传输部分的插件,封装了 KinectSDK 和 OpenNI 的底层 API,为 Unity3d 提供了 Kinect 控制的输入支持。 6. 完成了一款体感游戏的设计与实现,对游戏进行最后的测试,对游戏进 行最终完善。 7. 把自己的技术应用到其它已经制作好的游戏中,为不同的游戏添加体感3 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第一章 绪论的支持。 ? 我在游戏美术方面的工作: 1. 使用 3dMax 进行游戏建模,使用 Photoshop 进行角色贴图的绘制,制作 了不同的粒子效果贴图,对场景中的游戏模型和角色模型进行建模,并 添加对应的骨骼动画。 2. 对 Vray、FinalToon、Pencil+等三项 3dMax 插件进行学习,使用这些渲 染插件制作一些序列帧。 3. 制作游戏的 UI 界面和其它系统的美术素材。 ? 我在数值策划方面的工作 1. 为游戏的逻辑添加数值支持。 2. 测试游戏的平衡性,同时修正游戏的数值计算公式。 我在完成这个体感游戏的过程中,对游戏策划、游戏美术、游戏程序有全面 的掌控,对每一个方面都进行了深入的学习和研究。在程序部分,我在设计游戏 框架之前,阅读了多个开源的 Actionscript 游戏引擎,仔细分析了它们的设计思 想。在使用 Unity3d 的过程中,学习了主流的插件模块 10 余个,从它们的源码 中学习到了很多不同的模块设计思想, 对自己游戏中需要和可以改进的模块进行 了不断地改进。在程序部分,自己最后编写的代码共计 80 多个文件,20000 余 行。在美术部分,自己完成的贴图共计 200 多张,模型 100 多个,还有部分从以 前的项目中拿来直接使用的模型 200 多个, 美术部分还完成了部分角色的动画绑 定。在策划部分,我阅读了国外和国内关于游戏策划的书籍 8 本,还在国外著名 网站 gamasutra 参考了大量的游戏策划玩法的文章。在完成游戏之后,我测试了 自己实现的体感游戏, 把自己的代码应用于以前已经完成的游戏中,为它们添加 了 Kinect 体感的支持。1.4 论文的组织结构本文研究了一款基于 Unity3d 游戏引擎的体感游戏的开发方法,介绍了体感 游戏的主要技术实现和研究成果。本文的章节组织结构如下: 第一章为绪论部分,主要对体感游戏进行一个大致的介绍,分析了国内外体 感游戏的发展,对本人的论文工作进行说明,列出了文章的组织结构。4 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第一章 绪论第二章涉及到游戏中需要的主要技术,包括如何设计一款游戏,在制作游戏 的过程中,都需要涉及到哪些方面的知识系统。对游戏中的策划、美术、程序流 程都进行了分析。 第三章对体感游戏的设计进行分析,首先介绍了游戏的框架结构,然后介绍 了框架中需要实现的基础功能模块、高级功能模块,并对这些模块需要实现的功 能进行了设计。 第四章着重介绍了游戏中的高级功能模块的实现,从技术角度分析了实现这 些模块的方法,对具体实现进行了展开,最后对游戏进行了一些截图,用于展示 游戏效果。 第五章主要对游戏的自然用户输入模块 Kinect 的接入进行分析,涉及到 Kinect 的外部接入方式,如何编写模块以达到使用 Kinect 的目的,并对 Unity3d 中使用 Kinect 的方法进行了探讨说明。 第六章是对作者全部论文工作的总结,并对未来体感游戏的发展,体感游戏 的研究方向进行展望。5 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第一章 绪论6 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第二章 开发游戏所需的知识系统第二章 开发游戏所需的知识系统制作一款游戏,需要四个游戏部门的分工合作。他们分别是游戏策划部门、 游戏程序部门、游戏美术部门、游戏音效部门。游戏制作作为一个系统的工程, 其实现也是十分繁琐和复杂的。 本章将对其实现进行分析阐述,并提出改进的方 法。2.1 游戏策划的重要性游戏制作团队,分工主要如下图 2-1 所示:图 2-1 游戏的组织与分工一款游戏的制作,首先是由策划组提出设计思路,写出策划文案,然后得到 各部门认可,最终立案才能够开始进入游戏的开发阶段[9]。 游戏策划需要涉及到内容的也是十分丰富的, 游戏策划作为游戏创意的提出 者,需要对游戏创意进行丰富与加工,使得一个好的创意能够成为现实,这是需 要漫长的过程来实现的[10, 11]。优秀的游戏策划可以把好的创意做的更好,也可以 把不好的创意加以改造, 让它成为可以成为游戏的创意,所以游戏策划的创意部 分至关重要[11]。我在制作游戏的过程中,十分重视游戏策划工作,认为一款好的 游戏, 必须要有十分优秀的策划案作为支持,这样在进入游戏制作后才不会出现7 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第二章 开发游戏所需的知识系统问题。因为一旦出现问题,原始的策划案能够作为最终的参考,让团队能够保持 稳定的心态, 坚信游戏的制作必然能够成功。游戏策划案的作用我认为主要有两 种:一、游戏策划案让一款游戏在还没开始正式进入制作前,就已经能够确定是 否能够成功。二、游戏策划案作为一个设计文档,从游戏制作开始到游戏完成, 从头到尾指导着游戏的制作流程,这一个流程得到不断地细化与完善,最终形成 一个游戏开发的规范,保证游戏开发的稳定,降低游戏开发的风险。如下图就是 我在制作一款手机游戏时编写的初始设计文档,涉及到游戏的各个方面。游戏的 创意设计总纲是我在制作游戏的过程中经过多个游戏的制作过程的考验, 不断修 改以及完善写出来的游戏设计需要思考的内容。其中包括游戏设计的核心原则、 游戏的源想法、游戏的基本玩法、游戏的可选玩法、游戏实现的工具、游戏开发 的过程、游戏的质量控制、游戏的推广几个部分。下图 2-2 为创意设计的总纲:图 2-2 游戏的创意设计总纲游戏的设计核心原则涉及到游戏的设计思路和必须要遵守的原则, 在设计的 过程中,绝对不可以违背的设计原则,一旦设计与这些原则有冲突,需要重新设 计。 游戏源想法部分需要对游戏的最初创意进行分析, 不仅要提出游戏的最初创 意, 还要不断地思考一个游戏创意是否可以成为一款游戏,同时要对创意不断地 细化,不断地思考出新的内容,丰富游戏的源想法。 游戏的基本玩法,提出了游戏需要支持的基本玩法,例如,在这款游戏中,8 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第二章 开发游戏所需的知识系统我提出了游戏需要有三种不同的模式,而这三种模式,需要对各自的内容进行细 化,如下图 2-3 所示:图 2-3 游戏设计的基本玩法游戏的实现工具部分, 需要对游戏实现的方法进行思考,需要考虑到的内容 十分多,主要从程序、美术、音效来入手,例如,程序部分需要使用到的游戏引 擎以及功能库实现[12]。 美术方面需要考虑使用的风格和制作方法,例如这是一款 3D 游戏还是 2D 游戏,如果是 3D 游戏,使用的是即时渲染还是使用渲染后再输 出的方法,如果是 2D 游戏,是否需要制作不同的风格,如果是卡通风格,是否 需要为其制作新的 Photoshop 插件,定义图层格式、描边的画笔类型等。下图涉 及到的内容,就是分别从程序、美术以及音效三部分开始进行的。在程序部分, 考虑了使用 Unity3d 游戏引擎作为基础游戏引擎,然后考虑到 Unity3d 支持的游 戏插件,需要编写的游戏插件,并对这些插件进行了详细的分析。例如,需要使 用 EZGUI 以及 SM2 作为输出的插件,就需要对这些插件进行细致的学习,考虑 这些插件对于游戏制作的前中后各个时期不同的影响, 以防止不同的时期出现的 问题拖慢游戏的进度。 在美术部分, 考虑使用 3DMax 配合 Pencil+进行卡通渲染, 再输出到 Unity3d 里进行二次使用的方法[13]。同时,需要对比不同的卡通渲染插 件 Finaltoon 的具体用法与效果,对比出各自不同的优势和不足,考虑不同的方 面,才能够决定是否使用。在游戏的音效部分,不需要做太多的研究,因为这一9 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第二章 开发游戏所需的知识系统部分已经形成了十分具体的流程,只需要指定具体的格式和软件即可。 游戏在完成基本的创意设计之后,需要进入的是详细设计阶段[14],在这个设 计的过程中, 在 Andrew Rollings 编写的 《GAME ARCHITETURE AND DESIGN》[15]中,提出了十分丰富的解答,可以简化成四个方面,如下图 2-4 所示:图 2-4 游戏设计的四层架构[16]四层架构中, 创意部分处在顶层 Concept 部分, 已经在前面叙述了。 在 Concept 的下一部分,需要考虑的 Paradigm 这部分,在这部分中,需要考虑到玩家在玩 游戏的时候,需要持有的游戏心态。简单地说,Paradigm 是指玩家在进行游戏的 过程中, 与游戏世界相互交互形成的一直心态与想法。例如在玩俄罗斯方块的时 候, 设计者需要玩家在玩游戏时有一种基本的空间感,还要有修建建筑的基础感 觉。当然,不同的游戏所持有的 Paradigm 可能相同也可能不同。由 Paradigm 直 接引申出来的是游戏的 Mechanic,也就是游戏的机制,游戏的机制对于非游戏 专业来说十分复杂,所以游戏机制也可以合并为游戏 Feature,也就是游戏特色,10 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第二章 开发游戏所需的知识系统向一般的游戏玩家进行叙述。对于游戏开发者来说,在这一层,需要对游戏的机 制进行十分详细地制作与分析。 因为游戏机制是构成游戏的基本元素,不同的游 戏机制组合起来,给游戏增添了可玩性,让游戏更加丰富,而游戏策划的绝大部 分繁琐工作,也就是集中在游戏机制的设计部分。例如,在俄罗斯方块这款游戏 中,需要设计的机制包括了方块从上到下掉落、掉落的速度不断地提高、随机掉 落等不同的机制, 这些机制都是游戏策划需要设计的内容, 在一个游戏公司里面, 有很多不同职位的策划,例如文案和数值策划等,他们的作用,这里也不再详细 叙述。在最后一层 Interface 里面,涵盖了游戏设计的用户接口设计,一般游戏的 用户接口都是鼠标和键盘,但是由于触摸屏和 Kinect 的出现,让这部分的设计 变得更加丰富,而本文的游戏,涉及到 Kinect 接口,所以 Interface 这部分,应 该也要以 Kinect 接口为基础作为设计。2.2 制作游戏使用的程序技术本文研究的是一款基于 Unity3d 的游戏制作,所以在这里对 Unity3d 适用的 程序技术进行分析,在大多数的情况下,游戏需要的程序技术很多都是相同的, 所以这部分对使用其它游戏引擎进行游戏开发的人来说也同样具有参考意义。 想要理解 Unity3d 的使用方法,需要先理解什么是游戏引擎,游戏引擎对于 开发的作用,可以用图 2-5 进行分析: 游戏引擎是游戏公司在程序开发上工作的基础[17]。任何一项工作,都要围绕 着游戏引擎来进行。游戏引擎在最初期,是为了避免重复性的开发工作产生的, 所以游戏引擎在本质上就是一些游戏开发的核心代码以及主体框架[18]。 这些代码 适用于多种不同的游戏类型,所以可以独立出来用在不同的项目中 戏引擎的重要性是不言而喻的。[19]。因此,游11 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第二章 开发游戏所需的知识系统图 2-5 游戏引擎的作用Unity3d 作为一个当前十分热门的游戏引擎,它的特点在于能够快速地进行 开发,具有十分高的可扩展性。它本身的设计想法也十分直观,自身的构成模式 是基于组合的,比基于继承的游戏引擎更加便利。Unity3d 的脚本不仅能够支持 JavaScript,还能够支持 C#,这就让很多开源的项目可以用于借鉴使用。Unity3d 支持不同的外部插件, 支持使用 C 编写的 Dll 插件, 可以提高代码的重复使用率。2.2.1 游戏引擎使用的脚本游戏引擎一般配合脚本来控制游戏逻辑的进行。游戏脚本包括很多种,例如 python、lua、JavaScript、C#[20]、Boo 等。一般来说,脚本的作用主要是控制游 戏逻辑, 但是也有例外, 在一些游戏引擎里面游戏的脚本也可以用于控制外部插 件以及编写引擎内部实现,丰富游戏引擎的功能。 在 Unity3d 中,脚本可以使用 JavaScript、C#以及 Boo。考虑到 Kinect 是可 以使用 C#进行编码控制的,所以本文在 Unity3d 脚本的选择上,选择使用 C#而 不是官方推荐的 JavaScript。在 Unity3d 中,需要注意到脚本的几个基本要点, 下面本文就对游戏需要注意的几个脚本进行分析:Unity3d 的脚本默认都是继承 自 MonoBehaviour, 所以了解 MonoBehaviour 的内部实现对于编写好的脚本尤为 重要。MonoBehaviour 来源于 Mono 框架,Mono 框架是.Net 的跨平台框架。在 MonoBehaviour 中, 需要理解的几个重要方法, 分别是 Invoke()、 StartCoroutine()、 Update()、LateUpdate()、Awake()以及 Start()。Invoke()在 MonoBehaviour 用于调12 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第二章 开发游戏所需的知识系统用方法的执行, StartCoroutine()用于启动新的协同程序[21], Update()用于控制游戏 的按帧刷新, LateUpdate() 用于游戏的帧刷新的后续处理, Awake() 在每一个 GameObject 上的脚本载入时调用, Start()在 GameObject 被唤醒, 开始进入 Update() 之前调用。 如何使用好这些方法, 对于游戏代码能否最终进行有十分重要的意义。 合理地安排正确的执行顺序,能够让游戏资源得到更加合理的使用。我在使用 Unity3d 的过程中,发现不可以让过多的逻辑放置于 Update()中,因为 Update() 的执行频率是按照不同的帧率来进行的,如果过多的逻辑放置于 Update()中,会 直接导致大部分的计算力,降低帧率。解决方法是使用 StartCoroutine() 。使用 StartCoroutine()可以显著地改进游戏的效率,而且使用 StartCoroutine()能够让原 本十分复杂的代码显得十分优雅,体现出十分优秀的设计思想。 使用 yield 来推迟协同程序的进行,能够让原本进行的程序在停顿一段时间 之后才继续向下进行, 而不需要设置标志来控制程序的进行,极大地改进了程序 代码的可读性。MonoBehaviour 在使用的过程中,必须附加在处于活动状态的 GameObject 上才可以进行,Unity3d 在加载脚本的过程中会自动地调用 New 方 法,用户不可以显示地调用 New 方法,这会让我们的游戏崩溃,对于非继承于 MonoBehaviour 的类来说,则没有这样的限制。2.2.2 提高脚本效率以及可读性的方法我在使用 Unity3d 的过程中,研究了一些能够提高 Unity3d 脚本编写效率的 方法,其中一部分需要依靠 C#的最新的特性,这也是为什么选择使用 C#作为脚 本编写语言的重要原因。Unity3d 当前支持.NET3.5,在最新的 Unity3d 3.5 版本 中,提到可能会支持.NET 4.0,所以一些 C#的特性,可以用于 Unity3d 的代码改 进。这些方法,是我在实际的代码编写中研究得到的经验。 1,使用 delegate 与事件来处理回调事件[22]。例如,在游戏的制作过程中, 我们需要为游戏每一关的关卡结束制作一个事件, 以发布关卡的结束信息。 这样, 我们如图 2-6 可以这样做: 在这里我们可以定制一个游戏结束事件管理器,用于管理游戏结束的事件控 制,当游戏结束的时刻到来时,只需要发布事件,就可以让所有需要接受事件的 对象得到通知, 订阅事件的对象只需要单方面订阅即可,事件管理器也完全不用13 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第二章 开发游戏所需的知识系统知道有谁订阅了它的事件,如图 2-7 所示。需要订阅该事件的对象需要写的脚本 也十分简洁,代码十分优雅:图 2-6 游戏结束事件控制图 2-7 游戏结束事件订阅者图 2-8 显示了二者之间的关系, 管理者对于谁订阅了自己的事件是完全不需 要知道的:14 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第二章 开发游戏所需的知识系统图 2-8 游戏结束事件关系2,使用 Action 添加特殊事件。在 C#中可以使用 Action 为一些方法添加一 些特殊事件。 利用这些方法, 可以让方法执行后, 调用一些方法。 通过使用 Action 定义一个 onComplete 方法,配合使用 yield 来延迟当前协同程序的进行,仅仅使 用几行代码就可以完成同样的功能,而且大大地减少了 Update()中代码的数量, 提高了程序的效率,如图 2-9 所示。图 2-9 使用 Action 处理特殊方法3,使用扩展方法来为默认的类添加方法。在 Unity3d 中,仅仅使用引擎本 身提供的 API 以及功能是不够的,大多数情况下,我们需要添加符合自己游戏 的方法。在使用三方插件的时候,以及开源类库的时候,这样做更显得重要。在 我使用 Unity3d 编写游戏的过程中,经常遇到这样的情况,所以要为一些相关的 类编写扩展方法。例如,下图展示了如何为 AudioSource 编写 FadeSound 功能, 如图 2-10 所示。15 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第二章 开发游戏所需的知识系统图 2-10 为默认类添加扩展方法上述的方法,仅仅是我在使用 Unity3d 制作游戏过程中对于代码质量改进的 部分建议。C#作为一门面向对象的语言,可以使用很多面向对象的思想来解决 Unity3d 编程的过程中所遇到的问题, 例如使用 LINQ 可以大大提高编程的速度, 使用泛型也可以减少重复代码的出现,这些特性,对于优化程序,加速游戏的开 发,都是十分有意义的,对于这些内容,可以从后面的内容以及我编写的代码中 看到,这里不再作过多阐述。2.2.3 Unity3d 几何以及向量模型Unity3d 作为一款 3D 模型,需要深入理解 3 维空间里面的向量转换。在编 写相机转换的过程中, 经常需要运用到局部坐标系和世界坐标系的转换。深入理 解 Unity3d 中的向量平移以及旋转对于完成合理的工作十分重要。 向量是游戏中用于表示物体位置的数学表示方式, 简单的向量平移用于移动 物体, 向量的点乘可以获得方向的投影,一般用于获得特定方向上的速度或者大 小信息。 向量叉乘可以获得垂直向量, 一般用于控制当前物体的方向。 在 Unity3d 中,使用 localPosition 表示当前物体的局部位置,使用 position 表示当前物体的 世界坐标,使用 worldToLocalMatrix 可以方便把一个世界坐标点转换成局部坐 标,使用 translate 可以让物体进行固定旋转的移动。总体来说,在 Unity3d 中移 动物体还是十分简单的, 唯一需要注意的是在移动的过程中相对的是局部坐标系 还是世界坐标系。 Unity3d 使用四元数来处理旋转。四元数的来源这里不作过多阐述,简单地 说,四元数是一种转换比矩阵快,提供平滑差值,但是使用难度比较高的旋转表16 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第二章 开发游戏所需的知识系统示方式[23]。虽然 Unity3d 中使用 Rotate 来控制物体的旋转,但是在使用高级相机 旋转的时候,这一个 API 经常是不够用的,所以,需要使用 Unity3d 提供的四元 数 Quaternions[24]。Quaternions 在 Unity3d 中表示旋转值,在 Unity3d 中处理四元数的方式有 LookRotation(),如果要实现一个旋转的功能,需要计算目标位置到 当前位置的差值,得到一个相对的 3 维向量,然后计算出相对的旋转值,使用 LookRotation() ,控制物体旋转。四元数提供的一个好处就是能够平滑差值, Unity3d 提供了 Slerp()方法,能够从脚本中使用这个方法,控制镜头的旋转。四 元数在控制角色的摄像机移动又十分重要的应用, 最常需要制作的就是不同的摄 像机镜头,控制摄像机镜头能够适应不同环境的脚本。只有深入理解了 Unity3d 中的四元数使用方法,才可以很好地完成脚本的编写。 Unity3d 中的几何以及向量模型,对于一个游戏开发人员十分重要,深入理解 这些模型的细节,才能够写出优秀的、健壮的、可扩展性高的脚本,否则,程序 出现 Bug 也是十分常见的错误。关于我编写的角色的摄像机转换脚本,可以参 考附录的的代码以及实际的项目文件。2.3 提升游戏的美术效果游戏美术作为游戏制作的一个重要方面, 在游戏的最后效果的提升起到十分 显著的作用。优秀的游戏美术可以让游戏更加绚丽和美观,提高游戏的意境,烘 托出游戏的主题,吸引更多的玩家。因此,如何让游戏中的美术效果可以充分发 挥出来, 就成了程序技术需要解决的一个很重要的课题。我在实际的游戏制作过 程中,做过一些 2D 和 3D 的游戏,在完成这些游戏的过程中,我充分理解到美 术对提升游戏质量的重要性,而且不同的游戏对于美术资源的整合都是不同的。 在技术方面, 能够提供给美术的支持有很多方面,一方面要制作便利的美术完成 工具, 例如制作无缝贴图的自动工具,另一方面是制作把美术资源导入到游戏场 景中, 并进行合理压缩的工具, 还有一方面是要对美术资源重要性进行合理的分 类, 以保证游戏的资源得到合理地使用。游戏里面的美术涉及到下面几个主要的 方面:1,游戏的模型数据。游戏的模型包括 3D 场景模型和 3D 的人物模型,本 质上来说,在 3D 的游戏中,无论是场景模型和人物模型,都是存储的点数据, 所以这部分的开销在消耗内存上是不大的,因为对于一个 2000 个面的模型,所17 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第二章 开发游戏所需的知识系统存储的点也只能够达到 200kb 左右, 真正消耗程序资源的其实是场景和角色的游 戏贴图,以及渲染这些场景和人物模型需要的计算量。2,游戏的贴图。游戏贴 图一般就是一张长宽均为 2 次幂的图片,图片格式可以是 psd、png、jpg 等。游 戏的贴图用途很多,游戏的贴图可以用与漫反射贴图、凹凸贴图、法线贴图、环 境贴图、细节贴图等。一般来说,游戏的贴图决定着游戏的绝大部分质量,正因 为如此,游戏贴图的制作是游戏美术的重中之重。3,游戏的动画。游戏动画在 现在的游戏制作中主要分为 2 种,一种是直接使用 3 维的模型,通过脚本控制人 物的动作,例如攻击、跳跃、前进等动作,还有一种是使用 2 维的序列帧,通过 控制帧的不断顺序变化来得到角色的动画效果。二者的区别有很多方面,从性能 上分析,使用前者虽然需要的运算量大,但是占用的内存空间不多,而后者虽然 基本不需要计算, 但是需要在游戏内存里面占用一部分的内存,用于保存已经制 作好的游戏动画。从显示效果上来看,前者的效果与游戏的模型细致程度有关, 后者的显示效果仅仅与最后制作出来的序列帧动画的质量有关, 也就是说对与越 高水平的游戏,如果以提高性能为目标,使用后者显然更加合理。从制作的时间 上分析, 前者制作的时间显然比后者制作需要的时间短,因为后者在大型游戏里 面需要制作的动作十分复杂, 而且还要考虑到镜头固定的问题。从二者使用是否 便捷方面出发, 前者只需要在合适的时刻使用到脚本控制即可,但是后者需要不 断地轮询当前的动画状态,不断地切换动画状态。4,游戏的特效[25]。如图 2-11 所示,游戏特效是指游戏中出现的一些魔法效果、攻击效果、火焰、彩虹等。游 戏的特效可以让原本沉闷的游戏画面显得更加生动,提高游戏的美术效果。游戏 的特效也分为两种不同的方法, 一种使用一般游戏引擎内置的游戏粒子系统,另 外一种是制作游戏需要的序列帧。二者的区别在于,前者通过增加通常用四边形 模拟的粒子模型来模拟粒子效果,后者通过占用内存来实现序列帧的播放。总的 来说, 游戏美术涉及到游戏显示的方方面面,技术方面经常需要和美术的一些内 容联系起来, 如何让游戏程序最大化地支持和优化游戏美术资源,这是游戏制作 领域只有制作过了游戏才会发现的问题。我在制作游戏的过程中,发现随着技术 的不断发展, 游戏美术以及成为吸引玩家进入游戏的最重要手段,所以只有不断 地提高自己游戏的美术水平, 把程序技术和美术效果不断地结合起来,才能够最 大化地优化游戏美术效果,让玩家获得更好的游戏体验。18 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第二章 开发游戏所需的知识系统图 2-11 游戏特效2.3.1 美术资源的细节游戏美术和一般的美术不同, 我甚至认为游戏美术比一般的美术需要更高的 美术水平。 因为游戏美术是需要和游戏可以分配的资源结合起来的,也就是说游 戏美术的目标,就是在有限的资源里面,制作出最优秀的视觉效果。游戏美术的 限制主要包括了空间资源的限制和运算资源的限制。 游戏是极度需要控制游戏硬 盘空间和内存存储空间的,在计算量上,游戏需要实时地显示游戏画面,就需要 很大的计算量, 这些运算力分配给程序方面用于游戏人工智能、游戏逻辑以及游 戏屏幕刷新, 留给美术资源的运算量并不是很多,所以如何能够合理地运用好这 些空间资源和计算资源,就是游戏制作必须要知道的内容。 对于三维游戏来说, 制作模型和贴图占用了很大部分的工作量[26]。 在 Unity3d 中,模型的基本单位是使用米来控制的,这主要是因为 Unity3d 里面的物理引擎 主要是使用米来计算物理效果,使用米来制作 3d 模型,就可以让模型在导入到 Unity3d 里面自动转换成物理模型,用于物理引擎的计算。我在制作游戏的过程 中,一般的做法是,先在 3dMax 里制作好一个长宽高分别为 1*1*1 的正方体, 作为参考,然后用此为参考模型,用于制作 3 维模型。在制作模型时,需要控制19 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第二章 开发游戏所需的知识系统模型的面数,一般来说,可以按照下表 2-1 进行参考:表 2-1 模型的规范网络游戏模型 主角 Boss 小喽 树,草丛等 武器3 级模型面数 3000 面以内 2500 面以内 1000 面以内 500 面以内 200 面以内2 级模型面数 1500 面以内 10000 面以内 500 面以内 2 面以内 80 以内1 级模型面数 500 面以内 300 面以内 100 面以内 1 面以内 20 面以内《魔兽争霸》的模型面数在 500 面左右, 《使命召唤》的模型面数一般都可以在 3000 面,最近号称史上最佳 RPG 游戏《上古卷轴 5》模型面数在 4500 以上。模 型的细致程度只是一定程度上反映出游戏模型最后的渲染效果, 游戏玩家主要是 看到游戏的边是否有曲折, 模型的平滑程度,至于模型最后在玩家心中能够称得 上是一个好模型,主要还是根据游戏贴图来实现,如下图 2-12。游戏贴图控制了 游戏显示的细致程度,所以游戏贴图对于展示游戏的细节具有不可替代的作用。 这也是为什么游戏贴图占用了绝大部分游戏空间的原因。图 2-12 游戏贴图2.3.2 Unity3d 中的贴图设置二维的贴图在不同的游戏引擎中具体的使用方法都是类似的,下面 是20 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第二章 开发游戏所需的知识系统Unity3d 中二维贴图的设置的分析。二维贴图赋予 Unity3d 中的模型、粒子和预 制不同的效果。二维贴图主要用于给物体不同的显示效果,形象地说,二维贴图 把物体包裹起来,然后在三维空间中进行渲染。在 Unity3d 中,二维贴图是十分 重要的,为了让这些贴图得到更好的利用,Unity3d 中需要对这些贴图进行十分 细致的设置。Unity3d 支持的贴图类型分为 PSD、TIFF、JPG、TGA 等。Unity3d 支持 PSD, 所以在制作贴图的过程中, 无需把 PSD 转换成普通的 PNG 或者 JPG。 Unity3d 支持的贴图大小主要是长度和宽度像素为 2 次幂的图片。在对于不同的 平台, Unity3d 能够提供不同的压缩方法, 例如在 iPhone 平台, Unity3d 支持 PVRT 压缩,对于 3GS 支持的最大贴图是 。Unity3d 中支持 UV Mapping,能 够使用 Material 实现基本的贴图缩放和重复, 这在制作重复地形的时候显得尤为 重要,而且通过 Material,可以控制贴图的移动,这也是实现基本的序列动画以 及水纹效果的基础。Unity3d 支持的 MipMaps,用于控制远近不同的物体之间的 不同显示细节, 由于游戏对于性能的要求十分苛刻, 当物体离摄像机越远的时候, 需要的显示细节也要相应地降低,以节省游戏的渲染开销,所以 MipMaps 对于 游戏中的一些设计就显得十分重要,因为你要考虑到不同的游戏模型,哪些是有 可能需要 MipMaps 等级的,而且不同的物体,设置的的 MipsMaps 也应该不同, 这样才能够显示出游戏的真实感。 在 Unity3d 中,使用反射贴图来模拟类似大楼反射的效果,这种效果,是通 过 Cubemap 来实现的。简单地说,Cubemap 是一个包含了六张独立的正方形贴 图的集合,通过计算这六张贴图的边界,模拟出一个球体,用于模拟出物体表面 的反射效果。如图 2-13,显示了 Cubemap 的具体使用效果。图 2-13 游戏 Cubemap21 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第二章 开发游戏所需的知识系统游戏中,经常要用到贴图增强 的效果,贴图部分的校正 功能, 可以通过 Anisotropic filtering 实现的。Anisotropic filtering 解决了当摄像机与贴图形成一 个角度时,贴图出现的明显模糊,Anisotropic filtering 在这种情况下大大提高了 贴图的显示质量,当然 Anisotropic filtering 需要消耗一定的游戏资源,这部分资 源主要在游戏显卡部分。在 Unity3d 中,使用 Anisotropic filtering 可以显著提高 地面和地板的贴图质量。另外一种可以增强贴图的例子是使用 Anti-aliasing,可 以让边缘平滑,避免锯齿。Unity3d 中可以使用 Anti-aliasing[26],但是会消耗较多的显存,所以一般来说,都会避免使用或者使用较低等级的 Anti-aliasing。例如, 下图 2-14 和 2-15 就是使用了 Anti-aliasing 与没有使用 Anti-aliasing 的效果:图 2-14 未使用 Anti-aliasing22 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第二章 开发游戏所需的知识系统图 2-15 使用 Anti-aliasing 后2.3.3 游戏阴影与游戏真实感游戏阴影是制作游戏中需要考虑的一个十分重要的内容, 因为这部分的内容 直接关系到游戏是否真实。 游戏的阴影是指在游戏中为场景和模型提供阴影,由 于计算阴影的算法需要的运算量十分大,所以制作游戏阴影是需要慎重考虑的, 在大多数情况下,实时游戏阴影只有在大型游戏中提供,在多数情况下,使用烘 焙阴影代替实时阴影。 Unity3d 中提供实时阴影。在 Unity3d 中,只要有灯光的存在,就会有阴影。 对于任意一个物体来说, 可以选择投影阴影和选择接受投影阴影。 想要在 Unity3d 中得到想要的阴影效果,需要了解 Unity3d 内部的渲染引擎是怎么来渲染阴影效 果的。在 Unity3d 中,有三种不同的 Rendering Paths:Deferred Lighting[28, 29]、 Forward Rendering、Vertex Lit。不同的 Rendering Paths 在不同的平台上所得到的 硬件支持是不同的, 不同的 Rendering Paths 提供不同特性和不同性能参数, 光照 和阴影也会因为不同的 Rendering Paths 而显得不同。 Deferred Lighting 是 Unity3d 中最准确的 Rendering Path,但同时也是最需要 硬件支持的 Rendering Path。它需要比较好的硬件支持,提供多个实时的灯光效23 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第二章 开发游戏所需的知识系统果,但是在手机上是不支持的。Deferred Lighting 的好处在于计算的时间是与摄 像机显示的光照比例成正比, 不管一盏灯光所影响的物体有多少。这就让我们可 以通过控制灯光的大小来提高游戏的性能。Deferred Lighting 的效果是通过每一 盏灯光根据像素来计算的,所以不会在大型的三角形上出现错误渲染等问题。 Deferred Lighting 在 Unity3d 中的渲染传递过程主要有三个:1,Base Pass:通过 计算所有的游戏场景对象, 得到一个基于屏幕的空间缓冲区,在这个空间缓冲区 内,包含了深度、法线、反射等类型的信息。2,Lighting pass:把第一步的缓冲 区数据进行进行光照计算,得到新的缓冲区数据。3,Final pass:所有的对象进 行重新计算, 每一个对象从缓冲区中获得自己的光照信息,把这些信息与自己的 颜色贴图混合,并加入自发光等颜色信息。在 BasePass 中,每一个场景中的游 戏对象都会被渲染一次,然后得到相应的信息,在这个阶段,最关键的地方是要 得到每一个物体的深度、发现、反射信息,在第二个阶段,才可以通过计算这些 信息,加入灯光信息,在第三个阶段,shader 获取这些光照信息,输出最终的渲 染信息。了解 Deferred Lighting 对于编写 shader 和调整阴影参数都很有帮助,在 强调游戏效果的前提下,Deferred Lighting 是我们使用的首要 Rendering Path。 Forward Rendering 是基于 shader 的 Rendering Path。它的缺点是只能够支持 一盏可以投射阴影的方向光, 对于其它的灯光,光照信息会根据物体的顶点信息 进行计算,只有能够投射阴影的那盏方向光,能够产生每一像素的光照信息。 Forward Rendering 在不太需要次世代效果的游戏中使用, 一般来说, 我们在游戏 中最常使用的还是 Forward Rendering, Forward Rendering 可以支持手机平台的硬 件,因此了解 Forward Rendering 也是十分重要。Forward Rendering 的过程分为 两种:1,计算场景中的物体,使用支持阴影的基于像素的灯光以及所有基于顶 点的灯光和 SH(Spherical Harmonics)灯光。2,使用其余的基于像素的灯光, 以叠加的方式进行渲染。如图 2-16,ABCD 因为离物体最近,所以对于物体来 说,ABCD 的强度最大,因此 ABCD 为基于像素的灯光,其次的 DEFG 为基于 顶点的灯光, GH 作为 SH 灯光, SH 灯光需要的计算量最小, 获得效果也是越低。24 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第二章 开发游戏所需的知识系统图 2-16 使用 Forward RenderingVertex Lit 是需要最少计算量的渲染方法,而且它不支持阴影,所以这里不 再深入阐述。Vertex Lit 经常使用在二维中的游戏使用,在二维的游戏中,游戏 阴影并没有在三维空间中那么重要,Vertex Lit 可以为二维的游戏提供最好的游 戏性能,它需要硬件的支持也是三种 Rendering Path 中最少的。 Unity3d 中使用软阴影和硬阴影来进一步提高性能,一般来说,硬阴影会让 阴影显得有十分明显的边界,可以用于设置一些建筑的阴影,但是如果对于一些 有模糊边界的阴影,如树木和角色的阴影,使用软阴影是较好的选择[30]。游戏引 擎使用阴影贴图在渲染中产生阴影效果, 一个明显的解决方法是如何使用这张贴 图才能够最大限度地显示出细节。 Shadow Cascade count 用与解决这种问题, Shadow Cascade count 把摄像机的可视范围分为多个空间,然后把这些空间按照 合理的分布范围投影到贴图之上。如图 2-17 所示,显示了不同 Shadow Cascade count 对应的贴图使用效果。25 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第二章 开发游戏所需的知识系统图 2-17 使用 Shadow Cascade count 改进阴影效果除了使用 Shadow Cascade count ,使用 Shadow Distance 也可以有效改善 Unity3d 的阴影效果。由于阴影会随着距离的增大而不断衰减,因此在物体的阴 影达到一定的距离之后,就会不再渲染。因此在使用 Unity3d 过程中,应当设置 合适的衰减距离,才可以最大限度地利用游戏的运算量,设置的距离越小,能够 显示的阴影也越少,当然获得效果也越好。对于不同的场景,设置的衰减距离可 能会不同。 为了让 Unity3d 里的场景有更好的阴影效果,可以选择烘焙的方法,把光照26 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第二章 开发游戏所需的知识系统信息在外部软件中优先计算,通过贴图保存下这些阴影信息,然后再导入到 Unity3d 中进行渲染,这种方法仅仅使用一张
的贴图就可以减少计算 阴影所需要的运算力, 是游戏场景中最常用到的增强游戏场景效果的方法。常用 的方法是先在 3dMax 中烘焙出阴影贴图, 如图 2-18 所示。 然后烘焙出 AO 贴图, 如图 2-19 所示。通过 Photoshop 进行叠加处理,生成最终的光线贴图,如图 2-20 所示。图 2-18 阴影贴图27 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第二章 开发游戏所需的知识系统图 2-19 AO 贴图图 2-20 光线贴图28 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第二章 开发游戏所需的知识系统生成光线贴图之后,可以把它贴入到 Unity3d 中,让原本没有光线和阴影的 模型显示出十分优秀的细节和阴影,如图 2-21 所示。游戏阴影可以让平庸的场 景显得十分真实, 所以在游戏的开发中,游戏阴影的好坏直接决定了游戏的真实 感,进而影响游戏的质量。在实际的游戏开发中,游戏阴影一直是游戏中需要着 重解决的问题, 如何在实时阴影和烘焙阴影中取得一个平衡,是能否正确处理好 游戏阴影的关键所在。图 2-21 游戏烘焙阴影2.4 游戏音效游戏音效在游戏开发中是至关重要的,它和游戏美术一样,直接影响着游戏29 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第二章 开发游戏所需的知识系统的整体效果。在游戏中,需要处理的一系列音效问题,如播放音轨、混音、处理 时间等细节,涉及到声音建模、使用 OpenAL[31]、音频的可视化以及如何使用工 具来创建音乐以及音效等。 Unity3d 中,涉及到的音效编程部分主要有播放音效、装载和分析 WAV、 MP3 等文件,动态地合成音乐并将其用于播放背景音乐。在 Unity3d 中涉及到的 音频格式有很多种,如表 2-2 所示。在 Unity3d 中,使用 AudioClip 作为具体播 放的音频剪辑,这些 AudioClip 保存着每一个音频文件的数据,用于播放音效。 Unity3d 中音效的使用方法主要有两种,一种是使用把音效用于二维的音效,另 外一种是用三维音效。二维音效可以使用预制件直接播放,三维的音效一定要在 场景中使用 GameObject 才可以播放,在三维游戏中常用到的还是三维的音效, 因为三维音效可以自动根据摄像机和角色的远近控制播放的声音大小, 而且可以 通过如图 2-22 的曲线调整声音衰减的方式。在 Unity3d 中可以通过 Play、Pause、 Stop 来控制音频的播放,也可以设置播放的音量大小,对于有多个 AudioClip 的 AudioSource 也可以通过使用内置的声音 APIPlayOneShot 来实现, 这大大方便了 我们在游戏中管理音效。表 2-2 支持的音频格式Format MPEG(1/2/3) Ogg Vorbis WAV AIFF MODCompressed as (Mac/PC) Ogg Vorbis Ogg Vorbis Ogg Vorbis Ogg VorbisCompressed as (Mobile) MP3 MP3 MP3 MP3图 2-22 三维音效调节面板30 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第三章 Unity3d 体感游戏设计第三章 Unity3d 体感游戏设计游戏的类型有很多种, 不同游戏的游戏设计方法并不是完全相同。在设计游 戏之前, 需要了解什么是游戏的可玩性。游戏的可玩性对于绝大部分人可能很陌 生, 因为这主要是面向专业人员的一个术语。游戏的可玩性是指游戏与其它的艺 术形式不同的游戏交互性。 游戏的可玩性指的是玩家与游戏世界或者游戏世界对 玩家所做出反应的方式。知道了游戏可玩性,就可以定义游戏设计的内容。游戏 设计就是定义游戏可玩性的内容,设计游戏就是定义游戏可玩性的一个过程。游 戏设计定义了游戏中成功和失败的标准、用户控制游戏的方式、用户与游戏交互 的方式、游戏与玩家相互交流的内容和信息、定义了游戏不同的难度,在当今网 络游戏不断发展下, 游戏设计还需要定义游戏的社区内容, 例如游戏的门派系统、 背包系统、武器合成系统等。总的来说,游戏设计决定了游戏可玩性的实现过程 中每一个实现细节。 这些细节也就是游戏设计四层架构里面的游戏机制,不同的 游戏机制相互结合起来, 构成了一个个完整的游戏系统,不同的系统之间的组合 就是系统的框架,他们在被不断地细化之后,构成了一个完整的游戏。本章中将 对体感游戏的系统框架,并着重对游戏设计的框架结构、基础功能系统、高级功 能系统三个方面进行研究与分析。3.1 框架结构在体感游戏的设计中, 需要实现基本的游戏框架,让不同的游戏功能可以合 理地互相使用[32]。由于 Unity3d 作为一款游戏引擎,已经为我们在硬件 API 之上 搭建了一层基于组合的架构,所以在制作游戏时,只需要在 Unity3d 的基础上, 根据自己的游戏类型, 搭建一层可以合理地容纳游戏功能的框架即可。 在 Unity3d 中,需要理解 Unity3d 为我们提供的一些内置关键理念。在 Unity3d 中,所有的 物体都是 GameObject,既然所有的物体都是 GameObject,那么我们怎么来区分 不同的 GameObject 呢?Unity3d 使用 Components 来区分不同的 GameObject, 只 需要给不同的 GameObject 赋予不同的 Components,就可以让 GameObject 有不 同的特性,从而让他们拥有自己的行为。简单地说,GameObject 只是一个容器, 它用于存储所有的 Components,这些 Components 让 GameObjects 相互区分。例31 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第三章 Unity3d 体感游戏设计如,当创建一个脚本,然后把这个脚本赋予一个 GameObject,这个脚本就成为 这个 GameObject 的一个 Component,脚本中可以暴露出不同的属性,在运行时 可 以 动 态 地 改 变 GameObject 的 行 为 和 状 态 。 除 了 使 用 GameObject 和 Components, Unity3d 为了能够让游戏设计者更好地管理场景资源, 提出了 Scene 和 Prefabs 的概念。Prefabs 是一种资源文件,它本身也是一种 GameObject,但是 它保存在项目的目录下,没有在场景中出现。 Prefabs 有点像面向对象的类,它 可以通过实例化在场景中出现, 它与类不同的地方在于,只需要在项目目录下改 变 Prefabs 的属性, 场景中所有实例化的 Prefabs 都会得到改变。 Scene 是 Unity3d 中用于管理资源的另外一个工具,对于 Unity3d 而言,Scene 可以理解为关卡, 由于在游戏中,一些关卡可能会太大,导致加载的速度过慢,使用 Scene 分割大 场景是加快加载速度的唯一手段。本文使用 Unity3d 设计的体感游戏的框架结构 如图 3-1 所示。 从图中可以看到, 游戏主要是由多个独立的 Scene 组合而成, 在游戏项目中, 首先需要载入 Logo 场景,使用一个 Logo 场景的主要目的在与能够让游戏能够 快速启动,在 Unity3d 中,游戏启动的时间主要取决于第一个 Logo 场景的加载 速度,在一般的 PC 或者 Mac 平台,这显得不是十分必要,但是在手机端,游戏 启动的时间要求是十分有限的,因为如果游戏在载入第一个场景消耗的时间过 长,就会导致手机端的操作系统自动执行退出游戏操作,导致游戏的伪崩溃。 在游戏制作的过程中,Logo 场景中需要处理的不仅仅是载入初始场景,在 Unity3d 中,Logo 场景还需要解决诸如背景音乐、游戏数据初始化、游戏数据载 入、游戏联机等内容以及游戏一些单例进行设置等,所以一开始的 Logo 场景十 分重要。在进入实际游戏关卡后,由不同的游戏场景来把游戏进行分割,不同的 场景经常可以复用,进而解决游戏最后体积问题。 游戏进行的过程中, 主要是由游戏管理单元进行游戏的管理, 在这个单元中, 涉及到游戏的基础功能和游戏的高级功能,负责之间的控制与信息交互。在游戏 的过程控制单元中,涉及到两个控制单元,一个是全局的控制单元,主要用于控 制与游戏全局相关的游戏信息; 另外一个是关卡控制单元,控制与关卡相关联的 游戏信息。下面将对这两个控制单元进行分析。32 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第三章 Unity3d 体感游戏设计图 3-1 游戏的系统结构图33 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第三章 Unity3d 体感游戏设计3.1.1 游戏关卡控制单元游戏中经常需要为每一关设置一个单独的控制单元,用于管理关卡的内容, 关卡控制单元主要有以下的作用,如图 3-2 所示。图 3-2 关卡控制单元的内容关卡控制单元的主要作用:1,在进入关卡时,需要设置的主要内容包括,特 定的图形用户界面面板, 因为在游戏中, 使用图形用户界面面板的频率是很高的, 但是在 Unity3d 中,仅仅希望一个设置一个单独的场景来解决图形用户界面的设 置是不行的,因为如果使用单独的场景,在切换场景之间需要消耗较多的时间, 玩家可以感觉到明显的延时,所以解决的办法是使用单独的图形用户界面面板, 在 每 一 关 的 关 卡 控 制 单 元 中 进 行 初 始 化 , 或 者 使 用 Unity3d 内 置 的 方 法 DonotDestory 来重复使用图形用户界面的面板, 这样在关卡中切换图形用户界面 面板时,不会出现明显的延时。2,设置基本的关卡变量,这其中包括一些需要 赋值的预制件,让全局控制单元得到当前关卡的信息,游戏的难度等。3,需要 通过图形用户界面模块,得到用户的输入,接着进行响应。同时,对于某些特定 的按钮、提示面板,需要设置一定的参数值。例如在全局控制单元中,需要使用 当前关卡中背景音乐按钮和背景音效按钮,需要在当前关卡控制单元中设置。4, 对于一些常见的 AI 模块,需要设置能够获取 AI 模块的方法,因为玩家和怪物 敌人角色需要利用 AI 模块提供的数据信息,才能够让自己在下一帧中得到合适 的更新。5,处理关卡内角色的变化信息,包括角色的一些属性增长,需要控制 全局单元并进行数据保存。6,在关卡的开始,需要在一开始导入当前关卡的信 息,例如角色的装备解锁、物品栏信息,同时需要根据角色的装备设置相对应的34 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第三章 Unity3d 体感游戏设计游戏难度。7,处理关卡的一些方法,这些方法主要是控制当前关卡涉及到的主 要行为,这些行为与基础模块和高级模块相关,都需要不同的方法,才能够与不 同的模块之间进行信息交换,然后让场景中的物体得到这些信息。 8,游戏的声 音主要包括背景的音乐和场景音效,在不同的关卡内,需要为不同的环境设置不 同的声音音效,还要在合适的场景中切换不同的背景音乐,这些工作,也是由关 卡控制单元负责处理的。9,其它的与关卡相关的操作,涉及到具体的关卡内容, 例如小游戏的解锁、动画关卡、教学关卡等,具体会和不同的关卡相关,所以不 具有通用用法,这写特殊的用法,可以通过单独的脚本进行设计,但是一般情况 下,为了节省资源,常常放在关卡控制单元内,可以减少脚本之间的调用,而且 减少脚本文件,也可以最大限度地压缩游戏最终大小。 游戏关卡控制单元控制着游戏内关卡与模块之间的交互, 关卡控制单元在多 数情况下是一个空的 GameObject,上面有多个脚本的 Component,这样就可以 通过游戏关卡控制单元快速调用到多个脚本的方法,十分方便,而且在效率上, 使用 Unity3d 内部的脚本赋值方法也比动态获取高。3.1.2 游戏全局控制单元游戏中经常需要为整个游戏一个单独的控制单元,用于管理所有全局的内 容,全局控制单元主要有以下的作用,如图 3-3 所示。图 3-3 全局控制单元的内容在游戏里面, 经常需要一个管理游戏全局数据的控制单元,这个单元复杂游 戏的主要数据信息的保存和加载,例如,在一个射击类游戏中,需要保持玩家当 前所进行到的关卡、当前身上的装备、以及开启的关卡和级数等。这时候,游戏 的全局控制单元就显得十分重要了。我在制作游戏的过程中,使用过程中发现全35 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第三章 Unity3d 体感游戏设计局控制单元可以用于以下几个功能:1,保存和加载游戏。Unity3d 中可以使用保 存和加载用户的数据来实现保存游戏,在数据不是很大的情况下,使用 Unity3d 内置的 PlayerPrefabs 就可以实现快速的保存、加载操作,但是在大多数情况下, 游戏的数据都是十分庞大的, 所以序列化和反序列化数据是更为常用的方法。2, 保存和加载玩家的数据。 在游戏开始的时候,需要全局控制单元主动地把数据加 载进来,对当前玩家的数据信息进行更新,同时在关卡进行的过程中,需要把玩 家的信息进行设置,同时保存,防止因为用户强行退出游戏造成的信息丢失。3, 控制音效和背景音乐。 在游戏的进行的过程中,因为游戏的背景音乐是可以横跨 两个不同的场景的, 所以背景音乐只可以设置在全局控制单元内,以用于控制场 景之间音乐的不间断播放, 同时还要保证在播放音乐时,正确处理场景之间的音 量大小切换。4,控制关卡的结束。其实,更一般的想法是把控制关卡结束的方 法放置在关卡控制单元内,但是这在 Unity3d 中是不合适的。因为 Unity3d 切换 场景的过程会出现明显的停顿, 一般来说,需要制作一张渐隐的图片来掩盖一段 停顿的时间,Unity3d 可以使用异步的关卡导入,让场景可以异步地导入到场景 中,为了能够使用渐隐的图片,一个限制就是调用渐隐图片的 GameObject 是需 要设置为 DonotDestroy 的,如果把方法放置到上一关卡中,无法实现这些功能, 因此,必须把关卡结束的控制代码放置到全局控制单元中。5,管理场景之间的 切换。Unity3d 场景之间切换需要不同的切换代码,都需要由全局控制单元负责, 因为只有全局控制单元,可以保持在关卡加载的过程中存在内存中。6,其他与 全局相关的操作。Unity3d 如果需要设置动态的环境,就需要全局控制单元的控 制,用于控制全局的环境效果。 无论是全局控制单元还是关卡控制单元,并不是说只有一个脚本,在多数情 况下,它们都是由有多个脚本 Component 的对象,它们能够方便地控制自己的 脚本 Component,与各模块进行数据交换,提高游戏进行的速度,优化游戏的代 码。控制单元需要游戏功能模块的支持,才能够解决实际的问题,控制单元主要 需要与两种功能模块, 分别为基础功能模块和高级功能模块。这两个模块提供给 控制单元游戏的数据, 让控制单元能够控制游戏的发展。下面将对两种模块进行 介绍和分析。36 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第三章 Unity3d 体感游戏设计3.2 基础功能系统在上面的游戏控制单元, 不仅需要控制游戏的主要流程,还需要与不同的功 能模块之间进行信息的交换,才能够充分利用 Unity3d 引擎的性能。基础的功能 系统为游戏提供了一些必须用到的功能,这些功能,都是完全独立与所有的关卡 存在的,它们并不知道到底有多少关卡,关卡的内容是什么,它们的主要工作, 就是与游戏的控制单元进行信息的交换,从而支持游戏的进行。游戏中的基本功 能模块如图 3-4 所示。 在游戏基本功能系统主要控制中游戏中常用到的基本功能, 例如物理效果、粒子产生、动画播放、脚本控制、材质贴图显示、保存和加载游 戏等。这些基本的功能支撑游戏的顺利进行,它们是 Unity3d 游戏引擎提供的基 础功能,所以在游戏制作的过程中,经常会用到这些功能,需要理解不同的功能 模块的参数和使用方法, 才能够设计好游戏。下面我将深入分析各个基础模块实 现的主要功能。图 3-4 基本功能系统的内容3.2.1 游戏的物理系统游戏的物理系统[33], 控制了游戏中各种物理效果,模拟真实世界中的各种物 理碰撞、重力、弹力、摩擦力、阻力等,在一部分的情况下,它为粒子系统提供 了计算功能, 让粒子系统可以使用到物理系统的计算结果。物理系统提供的不同 物理效果主要如图 3-5 所示。现在简要说明图中每一种物理效果的主要内容。 刚体是指现实世界中的物体, 如果想让游戏世界中的物体如现实世界那样受 到重力、摩擦力等力的影响,需要为一个 GameObject 添加刚体组件。这样,游 戏中的物体就会在物理引擎的作用下运动起来。在控制刚体的过程中,一般只需 要通过 AddForce()和 AddTorque()分别添加冲力和转动力,就可以让一个刚体得37 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第三章 Unity3d 体感游戏设计到符合现实的运动。刚体在游戏中尤为重要,基本游戏中的所有物体,只要是可 以运动的,都应该设置成刚体。与刚体相对应的是软体,Unity3d 中不支持软体, 因为软体在游戏中十分消耗计算量,消耗很多游戏性能。软体主要用于一些二维 的游戏中,如果想为 Unity3d 添加软体支持,可以使用外部 DLL,通过直接的计 算得到软体的模拟效果, 在开源的游戏物理引擎中, 支持软体的游戏物理引擎[34] 有 nape、bullet 等。除了使用这些引擎,用自建的骨骼也可以模拟软体的效果。 使用自建的骨骼模拟软体的效果如图 3-6 所示。通过在球体中设置刚体,并在不 同的球面设置关节, 在更新的过程中保持各关节的相对位置不移动,就可以模拟 出类似游戏《Loco Loco》的软体效果。图 3-5 物理系统38 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第三章 Unity3d 体感游戏设计图 3-6 游戏软体效果3.2.2 游戏的粒子系统游戏粒子系统[35]在游戏中用于制作一些如烟雾、流体、火花或者其它环境效果,如图 3-7。对于游戏的粒子系统,分为很多不同的模块,这些模块通过共同 的作用,显示出十分真实的粒子效果。粒子系统支持不同的曲线调节,曲线的 x 轴为粒子相关联的时间,曲线的 y 轴为粒子需要调整的数值。通过不同的曲线结 合,就可以完成几乎所有的粒子功能,控制单元可以动态控制粒子的参数。动态 控制粒子的播放与停止。粒子系统可以控制粒子的速度衰减、粒子的起始冲力、 粒子的颜色变化、颜色变化的快慢、粒子的大小、粒子的缩放、粒子的旋转、旋 转的速度、粒子的碰撞、粒子的子发射器、粒子贴图的动画。通过动态或者预先39 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第三章 Unity3d 体感游戏设计调整这些数值, 就可以让粒子系统显示出自己的状态信息,可以被游戏控制器所 调用。 使用粒子系统可以十分方便地完成游戏中需要的各种效果, 如图 3-8 所示。 一般来说, 粒子系统并不是只有这种存在与三维空间的粒子,在游戏性能有限制 的情况下,我们也需要使用到序列图来完成基本的粒子效果,例如天气的变化, 如雨、雪和风等效果。在实际的应用中,使用粒子系统的频率是很高的,单独设 置粒子系统,可以让粒子可以得到更好地管理,游戏控制器只需要发布命令,控 制粒子的播放与停止就可以完成需要的任务, 完全不需要知道粒子系统的具体运 行方法,所以在游戏的制作过程中,粒子系统的设置,一般由美术人员完成,因 为对于美术人员来说,如何能够快速地调整出想要的效果,对于他们不是难事, 但是对于技术人员来说不是十分简单。粒子系统的操作和制作,都是由美术人员 来完成的, 只不过是程序需要使用粒子系统的时候,只需要调用粒子系统提供的 方法。图 3-7 游戏粒子系统40 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第三章 Unity3d 体感游戏设计图 3-8 游戏粒子系统3.2.3 游戏的动画系统游戏动画系统是游戏中涉及到动画的部分,是处理诸如游戏角色动画、游戏 场景动画、游戏过渡动画等这些功能的一个系统。游戏动画的主要内容,去除外 部软件使用功能,主要需要提供如图 3-9 的功能。动画系统需要支持的一个功能 是外部动画软件的支持。在游戏中的动画,都是由外部软件制作完成,常用的软 件包括 3dmax 和 maya,在这些软件中制作完成之后,才导入到游戏中,所以游 戏动画系统需要处理这些软件中制作的游戏动画,能够支持他们的文件格式,并 使用到自己的引擎中。 还有一个功能就是游戏的内部脚本支持,需要能够使用游 戏的脚本,控制游戏的动画,例如,需要可以控制动画的每一帧播放的速度,播 放的开始与结束。 在动画系统的脚本支持中,最重要的功能是能够提供强大的动 画层叠功能,允许使用一个动画覆盖另外一个动画,为不同的动画设置优先级, 混合级,还要能够在不同的层中同时播放不同的动画。41 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第三章 Unity3d 体感游戏设计图 3-9 游戏动画系统3.2.4 游戏脚本控制系统游戏的脚本控制系统, 是指游戏中通过内部的逻辑,来控制游戏正常运行的 系统。游戏脚本控制系统的作用可以简单概括为图 3-10 中所表示的作用。游戏 的脚本控制系统的一个作用, 就是解决代码的混乱。优秀的游戏脚本控制系统可 以能够合理地解决代码的一些逻辑问题,以及降低不同代码之间的耦合程度,同 时, 它还可以让程序员在当前的脚本上重新搭建符合自己游戏需要的脚本,提供 内置的编辑器扩展,提供其它语言如 C++、Lua 的支持。图 3-10 游戏脚本系统3.2.5 游戏材质贴图系统游戏材质贴图[36]系统(图 3-11)控制游戏的材质和贴图,需要处理的内容包 括,游戏的基本贴图导入,管理游戏的贴图质量,能够为程序方面提供相应的贴 图数据。游戏的材质需要能够动态地控制,需要可以通过脚本控制贴图的运动, 例如控制贴图的位移,控制贴图的平铺等。除此之外,游戏中还需要能够针对不 同的游戏设置,控制游戏的贴图效果,例如游戏贴图的质量,控制不同平台(包 括 PC 和手机平台)的贴图质量控制和压缩。图 3-11 游戏材质贴图系统42 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第三章 Unity3d 体感游戏设计3.2.6 游戏保存和加载系统游戏的保存和加载系统主要是为了解决游戏的保存和加载。 在玩家退出游戏 的时候, 保存和加载系统能够把当前玩家的状态信息进行保存,还需要为游戏的 配置文件进行修改, 以保证玩家下一次进入游戏的时候能够继续游戏。游戏的这 个系统需要解决的问题其实就是数据如何快速保存,如何能够在合适的时刻,比 较智能地完成这个功能。保存的时候,对保存的所需要的时间也十分苛刻,因为 不仅需要在保存的时候让游戏仍然能够平滑地进行,不出现明显的游戏闪停效 果,对于数据量大的情况,要能够分批次保存,保持游戏帧数不出现大的衰减。 所以,游戏保存和加载的系统主要提供了如图 3-12 所示的功能,事实上,游戏 的保存系统还需要和其它的游戏功能相关联,才能够处理繁琐的数据保存问题。 游戏保存和加载系统需要提供不同保存方法,处理不同的保存操作,例如,在处 理保存角色数据时, 应该能够提供不同种类的操作,而不是全部使用同类的操作 方法,在保存小数据的时候,可以选择使用 Unity3d 的 PlayerPrefabs 类来保存, 但是使用大数据保存时, 需要提供能够使用 xml 加速保存的速度的方法, 或者提 供数据的序列化和反序列化操作。图 3-12 游戏保存加载系统3.3 高级功能系统游戏高级功能是为游戏提供的一些特制功能模块, 这些模块一般都是在游戏 的基础模块之上搭建起来, 它们或多或少使用了游戏基本功能中的一些功能或者 特性。这些高级功能是为特定的游戏定制的功能,没有这些高级功能系统,一个 游戏只能够进行一些基本的游戏玩法,加入了这些高级功能系统,一个游戏才逐 步开始完善起来。在游戏中,用到的游戏高级功能有下面几种: 1) 通用的用户输入。通用的用户输入解决了用户在控制游戏的时候鼠标或者 键盘的输入,对于手机平台,输入的方法是触摸和重力感应。在编写游戏43 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第三章 Unity3d 体感游戏设计的时候,不可能使用多重判断语句来处理这些问题。所以需要独立出来一 个游戏的输入控制器,用于管理不同平台之间的输入问题,用于游戏的操 控。其中,体感游戏的控制输入,也可以由这部分来控制。 2) 帧动画系统。帧动画系统的主要内容是使用二维的序列帧,控制游戏的一 些二维动画、粒子效果以及图形用户界面动画。在游戏里面不可能全部使 用三维粒子效果来实现一些射击或者其它效果,为了节省游戏的资源,提 高游戏内存的使用率,使用帧动画系统是一些游戏解决部分动画和粒子效 果必须的手段。 3) 跨平台特性。Unity3d 的强大之处正是在于它能够跨多个平台,如 PC、 Mac、iPhone、iPad、Andorid 等。在不同的平台上,由于不同平台的分辨 率以及硬件问题,制约了游戏的一些功能,如何开发出能够跨不同平台的 游戏,需要有能够提供跨平台的功能,具体需要处理的主要是不同的按钮 长宽、不同的摄像机视角、不同的贴图以及文字方面的问题。 4) 高级图形用户界面。Unity3d 内置了一些基本的图形用户界面功能,但是 在制作游戏的时候,这些功能往往不够用,所以需要有高级图形用户界面 的支持。高级图形用户界面提供必须的按钮、开关、进度条、背包等基本 的实现,不断地扩展游戏所需要的图形用户界面展示。 5) 统一的资源管理。统一的资源管理可以让游戏中的动态资源能够得到统一 的管理,好处是能够减少游戏中对象的创建和删除的次数,从而提高游戏 的性能,在手机平台,当需要多个粒子效果时,需要使用统一资源管理来 进行资源的统一调度,从而保证游戏能够顺利地进行,不出现明显的掉帧 情况。 6) 补间动画系统。Unity3d 中虽然提供了一些补间动画的功能,不过对于游 戏来说,这些功能不是很实用,而且不能通过程序直观地控制,所以需要 使用自定义的补间动画系统完成游戏中的补间动画效果。在这部分,参考 了 Actionscript 中的 Tweenlite 和 TweenMax 库,这两个库提供了较好的补 间动画功能,而且效率也不低。 7) 高级相机管理。游戏中的相机至少需要两个,一个控制角色或者游戏的场 景显示,一个用于控制图形用户界面显示。如果是三维的游戏,还需要设44 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第三章 Unity3d 体感游戏设计置小地图等,需要设置至少三个以上的相机。相机在过多的情况下,也需 要进行合理地管理,解决游戏出现的问题。高级相机管理,还需要对摄像 机在不同角度出现的视角问题进行修复,例如当角色被遮挡时,摄像机需 要智能地移动位置或者角度,以保证角色始终保持在游戏中。 8) 消息提示系统。在游戏开始的时候,经常需要处理一些游戏的入门教程, 例如怎么完成游戏和怎么获取分数等,消息提示系统需要为游戏在任意时 刻插入一些能够出现提示的信息,或者一些玩家的信息,地图信息等。消 息提示主要用于在游戏中提示信息,这在很多角色扮演类游戏中是很常用 的,所以经常需要作为一个独立的模块进行管理。 9) 动态环境。在游戏中动态环境用于提供一些的动态场景效果。最常见的如 动态天气、动态天空以及动态环境。 10) 人工智能。人工智能是游戏中一个用于增加游戏可玩性的模块。游戏人 工智能对于不同的游戏需要的解决方案可能不同,例如对于射击游戏来 说,游戏人工智能就是解决电脑的智能,对于策略游戏来说,游戏人工智 能更多的是需要解决一些电脑与玩家之间的数据对比。对于体感游戏,需 要提供的人工智能就是解决玩家在游戏过程中,与电脑之间的如何交互, 增加游戏的可玩性。人工智能我研究的不是很深入,所以这里没有过多地 进行分析。 11) 网络联机[37]。网络联机对于现今游戏而言,是一个不可缺少的模块。它 可以解决游戏盗版的问题。 网络联机需要解决两台 Kinect 联机游戏的过程[38]。12) 社区管理系统。 社区管理系统主要是针对国外的玩家,在国外玩家群中, 对于 Facebook 和 Twitter 的要求还是很高的。相对于国内,这部分可以考 虑使用人人网或者腾讯社区提供的开发平台 API 进行接入, 主要完成游戏 之间的得分对比,游戏推荐以及游戏心得交流等。 游戏中提供的高级功能,如图 3-13 所示。下面就对这些功能中的开发的体 感游戏中用到的模块进行分析, 主要解释这些模块设计需要提供的一些具体的功 能,模块的实现在下一章进行深入探讨。45 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第三章 Unity3d 体感游戏设计图 3-13 游戏高级功能系统3.3.1 游戏高级图形用户界面游戏高级图形用户界面(图 3-14)控制游戏中游戏图形用户界面的输入,采 用常见的事件驱动框架模式,主要需要提供如图所示的功能 [39]。其中即时显示 功能主要是为了让图形用户界面能够更加易用,能够可视化地调整效果。多平台 的支持是为了保证在不同的游戏分辨率下,游戏的 GUI 不会出现明显地拉伸以 及扭曲。完善的事件驱动框架是为了保证游戏的 GUI 系统的稳定性和健壮性, 在游戏处理事件的过程中,不出现明显的事件丢失或者混乱等问题。同时,要能 够支持中文的输入, 能够让中国的玩家可以输入玩家姓名和玩家认证。考虑到游 戏需要同是提供英文版本,国际化是需要考虑的一个问题,让游戏中的 GUI 可 以通过玩家自主选择,使用不同的语言。46 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第三章 Unity3d 体感游戏设计图 3-14 游戏高级图形用户界面3.3.2 游戏补间动画游戏补间动画要求选用效率较高的第三方的补间动画库进行修改实现。 需要 主要考虑的功能包括下面几种,如图 3-15 所示。提供的可视化编辑器是为了加 速补间系统的使用效率, 提供的补间系统还要能够提供各自淡入淡出的效果,提 供不同的补间,在使用的过程中,需要能够保证不消耗过多的游戏资源,最后需 要支持多类型的输入,能够改变不同类型的数据。图 3-15 游戏补间动画3.3.3 游戏帧动画系统游戏的帧动画系统解决如何使用贴图制作的帧动画与 Unity3d 游戏引擎的结 合的问题。需要提供的功能如图 3-16 所示。帧动画系统需要支持贴图集,用于 控制游戏的贴图大小,节省内存空间。还需要支持分类的精灵,便于游戏脚本的 调用。使用完美的像素显示,不同的摄像机能够提供不同的大小。最后需要提供 丰富的动画方法,支持脚本的调用。47 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第三章 Unity3d 体感游戏设计图 3-16 游戏帧动画系统3.3.4 游戏跨平台系统游戏跨平台系统需要解决游戏中不同平台的分辨率问题,除了使用 GUI 的 长宽问题, 还需要解决不同的精灵在不同的平台上的长宽压缩,保证游戏能够发 布到不同的平台,如 PC、iPhone、iPad、Android。3.3.5 游戏联机系统游戏的联机系统需要提供游戏的局域网联机功能, 因为体感游戏经常需要和 不同的玩家进行协作,所以支持局域网联机十分必要,下图 3-17 为游戏联机系 统的基本概念。图 3-17 游戏联机系统3.3.6 游戏动态环境系统游戏的动态环境系统主要是解决游戏中不断变化的天气,在游戏中,能够通 过脚本或者事件, 主动地刷新游戏的天气,这样可以模拟出一个比较真实的游戏 世界,增加游戏的可玩性。图 3-18 为动态环境系统的演示图。48 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第三章 Unity3d 体感游戏设计图 3-18 游戏动态环境49 一个基于 Unity3d 游戏引擎的体感游戏研究与实现50 一个基于 Unity3d 游戏引擎的体感游戏研究与实现第四章 主要功能模块的实现第四章 主要功能模块的实现上一章介绍了游戏的总体设计, 对于游戏框架和游戏框架中的模块分类进行 了说明和介绍。 不同的模块之间是独立的,因为它们之间不需要知道对方的具体 实现,在另一个方面,它们又是互相影响:一个模块会对另外一个模块进行信息 交换。本章结合了游戏开发中最常用到的模块,对游戏的图形用户界面模块、游 戏补间动画模块、 游戏的帧系统动画等的具体实现和具体如何应用于游戏进行了 展开说明。4.1 高级图形用户界面的实现游戏图形用户界面是游戏中实现起来比较复杂的一部分。在游戏中,一般使 用事件驱动的思想来实现游戏的图形用户界面[40]。事件驱动的思想如图 4-1 所 示。事件驱动的主要思想如下:在事件驱动的开始,需要有一个产生事件的驱动 器,负责产生不同的事件,当用户点击按钮或者拖动滑块时,会产生事件。然后 事件驱动器会把事件发送到事件的发布器,事件的发布器会根据不同的事件类 型,把事件传递给对应的对象。接收到的对象负责对事件进行具体的处理

我要回帖

更多关于 unity 获取指定子物体 的文章

 

随机推荐