基于Unity3D的汽车驾驶游戏的设计与实现(毕业论文)

更新时间:2024-05-30 15:47:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

目 录

摘 要 ............................................................................ I ABSTRACT .......................................................................... II 一、 绪论 ......................................................................... 1 (一) (二) (三)

研究背景和研究意义 ...................................................... 1 国内外研究现状 .......................................................... 1 论文组织结构 ............................................................ 2

二、 3D游戏技术的知识系统 ......................................................... 2 (一) (二) (三)

3D图形库 ................................................................ 2 物理引擎 ................................................................ 5 UNITY3D .................................................................. 8

三、 车辆驾驶游戏的设计 .......................................................... 11 (一) (二) (三)

游戏创意 ............................................................... 11 游戏框架结构设计 ....................................................... 13 游戏层次结构设计 ....................................................... 14

四、 车辆驾驶游戏的实现 .......................................................... 15 (一) (二) (三) (四) (五)

场景渲染实现 ........................................................... 15 场景物理仿真实现 ....................................................... 21 汽车动力学模拟 ......................................................... 22 用户图形界面实现 ....................................................... 24 网络联机模块实现 ....................................................... 27

五、 游戏展示与性能分析 .......................................................... 28 (一) (二)

游戏展示 ............................................................... 28 性能分析 ............................................................... 30

六、 项目总结 .................................................................... 32 (一)

总结 ................................................................... 32

(二) 下一步工作的展望 ....................................................... 33

参考文献 .......................................................................... 34

华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现

摘 要

随着计算机技术的发展,电子游戏的形式越来越丰富,用户对于电子游戏的娱乐性需求也越来越高,追求更加真实的感官体验成为电子游戏的一条发展趋势。作为虚拟现实领域的一项的综合应用,3D游戏已经在电脑、手机、机顶盒等多平台得到了普及,相对于传统的2D游戏,3D游戏让用户感觉更融入,更加享受,但所依赖的计算机技术也更加复杂,计算机图形学、物理仿真等都成为3D游戏开发所需要的重点研究方向。我国在电子游戏领域的发展与领先国家还具有一定的差距,为了振兴本国电子游戏行业,对这一项综合应用所涉及的技术进行整体的梳理是完全有必要的。

论文按照从设计到实现,从理论到应用。首先介绍了3D游戏的一般技术框架,之后围绕一款基于Unity3D的小型的汽车驾驶游戏,使用Unity3D支持多个平台,可方便引入各方面插件。在游戏设计和实现阶段,先简单介绍了游戏的创意,接着设计了整个游戏的的整体结构,并将游戏系统主要分为图形渲染、物理仿真、网络同步等模块,图形渲染使用Unity3D中OpenGL插件,使得游戏可以运行到手机平台,为了更精确、更快速处理汽车的物理仿真,使用了PhysX来对车身及场景进行物理设计,着重涉及到碰撞检测、车身刚体及轮胎的悬挂系统的概念及算法,并且增加界面设计及网络模块使得用户增加互动性。论文的最后对游戏做了一定的分析,在执行效率及可玩性做出了改进展望。

整个游戏系统各模块之间接口灵活且耦合性低,且运行效率高,虽然属于小型游戏,但涉及的技术点较为全面,可以为同类问题提供参考。

关键字:Unity3D,游戏,图形引擎,物理引擎,PhysX,汽车驾驶

I

华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现

Abstract

With the development of the electronic science,forms of electronic games are

becoming richer and richer,meanwhile that users need to more real sense judgment has been an important progress trend.As an application of the virtual reality,3D games is available on all the major computer,mobile platforms, set-top boxes and so on.3D games make users easier immerse in enjoying it compared with 2D games,but require more complex technique,so that Computer Graphic and Collider detection have been key research fields.The industry level of 3D games falls behind in China at present,it is a meaning work to go through the technology of the comprehensive application.

The thesis is order from theory to application.Firstly this paper introduces the

base framework of 3D games,and then develop a vehicle game by Unity3D,which supports multiple platforms and easier to develop by the plugin.In the specific game,introduce the idea of this game and discuss the overall design of the integral structure.This game is broken down into modules such as graphic rending,physical simulation and network.Graphic rendering uses OpenGL plugin in Unity3D,which makes game run in mobilephone. Physical simulation depends on PhysX which can obtain more accurate results to design the rigid body of the car,the suspension of the wheels and the scene.In order to add interactivity we add network and UI module.In the end,this paper analysis this game to put forward the next improvement.

This vehicle game is mini,but owns some advantages such as flexible module interfaces,low coupling and fast executing.Most importantly this paper refers to most aspects of a 3D game and provide a reference for developers who has a similar requirement.

Keywords: Unity3D, game,graphic engine, physical engine, PhysX, automobilism

II

华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现

III

华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现

一、 绪论

(一) 研究背景和研究意义

这几年,中国经济以8%左右的速度持续平稳的增长,而在刚刚过去的2012年中国游戏市场实际销售收入602.8亿元,同比增长率为35.1%,首次突破600亿规模[1]。游戏产业己经成为经济市场中增长速度最快的热点,是众所关注的焦点。游戏是文化创意产业里的一部分,创意经济是知识经济的核心内容,更是其经济的重要表现形式,没有创意就没有新经济。游戏设计是文化艺术创意和商品生产的结合,游戏产业的发展在中国的经济发展中具有十分重要的意义[2]:

1.有利于保护民族的文化传统和价值观,抵制文化入侵; 2.推动创意产业的快速发展,提升我国经济产业发展水平; 3.提供健康快乐的大众娱乐方式,提升消费者的休闲体验感受。

游戏的发展从表现方法上经历了2D游戏和3D游戏两个阶段。游戏设计,特别是3D游戏开发综合运用了计算机图形学、物理仿真和网络通讯等技术,并且移动平台技术在这几年得到迅猛发展,轻量级、微创新、时间碎片化一直是移动游戏的发展趋势,如《愤怒的小鸟》、《顽皮鳄鱼爱洗澡》、《神庙逃亡》的用户数都已经过亿。论文通过一个简单的“碰碰车”创意予以实现,涵盖了3D游戏涉及到的一些基本技术,能深入理解这些领域的底层技术并熟练掌握成熟的引擎使用,对于将来开发具有自主知识产权的游戏提供了参考。

(二) 国内外研究现状

国外的3D游戏起步在90年代初,美国的卡马克的《重返德军总部3D》是第一部3D第一人称射击游戏,由其开发的Doom引擎也成为最早3D游戏引擎。国内首款自主研发的3D游戏始于2003年,到目前为止,国内在3D游戏已经有了很多的研究,但由于3D游戏开发的复杂性及经济效益的考虑,国内只有屈指可数的互联网公司拥有自主研发的3D游戏引擎,中小型公司还是使用国外较为成熟的游戏引擎和工具,如虚幻,Unity3D,寒霜。虽然近年来国内涌现一些优秀的3D网游诸如《剑侠情缘3》、《九阴真经》,但一直无法像产出世界级的3D游戏大作,大部分游戏公司还是以代理国外优秀产品为主,导致资金外流及本土文化缺失。

随着移动硬件设备的日益强大,移动平台上的游戏也出现了惊人的增长,3D互动娱乐在手机领域的应用也逐渐增加。而移动领域存在诸多的操作系统,常用的有

1

华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现

Android、Windows Mobile、iOS 等,而在各个平台上的移植和实现对于开发商来说是不经济的,而目前国外优秀的成熟引擎已经成功解决这类需求,最为突出的要数Unity3D引擎,Unity3D中使用虚拟机技术使游戏编译结果独立于平台执行。国内对于跨平台引擎技术的研究还处于起步阶段,但熟练掌握和理解这些引擎的使用依然具有一定意义。

(三) 论文组织结构

论文按照从设计到实现,从理论到应用,主要围绕一款基于Unity3D的小型的汽车驾驶游戏,对一些3D游戏设计的技术进行相关的研究,并予以设计实现。本文共分为六章,各章节安排如下:

第一部分:绪论,阐述了论文的研究背景和意义、国内外研究现状以及本文主要研究内容;

第二部分:介绍了3D游戏开发的一般技术框架,及相关的第三方引擎,主要有图形渲染库、物理引擎及Unity3D的概述;

第三部分:汽车驾驶游戏的创意以及游戏系统的整体设计,并根据Unity3D框架规范设计了一种MVC层次结构;

第四部分:讨论游戏中各模块的技术研究和实现过程,主要的核心模块是场景渲染和物理仿真;

第五部分:展示当前的游戏并对效率、玩法等方面做一定分析;

第六部分:结论,对该设计进行总结并指出其中的不足,提出下一步展望。

二、 3D游戏技术的知识系统 (一) 3D图形库

1. 3D图形库简介

3D图形库被定义为显卡与应用程序直接的接口。编程人员只要调用3D图形库中的API(Application Programming Interface)函数,从而与硬件的驱动程序沟通,启动3D芯片内强大的3D图形处理功能,制作具有3D图形效果的软件。

3D图形库的执行具有非常快速的特点,并且具有高度的可移植性,其中的API函数定义为独立于任何程序设计语言的一组规范,在特定语言中的实现描述由国际标准化组织来制定。严格按照计算机图形学原理设计而成,符合光学和视觉原理,编程

2

华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现

人员只要用这些API函数定义点、线、面的三维特征,如位臵坐标、顶点颜色、法向向量、纹理坐标等就可以创建极其逼真的3D图像。许多三维演示系统都用3D图形库作为三维图形生成和控制的编程接口。目前主要应用的3D函数库有DirectX和OpenGL。

DirectX:微软公司专为PC游戏开发的API,与Windows操作系统兼容性好,可绕过图形显示接口(GDI)直接进行支持该API的各种硬件的底层操作,大大提高了游戏的运行速度,而且目前基本上是免费使用的。由于要考虑与各方面的兼容性,DirectX用起来比较麻烦、在执行效率上也未见得最优。

OpenGL:(开放式图形接口)由Silicon Graphics公司开发,能够在Windows 95、Windows NT、Macos、Beos、OS/2、以及Unix上应用的API。由于OpenGL起步较早,一直用于高档图形工作站,其3D图形功能很强,超过DirectX,能最大限度地发挥3D芯片的巨大潜力。在Windows中已经全面支持DirectX和OpenGL。在OpenGL的1.2版中还增加了对3DNow!标准的支持。

2. 3D图形库的渲染管线

绝大多数3D图形库实现都有相似操作顺序,一系列相关的处理阶段叫做3D图形的渲染管线,如图2-1显示了这些顺序,它是3D图形库处理数据的方法[3]。

图2-1 3D图形库渲染管线

下面详细介绍其中几个比较重要的阶段:

3

华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现

基于顶点的操作与基本装配:这个过程包括本地空间-世界空间-视图空间-背面拣选,主要是根据编程人员设臵的摄像机位臵、视锥属性和顶点索引对顶点数据进行一系列的数学运算,使3D图形的形状及位臵得以正确显示。

像素操作:该过程主要根据编程人员传入显卡的纹理及顶点的纹理坐标以及光照信息进行颜色计算、混合,并对线、面采用线性插值、二次线性插值等算法最终进行出像素的颜色。这个过程的计算一般由显卡固定管线的计算公式完成,如想得到更真实、更多样的效果,可采用可编程管线技术实现。

3. 3D程序基本工作流程

前面提到了调用3D图形库中的API函数来设计3D应用程序,现在更为详细的介绍这样的应用程序的一般工作流程,如图2-2所示:

act sequence main()[Loop]ApplicationInitial()ApplicationUpdate()ApplicationDestory()[for all renderObject]ObjectInitial()[for all renderObject]ObjectUpdate()[for all renderObject]ObjectDestory()

图2-2 3D图形库渲染管线

在程序主入口main函数中,首先调用ApplicationInitial函数进3D图形库的一些初始化工作:如通知显卡存储顶点、颜色、灯光、纹理等信息,接下来进入主循环不断调用ApplicationUpdate函数,ApplicationUpdate调用每一个渲染物体的ObjectUpdate函数,更新其在显存中的信息,并通知显存进行一次渲染管线流动,这样新的一帧3D图形就被渲染出来并产生动画。最后在应用程序结束时调用ApplicationDestory来进行清理工作。当然,复杂的3D应用框架还会利用多线程技术来处理逻辑运算和事件回调等内容。

4

华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现

(二) 物理引擎

1. 物理引擎简介

在游戏这项综合应用中中,除了华丽的画面渲染外,作为表现虚拟世界系统内在物理规律的计算是必不可少的。当被模拟的刚体的运动比较简单,我们可以在一定程度上通过编程或编写脚本来实现,如简单的加速和减速牛顿物理运动。但当模拟比较复杂的物体的碰撞、滚动、滑动或者弹跳的时候,通过编写底层算法会造成工程延误,这显然不符合软件工程的思想。成熟的物理引擎能够允许更复杂的物理模拟,像球形关节、轮子、气缸或者铰链,有些也支持非刚性体的物理属性,比如流体和布料。

物理引擎接受的输入是由外界调用模块传递过来的场景信息以及场景中物体的位臵信息。根据调用模块的不同,可能输出三种计算结果:场景与物体以及物体之间是否发生碰撞、碰撞发生的具体位臵以及发生碰撞后物体的具体位臵,并将计算结果传送给调用模块。如图2-3所示:

图2-3 物理引擎功能示意图

2. 物理引擎基本架构[4]

物理引擎一般分为两个重要部分,即碰撞检测和物理学世界。如图 2-4 所示:

5

华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现

图2-4 物理引擎基本架构

碰撞检测模块是物理引擎的核心模块,建立在物理学世界的基础上的[5]。其由初步碰撞检测、精确碰撞检测和精确求交三个基本模块组成,各模块的执行顺序如图2-5所示:

图2-5 碰撞检测模块流程图

在初始化阶段,碰撞检测模块给虚拟世界每个物体建立包围盒,比较常用的包围盒算法有AABB(Axis-aligned bounding box)、包围球、胶囊体等。逐步求精阶段将整个虚拟世界进行空间划分,主要用到数据结构有八叉树、k-d树和BSP树等,通过自顶向下的层次结构不断判断物体是否可能发生碰撞。最后再精确求交模块中使用凸体算法和射线检测算法得到精确的碰撞信息[6]。

物理学世界模块,是现实世界的抽象模型。物理学世界包含两个部分,一个是刚体物理学世界,一个是柔体物理学世界。在力的作用下,体积和形状都不发生改变的

6

华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现

物体称作刚体。刚体按照其运动特征可以分为平动、定轴转动、平面运动、定点运动和一般运动等形式。在一般情况下,运动刚体上各点的轨迹、速度和加速度是各不相同的,但彼此之间存在着一定的关系。体积和形状在力的作用下能够发生变化的物体称作柔体,如流体、布料等。因此,物理学世界的模块结构如图 2-6 所示。

图 2-6 物理学世界模块结构图

3. Havok和PhysX的比较

物理引擎中需要大量的计算,并且不同物理引擎针对特定显卡有3D加速功能,因此,开发3D游戏前选择一款合适的物理引擎是及其重要的,否则会极大影响游戏的性能。目前 在游戏市场占重要地位的有Intel的Havok和Nvidia的PhysX。

Havok,全称为Havok Game Dynamics SDK,译作Havok游戏动力开发包,主要分为Physics、FX、Animation、Behavior、Cloth、Destruction、AI几大组件。Havok成立于1998年,总部位于爱尔兰首都都柏林。引擎基于C/C++语言而成,2000年在游戏开发者大会上发布了Havok 1.0,最新版本为5.5,2007年9月,Intel宣布收购Havok。在全平台上,共有353种游戏使用Havok引擎,超过了PhysX的309种,使用Havok的著名游戏有:《极品飞车:亡命天涯》、《星际争霸2》、《暗黑破坏神3》、《上古卷轴4》等,图为Havok的展示Demo:

图2-7 Havok引擎展示(左为Havok Physics,右为Havok Cloth)

PhysX物理运算引擎由五名年轻的技术人员开发,他们成立了AGEIA公司。由于

7

华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现

PhysX物理引擎在设计上就并不适合用CPU去计算,因此AGEIA公司还为PhysX引擎设计了专门的运算硬件,PhysX物理加速卡,其中的运算核心被称为PPU(Physics processing Unit)。图2-8为AGEIA当初设想的未来PC组成部分。

图2-8 AGEIA当初设想的未来PC组成部分

2008年,Nvdia收购了AGEIA,物理加速卡停止开发,而是将PhysX物理加速功能移植到Nvdia GPU中,用户不必额外购买PhysX物理加速卡就能享受到PhysX物理加速功能。在PC平台上,共有269种游戏采用PhysX引擎,而Havok为163种。

表4-1 Havok和PhysX在各方面的比较

物理引擎: 物理加速 执行效率 跨平台性 是否开源 游戏引擎集成 主要游戏平台

Havok 多线程加速 快 全平台 是 寒霜 Wii、Xbox 360、PS3 PhysX 只支持Nvdia GPU加速 不开启GPU加速下略逊一筹 全平台 否 Unity3D PC (三) Unity3D

1. Unity3D简介

Unity3D是由Unity Technologies开发的一款全面整合的专业游戏引擎,其具有的功能使得开发人员可专注于游戏的设计而忽略底层的技术实现,达到快速开发的目的。Unity类似于Director,Blender game engine, Virtools 或 Torque Game Builder等利用交互的图型化开发环境为首要方式的软件其编辑器运行在Windows 和Mac OS

8

华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现

X下。其主要的特色有[7]:

图形动力:内部封装了DirectX和OpenGL图形渲染库,并附带一些常用的渲染组件及着色器脚本。

物理仿真:Unity3d不但整合了Nvidia PhysX物理引擎,并在其基础上封装了游戏中常会用到的物理组件,如碰撞体、连接体等。

跨平台性:可发布游戏至Windows、Mac、iOS、Android、Xbox、Wii或PS3平台,也可以利用Unity web player或者Flash插件发布网页游戏,支持Mac和Windows的网页浏览。

资源商城:开发人员可在资源商城中购买其他人开发的资源(代码、模型等),进行高效复用。

资源服务器:Unity资源服务器是一个附加的版本控制的产品,但比起SVN更适合游戏团队中不同职位的人员共同使用(程序、策划、美术)。

性能分析器:引擎中自带一个Profiler分析器,开发人员可在编辑器或者设备连线进行性能分析CPU和GPU不同阶段的效率。

2. Unity3D基本概念

一个完整的lJnity3d程序是由若干个场景(Scene)组合起来的,每个场景中又包含有许多游戏对象(GameObject),每个对象可以具有若干组件(Component),其中的继承自MonoBehavior的脚本组件进行初始化、更新等操作,而我们在场景所看到的内容是由摄像头(Camera)来呈现并控制的。

场景(Scene):场景是Unity3D程序的基本组成单位,任何一个Unity3D程序都是由若干场景组合而成,程序通过脚本在这些场景之间跳转。场景通过场景图的形式组织,场景图实际上是一种树形结构,其中每个节点就是一个游戏对象。对象与对象之间存在父子关系,即当父级对象移动、旋转、缩放时,子级对象也跟着一起变换,如图2-9所示:

[8]

9

华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现

图2-9 旋转一个父节点同时它的子节点也跟着旋转

游戏对象(GameObject):在场景中按照场景图形式组织,场景图实际上是一种树形结构,如图。树形层次结构中的节点,加入的特定组件后就成了有实际功能的对象,如可渲染网格、摄像机、光源等,游戏对象可以打包成.prefab格式的文件方便复用。

组件(Component):组件可以是网格(Mesh)、光源(Light)、摄像机(Camera)、粒子系统(Particle)、物理碰撞体(Collider)、布料(Cloth)、连接体(Joint)、声音(Audio)、动画(Animation)以及最重要的脚本(Script)。Unity3D的设计是以面向对象理论为基础,Unity3D支持C#、JavaScript和Boo三种脚本语言,如果对象继承自MonoBehavior脚本对象,生命周期将交给Unity3D来管理,如图2-10所示:

10

华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现

图2-10 MonoBehavior的生命周期

三、 车辆驾驶游戏的设计 (一) 游戏创意

随着移动硬件设备的日益强大,并且移动平台技术在这几年得到迅猛发展,移动平台上的游戏也出现了惊人的增长,轻量级、微创新、时间碎片化一直是移动游戏的发展趋势。《愤怒的小鸟》、《顽皮鳄鱼爱洗澡》等几款创意游戏都得到了巨大的成功,这些游戏的共同特点有:

1.操作简单,游戏目的简单。不论是高级游戏玩家还是不常玩游戏的用户群,很容易知道如何操作并理解游戏的目的。如《愤怒的小鸟》只需一只手指调整弹弓的角度和力度最终将猪击飞,《顽皮鳄鱼爱洗澡》只要用手指刮开泥土将水引导进鳄鱼的浴缸;

11

华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现

2.真实的物理规律。游戏中充分考虑到现实生活中的物理规律,如《愤怒的小鸟》中飞行的速度、重力的考虑,《顽皮鳄鱼爱洗澡》中水流的流体走向;

3.多样化的设计。别出心裁的设计不仅使玩家产生兴趣继续挑战,也会更加开动玩家的脑筋。如《愤怒的小鸟》中小鸟不同的技能、会荡秋千的猪、冰雪的场景和会引燃的炸药,《顽皮鳄鱼爱洗澡》中清水、污水、泥石流产生的不同效果,以及风扇、喷枪的设计等;

图3-1 左为《愤怒的小鸟》游戏截图,右为《顽皮鳄鱼爱洗澡》游戏截图

笔者按照这些思路产生了将游乐场中“碰碰车”这一游乐项目搬上有游戏的想法,游戏同样遵从以上三个特点,下面是简单的游戏策划:

游戏名称:《疯狂碰碰车》 游戏类型:3D休闲益智类游戏 游戏平台:PC、Android、iOS

游戏模式:多人联机模式,单人AI练习模式

游戏玩法:玩家通过操作车辆,在竞技场中与其他玩家操作的车辆进行娱乐,玩家应该尽量操作车辆的前部去撞其他车辆的背部,这样可以抢夺对方的游戏积分,同样的,应该通过躲避尽量避免自己的背部遭到袭击。达到游戏时间后进行积分结算,确定本场游戏排名。

游戏操作:前、后、左、右,在移动设备上可映射为重力感应和滑动操作。 游戏可玩性:1.多样的车辆,不同车辆具有不同的外形、速度以及技能等属性,如加速快的豪华跑车、碰撞效果惊人的火车头等,玩家通过胜过获得游戏币来购买梦寐以求的车辆;2.多样的地形,可以绘制不同地域风情的竞技场,并且不同的竞技场

12

华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现

应该有不同的物理属性增加车辆驾驶趣味,如冰川、泥泞的森林,以及适合车辆躲避的树、草、坡度等布臵;3.真实的物理仿真,如前两个特性所列,不同的设计会带来丰富的物理仿真效果。

(二) 游戏框架结构设计

如前文所述,一个游戏包含多个场景,玩家根据当前的游戏进度和选项进入不同场景。而游戏模块为游戏提供了一些必须用到的功能,这些功能,都是完全独立与所有的场景存在的,它们并不知道到底有多少关卡,关卡的内容是什么,它们的主要工作,就是与游戏的控制单元进行信息的交换,从而支持游戏的进行。

游戏框架设计必须符合游戏的玩法需求和所使用的工具,不同于大型的MMO(Massive Multiplayer On-Line) Game,《疯狂碰碰车》没有复杂的游戏系统,更加侧重于游戏可玩性的设计,并且由于使用Unity3D引擎,省去了许多底层模块的设计,其中核心的模块为:图形渲染、物理仿真、网络联机。图3-2为游戏系统的框架结构图:

疯狂碰碰车 图形渲染天空盒、地形、海平面、投影、3D模型、粒子系统外部输入物理仿真用户界面玩法逻辑网络联机音频输出日志记录Unity Mono虚拟机硬件设备

图3-2 游戏框架结构

13

华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现

(三) 游戏层次结构设计

前文提到Unity3D中每个场景按照树形层次结构组织游戏对象,并且每个游戏对象可以拥有若干组件。所以整个游戏系统的实现必须遵守这种规范,在这种规范下为了符合软件设计的高内聚、低耦合的原则,使用MVC模型设计了一套游戏的层次结构,这样的好处是使游戏的结构清晰简单,三层之间互相隔离、互不影响,日后功能的扩展方便。如图3-3所示:

cmp sequence 视图层Hierarchy:MainCameraGameObject2GameObject3……控制层Component:UIManagerNetworkManager……?use?逻辑层Component:Component1Component2Component3Component4Component5…… 图3-3 游戏层次结构图

游戏系统分为三个层来设计,分别是:

视图层:主要为加入到场景层次结构的游戏对象,这些对象常常是渲染对象或摄

像机。

控制层:在主摄像机或者空对象中加入的管理脚本组件,这些脚本主要是针对对

应的功能模块的进行控制及与其他功能模块进行通信,如界面管理类、网络联机管理类。

模型层:主要是在渲染对象中加入的逻辑脚本组件,这些脚本对游戏对象进行逻

辑处理。

14

华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现

四、 车辆驾驶游戏的实现 (一) 场景渲染实现

考虑到游戏的需求,整个场景主要包括几类渲染对象,如天空盒、水面、地形、外部导入的3D模型、投影、粒子系统等,如图4-1所示:

图形渲染天空盒水面地形3D模型投影粒子系统 图4-1 游戏场景中的渲染对象

下面主要介绍一些重要渲染模块的具体实现: 1. 天空盒

所谓天空盒,就是用一个作为远景贴图的立方体。在立方体的前后左右上五个面贴上纹理(需要时底面也可以帖)。在简单的天空盒实现中,只需要填写好六个面的24个顶点,并设臵立方体随着视点的移动而移动,这样就会给玩家带来天空是在极远处的错觉。但在较为复杂的应用中,还需要使用天空盒的纹理来生成Cube Map,并用之来做水面倒影、云影等特效的贴图。

图4-2 天空盒由六个面映射而成

在Unity3D中对天空盒有很好的支持,开发人员只需要几个简单的步骤:

15

华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现

1.创建一个材质;

2.并设臵Shader为Unity3D自带的RenderFX->Skybox; 3.为天空的各个面选择贴图;

4.在Render Setting中设臵天空材质为前面创建的材质。 图4-3为实现的效果图:

图4-3 实现的天空效果

2. 水面

水面的本质即按照流体规律动态更新顶点位臵的网格,Unity3D中的自带有水的对象,但为了使得水面具有更真实的表现力,还要为水面加入反射、折射等效果,这些效果主要是通过渲染到纹理(Render-to-Texture,RTT)来实现。渲染到纹理,简单来说就是把当前场景的一部分或者全部渲染成一个可以使用的纹理上面,然后再另外一次渲染中把它当作普通的纹理使用。

光穿过水面,但被水面改变传播方向又返回水面之上叫做反射。如图4-4所示,向量I被称为入射光线(incident ray),从眼睛射到物体表面,当I到达表面的时候,它会根据表面的法向量N被从R方向反射出去,第二条光线是被反射光线(reflected ray),所以可以根据向量I和N用公式4-1计算被反射的向量R:

16

华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现

图4-4光线反射图

公式4-1

折射与反射不同的是,光线虽然改变角度但依然进入水面,斯涅耳定律描述了两种媒介之间的分界面光发生了什么,如图4-5所示,折射向量被表示为T,代表“transmitted”。斯涅耳定律在数学上可以用公式4-2表示。

图4-5 斯涅耳折射定律

公式4-2

具体代码实现中,我们以折射为例,我们首先将要被折射的物体加入到一个层——m_RefractLatyer中,然后设臵一个摄像机用于渲染这个层上的所有物体,得到纹理_RefractionTex并传给shader,然后在水面进行纹理混合计算。以下为实现折射效果的关键代码和水面效果截图:

17

华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现

代码清单4-6 折射RTT关键代码

图4-7 带有折射、反射的水面效果

3. 地形[9]

在Unity3D中通过高度图来实现地形,高度图实际上是一张矩形的灰度图,在灰度模式中,颜色通过0~255来表示,0代表黑色,255代表白色,像素越亮代表地势越高,255的像素代表此次顶点最高,反之亦然,所以像素灰度值和顶点的高度可以用公式4-3表示,其中L为像素的灰度值,高度和地形最低点,求得网格顶点的高度y。

公式4-3

、分别为Unity3D中定义的地形

程序在需要渲染地形时通过读取这张图片,并按照灰度生成顶点高度不一的矩形网格。这样大大减少了游戏模型体积。

18

华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现

Unity3D中的地形模块不但可以导入高度图,还可以用笔刷为绘制地形纹理、树、草和岩石,所见即所得,大大减少了开发人员的工作量。图4-8为小岛的效果图:

图4-8 小岛地形效果图

4. 光照和投影

在一般3D应用程序中,光照和投影是各自独立的计算过程,光照既可以使用固

定管线、也可以再Shader自定光照模型实现。投影则是一个双过程的技术[10]:

1.首先,场景以光源的位臵为视点被渲染。每个渲染图像的像素的深度值被记录在一个“深度纹理”中,被称为阴影贴图。

2.然后,场景从眼睛的位臵渲染,但是用标准的投影纹理把阴影贴图从灯的位臵通过投影矩阵运算混合到场景中。在每个像素,深度采样值(从被投影的深度纹理中)与片段到灯的距离进行比较。如果后者小,这意味着这个片段不是阴影,不需要和投影纹理进行混合。

图4-9举例说明了阴影的深度比较。在图的左边,正要被着色的点P在阴影中,因为这个点的深度值(ZB)比记录的阴影贴图的深度值(ZA)大。相反,在图的右边显示了点P的深度值与在阴影贴图中记录的值相同的情况。这意味着在在P和灯源之间没有任何物体,因此P不再阴影中。

19

华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现

图4-9 投影的深度比较

对于静态物体的投影渲染的第一过程计算,可以在游戏开发过程中进行。Unity内臵的光照贴图烘培工具是Illuminate Labs 的Beast,其主要原理是对场景中所有静态物体的光照和投影进行计算,并利用特殊的.exr光照贴图格式用以记录光照和投影两种信息,在游戏运行时用光照贴图对模型原有材质进行混合渲染,即可得到正确的光照和投影效果。这样大大减少了游戏运行过程中计算量,提高游戏效率。如图4-10所示,进行一些参数设臵(实际上是设臵光照模型和投影过程二的阴影纹理),选择“Bake Scene”即可为场景生成光照贴图。

图4-10 光照贴图烘焙窗口

20

华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现

(二) 场景物理仿真实现

如前文提到,Unity3D内臵对Nvidia PhysX支持,其实际工作就是封装了一些游戏中常用的组件以及脚本中调用的类,只要将这些碰撞体组件赋予游戏对象,就被加入PhysX虚拟世界进行运算。下面主要介绍常用组件:

刚体(Rigid):在PhysX的基本概念中,两个碰撞体发生碰撞必须要求其中至少有一个刚体。所以对运动的物体要赋予刚体属性,刚体可设臵质量、重力计算、碰撞检测频率等属性。

网格碰撞体(Mesh Collider):根据游戏玩法,玩家通过车身前部撞击其他车的后部进行游戏,在车身前部和后部各加入一个网格碰撞体,网格碰撞体可通过网格数据定义凸体形状,比起基本碰撞体更加精确。

地形碰撞体(Terrain Collider):通过地形模块生成的地形可以选择加入地形碰撞体,就这样就可以不需要定义网格数据来定义网格碰撞体,其本质就是根据高度图生成的网格碰撞体。

轮胎碰撞体(Wheel Collider):汽车经常在陡峭的地形上行走,如果将轮胎定义为一般碰撞体则容易造成碰撞而导致车身飞起,轮胎碰撞体具有阻尼弹性和摩擦力的属性,不同类型的车辆可以使用不同的轮胎碰撞体参数,模拟出各种效果。

弹簧连接体(Spring Joint):物体之间如果通过连接有力的作用,可通过设臵连接体来实现。弹簧连接体能够模拟物体之间的阻尼作用。

如图4-11所示,场景中需要进行物理计算的主要有三种:地形、一些3D模型(如栅栏)和汽车,其中地形和3D模型为静态物体,只要为其增加静态碰撞体组件即可。而汽车的构造较为复杂,首先在游戏中前车身和后车身为不同的积分部位,因此要定义为两个网格碰撞体,并且为了得到真实的物理效果,需要将轮胎定义为车轮碰撞体并通过弹簧连接体与车身相连,如图4-12所示。

21

华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现

物理仿真地形汽车栅栏地形碰撞体网格碰撞体刚体网格碰撞体车轮碰撞体弹簧连接体 图4-11 物理仿真模块实现

图4-12汽车物理仿真的构造

(三) 汽车动力学模拟

进行了汽车的物理组件装配之后,还要实现汽车动力学模型。由于汽车在驾驶过程中影响其运动情况的因素错综复杂,操纵机构对汽车的行驶存在着多输入、多藕合、非线性的控制作用,而实时渲染游戏要求动力学仿真计算快速,要在精确度与计算速度之间折中,需要简化动力学模型[11]。

为了简化模型,作如下假设:所有车辆都是刚体,不考虑多节车厢的情况。汽车在行驶过程中,因速度的变化受到引擎的驱动力和阻力(动摩擦力、空气阻力),如果汽车在转弯还会收到轮胎的侧摩擦力,汽车行驶过程中的基本受力图如4-13所示:

22

华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现

图4-13 车辆行驶受力图

假设汽车当前正在转弯且速度为v,且由于转弯轮胎和车身的z轴并不重合,速

度v在轮胎x轴方向的分量为v.x,k为阻力系数,根据公式4-4可得出汽车受得的阻力f和轮胎侧摩擦力f侧:

公式4-4

汽车当前引擎提供的驱动力决定于汽车当前的档位,档位由当前速度大小决定,

不同的车辆有不同的档位设计,为了控制汽车能达到的最大速度,使用二次线性增量法,vtop表示汽车能达到的最大速度,n表示该车当前的档位, vn表示达到该档位的最低速度,Fn表示n档位收到的驱动力,k为公式4-4中的阻力系数,这样,速度、档位、驱动力之间关系可用公式4-5表示:

根据以上得出的汽车动力学模型,需要在Unity3D中通过脚本组件实现,首先为

23

公式4-5

华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现

汽车对象增加一个继承自MonoBehavior的Car.js脚本,在其中重写两个更新函数Update()和FixedUpdate(),Update()函数在每帧绘制之前调用一次,FixedUpdate()通过一个计时器定时调用,时间间隔可在工程中设臵。然后在这两个更新函数进行动力学计算。以下为两个更新函数的代码及各个函数的作用,其中的计算公式中使用了大量的常量因子,不同的汽车可配臵不同的参数以产生逼真的效果:

代码清单4-14 Car.js的更新函数

GetInput():得到当前玩家的输入,如前进、后退、左转、右转;

Check_If_Car_Is_Flipped():判断汽车是否被撞翻,如果是的话,使汽车被翻正; UpdateWheelGraphics():根据汽车瞬时速度旋转轮胎; UpdateGear():根据汽车瞬时速度变换档位;

UpdateFriction ():如果汽车在转弯状态,轮胎会受到的侧摩擦力,侧摩擦力和瞬时速度的x轴分量的平方成正比,如公式4-4;

UpdateDrag ():计算当前受到的阻力,阻力和速度的平方成正比,如公式4-4; CalculateEnginePower ():根据当前档位计算引擎提供的动力,如公式4-5; ApplyThrottle ():根据引擎动力使汽车刚体获得向前力模拟油门效果; ApplySteering ():根据引擎动力和玩家的转向输入使汽车刚体获得侧向力模拟转弯效果。

(四) 用户图形界面实现

Unity3D的另一个便利就是强大的插件功能,开发人员可以定制自己功能的菜单栏选项、组件并注册到编辑器中使用。这种设计方式产生了很多第三方插件,使用这些插件可以使开发人员更快速开发需要的功能。

NGUI是Unity3D中最著名的界面插件,其提供了强大的界面组件和相应的类,下

24

华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现

面主要介绍一些NGUI概念:

UIRoot:任何一个场景中界面根节点,其中至少包括一个UICamera。

UICamera:其本质是一个具有UICamera脚本组件的摄像机,脚本中封装了对其子游戏对象的渲染等功能。

Anchor:用于偏移子游戏对象的布局,如上、下、左、右、中。

Panel:NGUI中的窗口。

Button:按钮元素,可执行OnClick、OnPress、OnRelease等回调函数 Label:标签元素,用于显示文字。

Atlas:为了节省内存中图片和字体的占用量,NGUI可以将字体和小图片生成一

张大图片,Atlas中保存小图的坐标信息,可用于索引到小图Sprite,如图4-15所示:

图4-15 左图为一张Atlas部分截图,右图为一个Sprite的坐标索引

Sprite:其中有两种特殊的类型,同样起到减少资源占用量的目的。

UISlicedSprite将Sprite分为九个切片,每个切片可自由缩放,适合制作边框;UITiledSprite可以进行平铺扩展,如图4-16所示:

图4-16 左图为UISlicedSprite,右图为UITiledSprite

本游戏中要开发主要有两类界面:一类是主菜单界面,例如玩家在启动游戏后需

25

华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现

表5-1 测试设备配臵表

设备名 操作系统 CPU型号 CPU核数 CPU频率 GPU 运行内存 分辨率

Lenovo IdeaPad Y400N Windows7 i5-3230M 双核 2.6GHz GT750M(2GB) 4GB 1366*768 小米2 MIUI(Android 4.1) 高通APQ8064 四核 1.5GHz Adreno 320 2GB 1280*720 如图5-5所示,在Lenovo Y400N中CPU和GPU耗费时间基本相同,每帧总共耗时为10ms左右,平均帧率达到90fps,游戏完全流畅。

图5-5 Y400N性能分析

如图5-6所示,在小米2中CPU平均每帧的计算时间为19.74ms左右,GPU为25.53ms左右,平均帧率达到23fps,达到手机游戏流程运行要求。但在碰撞过程中,瞬时帧率只有10fps左右,从性能分析器中发现是参与了大量的物理计算,这是需要后一步工作进行解决的。

31

华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现

图5-6 小米2联机性能分析

六、 项目总结 (一) 总结

在笔者刚进入大学急切想知道一款游戏需要学习什么时,却发现总结成系统性的技术文档或书籍非常少,大多为某方面如3D绘制、网络编程或者工具的使用等只言片语,对于游戏这样一项多领域技术的综合应用是远远不够的。因此,觉得很有必要把自己了解到一款3D游戏成设计到实现做一次总结,为同类问题提供参考。

受条件限制,论文不能把游戏涉及得每一个细节写清楚,只能从各个角度做一些介绍,请予以谅解,论文所围绕的汽车游戏由本人独立完成,主要内容如下:

1.研究底层图形渲染API,如Direct3d、OpenGL的渲染管线及一般图形程序的结构,并学习Unity3D的使用快速渲染出需要的效果,如天空盒、海平面、投影;

2.研究底层碰撞检测算法,比较Havok和PhysX两款物理引擎及基本概念,学习在Unity3D中使用PhysX,对车辆物理模型进行设计和运动学实现;

3.利用高度图创建场景地形,学习3dmax建模创建栅栏碰撞体及车身前后碰撞体分离;

4.研究Unity3D中UI制作插件NGUI的基本概念和使用,如Atlas及Sprite,这将大大节省界面图形资源的内存占有率,完成玩家操作界面;

5.研究网络编程和Unity3D RPC,解决图形渲染和物理引擎同步问题,用以实现多人模式下玩家对战。

32

华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现

(二) 下一步工作的展望

一款受玩家好评、受市场认可的游戏需要精心的打磨,由于时间有限,本文实现的只是一些基本的功能,还有许多尚未解决的技术问题和可玩性修改。笔者认为以下工作可作为今后的重点:

1.手机运行游戏时,碰撞的过程中帧率只有10fps左右,找到优化解决办法,提升游戏效率;

2.建立网络传输延迟的解决办法;

3.本人在3D建模方面经验不足,模型建立后缺乏美感,因此在今后的工作要加强这方面的学习;

4.完成游戏结束后的结算界面和提高现有用户操作界面的友好性。

5.更多样、更有挑战的玩法,如场景可加入F1赛车道、可跌入的冰河等,车辆可考虑增加大卡车、火车头等车种,或者增加一些车辆交通规则;

6.增加适合不同情境的音乐,增加玩家的听觉震撼;

7.考虑车身碰撞振动,可考虑游戏支持震动手柄操作,这将大大增加玩家触觉感受;

8.增加车辆AI控制,可使玩家在单人模式进行游戏; 9.行人、车辆的随机生成和Al控制;

33

华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现

参考文献

[1]. [2]. [3].

中国版协游戏工委. 2012年中国游戏产业调查报告[R]. 2012. 魏强. 3D棒球游戏的设计与实现[D]. 厦门:厦门大学.2008.

Dave Shreiner等著,徐波等译. OpenGL编程指南(原书第5版)[M]. 北京:机械工业

出版社,2006,6-8. [4].

王树军. 三维游戏引擎中物理引擎关键技术的研究[D]. 天津:天津大学.2007.

[5]. Luke Ludwig,John Haurykiewicz. Collision checking analysis tool: discovering dynamic collisions in a modeling and simulation environment [J]. Int J Interact Des Manuf(2007):135–141. [6]. [7]. [8]. [9].

Christer Erison. Real-Time Collision Detection [M]. CRC Press,2004,7-21. 朱柱. 基于Unity3D的虚拟实验系统设计与应用研究[D]. 武汉:华中师范大学,2012. 童恒建. 三维数字景观中场景图的组织与绘制[J]. 测绘信息与工程,2005,(05):9-11. 陈健松,徐从富,潘云鹤. 基于地形的三维场景绘制方法[J]. 计算机工程与应

用,2006,(08):31-33.

[10]. 谭同德,许绘香,赵红领,余晓霞. 一种基于Shadow Mapping的阴影生成改进算法[J]. 计算机工程与应用,2008,(32):165-168.

[11]. 汪璇. 基于OSG的分布式汽车驾驶模拟器运行仿真及碰撞检测研究[D]. 武汉:武汉理工大学,2008.

[12]. W.Richard Stevens等著. UNIX网络编程-卷1:套接字联网API(第3版) [M]. 北京:人民邮电出版社,2010,29-30.

34

本文来源:https://www.bwwdw.com/article/xw96.html

Top