




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
毕业设计论文题目:基于Unity引擎的“疯狂碰碰车”手游项目设计姓名:学号:专业年级:分校: 2016年11月目录HYPERLINK摘要 IHYPERLINK4.7程序架构 30HYPERLINK\l"_第5章_游戏展示与性能分析"第5章游戏展示与性能分析 31HYPERLINK\l"_5.1_游戏展示"5.1游戏展示 32HYPERLINK\l"_5.2_性能分析"5.2性能分析 32HYPERLINK\l"_第6章_项目总结"结束语 33HYPERLINK\l"_致谢"致谢 34HYPERLINK\l"_参考文献"参考文献 35HYPERLINK\l"_第6章_项目总结"附录 36绪论1.1研究背景和研究意义这几年,中国经济以8%左右的速度持续平稳的增长,而在刚刚过去的2015年中国游戏市场实际销售收入602.8亿元,同比增长率为35.1%,首次突破600亿规模。游戏产业己经成为经济市场中增长速度最快的热点,是众所关注的焦点。游戏是文化创意产业里的一部分,创意经济是知识经济的核心内容,更是其经济的重要表现形式,没有创意就没有新经济。游戏设计是文化艺术创意和商品生产的结合,游戏产业的发展在中国的经济发展中具有十分重要的意义。(1)有利于保护民族的文化传统和价值观,抵制文化入侵。(2)推动创意产业的快速发展,提升我国经济产业发展水平。(3)提供健康快乐的大众娱乐方式,提升消费者的休闲体验感受。游戏的发展从表现方法上经历了2D游戏和3D游戏两个阶段。游戏设计,特别是3D游戏开发综合运用了计算机图形学、物理仿真和网络通讯等技术,并且移动平台技术在这几年得到迅猛发展,轻量级、微创新、时间碎片化一直是移动游戏的发展趋势,如《愤怒的小鸟》、《顽皮鳄鱼爱洗澡》、《神庙逃亡》的用户数都已经过亿。论文通过一个简单的“碰碰车”创意予以实现,涵盖了3D游戏涉及到的一些基本技术,能深入理解这些领域的底层技术并熟练掌握成熟的引擎使用,对于将来开发具有自主知识产权的游戏提供了参考。1.2国内外研究现状国外的3D游戏起步在90年代初,美国的卡马克的《重返德军总部3D》是第一部3D第一人称射击游戏,由其开发的Doom引擎也成为最早3D游戏引擎。国内首款自主研发的3D游戏始于2003年,到目前为止,国内在3D游戏已经有了很多的研究,但由于3D游戏开发的复杂性及经济效益的考虑,国内只有屈指可数的互联网公司拥有自主研发的3D游戏引擎,中小型公司还是使用国外较为成熟的游戏引擎和工具,如虚幻,Unity3D,寒霜。虽然近年来国内涌现一些优秀的3D网游诸如《剑侠情缘3》、《九阴真经》,但一直无法像产出世界级的3D游戏大作,大部分游戏公司还是以代理国外优秀产品为主,导致资金外流及本土文化缺失。随着移动硬件设备的日益强大,移动平台上的游戏也出现了惊人的增长,3D互动娱乐在手机领域的应用也逐渐增加。而移动领域存在诸多的操作系统,常用的有Android、WindowsMobile、iOS等,而在各个平台上的移植和实现对于开发商来说是不经济的,而目前国外优秀的成熟引擎已经成功解决这类需求,最为突出的要数Unity3D引擎,Unity3D中使用虚拟机技术使游戏编译结果独立于平台执行。国内对于跨平台引擎技术的研究还处于起步阶段,但熟练掌握和理解这些引擎的使用依然具有一定意义。1.3Unity引擎研究背景Unity3D是一个让你轻松创作的多平台的游戏开发工具,是一个全面整合的专业性游戏引擎。它是由丹麦Unity公司开发的游戏开发工具,具体的特性包含整合的编辑器、跨平台发布、地形编辑、着色器、脚本、网络、物理、版本控制等特性。通过Unity简单的用户见面,你可以完成任何工作。这些为你节省了大量的时间。然而对于一个商业化的游戏引擎来说,快速高效的完成类似的特效应该是分内之事。游戏引擎的初衷就是将游戏开发者的精力转移到游戏的可玩性上来。1.4论文组织结构论文按照从设计到实现,从理论到应用,主要围绕一款基于Unity3D的小型的汽车驾驶游戏,对一些3D游戏设计的技术进行相关的研究,并予以设计实现。本文共分为六章,各章节安排如下:第1章:绪论,阐述了论文的研究背景和意义、国内外研究现状以及本文主要研究内容;第2章:介绍了3D游戏开发的一般技术框架,及相关的第三方引擎,主要有图形渲染库、物理引擎及Unity3D的概述;第3章:汽车驾驶游戏的创意以及游戏系统的整体设计,并根据Unity3D框架规范设计了一种MVC层次结构;第4章:讨论游戏中各模块的技术研究和实现过程,主要的核心模块是场景渲染和物理仿真;第5章:展示当前的游戏并对效率、玩法等方面做一定分析;第2章3D游戏技术基础2.13D图形技术2.1.13D图形库简介3D图形库被定义为显卡与应用程序直接的接口。编程人员只要调用3D图形库中的API函数,从而与硬件的驱动程序沟通,启动3D芯片内强大的3D图形处理功能,制作具有3D图形效果的软件。3D图形库的执行具有非常快速的特点,并且具有高度的可移植性,其中的API函数定义为独立于任何程序设计语言的一组规范,在特定语言中的实现描述由国际标准化组织来制定。严格按照计算机图形学原理设计而成,符合光学和视觉原理,编程人员只要用这些API函数定义点、线、面的三维特征,如位置坐标、顶点颜色、法向向量、纹理坐标等就可以创建极其逼真的3D图像。许多三维演示系统都用3D图形库作为三维图形生成和控制的编程接口。目前主要应用的3D函数库有DirectX和OpenGL。(1)DirectX是微软公司专为PC游戏开发的API,与Windows操作系统兼容性好,可绕过图形显示接口(GDI)直接进行支持该API的各种硬件的底层操作,大大提高了游戏的运行速度,而且目前基本上是免费使用的。由于要考虑与各方面的兼容性,DirectX用起来比较麻烦、在执行效率上也未见得最优。(2)OpenGL由SiliconGraphics公司开发,能够在Windows95、WindowsNT、Macos、Beos、OS/2、以及Unix上应用的API。由于OpenGL起步较早,一直用于高档图形工作站,其3D图形功能很强,超过DirectX,能最大限度地发挥3D芯片的巨大潜力。在Windows中已经全面支持DirectX和OpenGL。在OpenGL的1.2版中还增加了对3DNow标准的支持。2.1.23D图形库的渲染管线绝大多数3D图形库实现都有相似操作顺序,一系列相关的处理阶段叫做3D图形的渲染管线。(1)基于顶点的操作与基本装配。这个过程包括本地空间-世界空间-视图空间-背面拣选,主要是根据编程人员设置的摄像机位置、视锥属性和顶点索引对顶点数据进行一系列的数学运算,使3D图形的形状及位置得以正确显示。(2)像素操作。该过程主要根据编程人员传入显卡的纹理及顶点的纹理坐标以及光照信息进行颜色计算、混合,并对线、面采用线性插值、二次线性插值等算法最终进行出像素的颜色。这个过程的计算一般由显卡固定管线的计算公式完成,如想得到更真实、更多样的效果,可采用可编程管线技术实现。2.1.33D程序基本工作流程前面提到了调用3D图形库中的API函数来设计3D应用程序,现在更为详细的介绍这样的应用程序的一般工作流程。在程序主入口main函数中,首先调用ApplicationInitial函数进行3D图形库的一些初始化工作,如通知显卡存储顶点、颜色、灯光、纹理等信息,接下来进入主循环不断调用ApplicationUpdate函数,ApplicationUpdate调用每一个渲染物体的ObjectUpdate函数,更新其在显存中的信息,并通知显存进行一次渲染管线流动,这样新的一帧3D图形就被渲染出来并产生动画。最后在应用程序结束时调用ApplicationDestory来进行清理工作。当然,复杂的3D应用框架还会利用多线程技术来处理逻辑运算和事件回调等内容。2.2物理仿真技术PhysX2.2.1物理引擎简介在游戏这项综合应用中中,除了华丽的画面渲染外,作为表现虚拟世界系统内在物理规律的计算是必不可少的。当被模拟的刚体的运动比较简单,可以在一定程度上通过编程或编写脚本来实现,如简单的加速和减速牛顿物理运动。但当模拟比较复杂的物体的碰撞、滚动、滑动或者弹跳的时候,通过编写底层算法会造成工程延误,这显然不符合软件工程的思想。成熟的物理引擎能够允许更复杂的物理模拟,像球形关节、轮子、气缸或者铰链,有些也支持非刚性体的物理属性,比如流体和布料。物理引擎接受的输入是由外界调用模块传递过来的场景信息以及场景中物体的位置信息。根据调用模块的不同,可能输出三种计算结果:场景与物体以及物体之间是否发生碰撞、碰撞发生的具体位置以及发生碰撞后物体的具体位置,并将计算结果传送给调用模块。2.2.2物理引擎基本架构物理引擎一般分为两个重要部分,即碰撞检测和物理学世界。碰撞检测模块是物理引擎的核心模块,建立在物理学世界的基础上的。其由初步碰撞检测、精确碰撞检测和精确求交三个基本模块组成。在初始化阶段,碰撞检测模块给虚拟世界每个物体建立包围盒,比较常用的包围盒算法有AABB算法和OBB算法。逐步求精阶段将整个虚拟世界进行空间划分,主要用到数据结构有八叉树、k-d树和BSP树等,通过自顶向下的层次结构不断判断物体是否可能发生碰撞。最后再精确求交模块中使用凸体算法和射线检测算法得到精确的碰撞信息。物理学世界模块,是现实世界的抽象模型。物理学世界包含两个部分,一个是刚体物理学世界,一个是柔体物理学世界。在力的作用下,体积和形状都不发生改变的物体称作刚体。刚体按照其运动特征可以分为平动、定轴转动、平面运动、定点运动和一般运动等形式。在一般情况下,运动刚体上各点的轨迹、速度和加速度是各不相同的,但彼此之间存在着一定的关系。体积和形状在力的作用下能够发生变化的物体称作柔体,如流体、布料等。因此,物理学世界的模块结构如2.2.3Havok和PhysX的比较物理引擎中需要大量的计算,并且不同物理引擎针对特定显卡有3D加速功能。因此,开发3D游戏前选择一款合适的物理引擎是及其重要的,否则会极大影响游戏的性能。目前,在游戏市场占重要地位的有Intel的Havok和Nvidia的PhysX。Havok,全称为HavokGameDynamicsSDK,译作Havok游戏动力开发包,主要分为Physics、FX、Animation、Behavior、Cloth、Destruction、AI几大组件。Havok成立于1998年,总部位于爱尔兰首都都柏林。引擎基于C/C++语言而成,2000年在游戏开发者大会上发布了Havok1.0,最新版本为5.5,2007年9月,Intel宣布收购Havok。在全平台上,共有353种游戏使用Havok引擎,超过了PhysX的309种,使用Havok的著名游戏有:《极品飞车:亡命天涯》、《星际争霸2》、《暗黑破坏神3》、《上古卷轴4》等。PhysX物理运算引擎由五名年轻的技术人员开发,他们成立了AGEIA公司。由于PhysX物理引擎在设计上就并不适合用CPU去计算,因此AGEIA公司还为PhysX引擎设计了专门的运算硬件,PhysX物理加速卡,其中的运算核心被称为PPU(PhysicsprocessingUnit)。2008年,Nvdia收购了AGEIA,物理加速卡停止开发,而是将PhysX物理加速功能移植到NvdiaGPU中,用户不必额外购买PhysX物理加速卡就能享受到PhysX物理加速功能。在PC平台上,共有269种游戏采用PhysX引擎,而Havok为163种。Havok和PhysX在各方面的比较具体如表2-1所示。表2-1Havok和PhysX对比表物理引擎HavokPhysX物理加速多线程加速只支持NvdiaGPU加速执行效率快略逊一筹跨平台性全平台全平台是否开源是否游戏引擎集成寒霜Unity3D主要游戏平台Wii、Xbox360、PS3、PC手游2.3汽车驾驶模拟技术这是一种利用汽车3D模型,材质和贴图创建一个碰碰车对象,通过C#脚本语言编程,来达到控制汽车对象的效果,模拟出玩家驾驶游戏中碰碰车的技术。2.3.1汽车加速控制模拟通过按下键盘上W、S可以控制汽车后车轮的转动,同时赋予汽车对象一个加速度,并通过计算位移汽车模型的位置,来达到汽车前进的效果。汽车前进的程序控制代码:floatv=Input.GetAxis("Vertical"); flWheelCollider.motorTorque=v*MotorTorque; frWheelCollider.motorTorque=v*MotorTorque;2.3.2汽车转弯控制模拟当启动汽车后,通过按下键盘上A、D可以控制汽车前车轮的转向,在汽车前行或者停下时通过车轮的转向控制汽车的行驶方向。汽车转向的程序控制代码:myCar_FrontWheels.Find("FrontWheels_Left").Rotate(tempWheel-TurnDirect*speedIn,0,0);myCar_FrontWheels.Find("FrontWheels_Right").Rotate(temp-WheelTurnDirect*speedIn,0,0);2.3.3仪表盘模拟仪表盘主要是车速显示、油门显示和方向盘的角度显示,油门显示的是在按下油门的时候油门的大小,长按W则速度加快,当按下刹车键的时候,油门随之递减。方向显示的是方向盘的转动角度,在转动方向盘的时候,车轮会跟着一起转动。2.4场景加载切换技术Unity官方提供了4种加载场景(scene)的方法,分别是:
Application.LoadLevel();同步加载
Application.LoadLevelAsync();异步加载
Application.LoadLevelAddictive();同步附加式加载
Application.LoadLevelAddictiveAsync();异步附加式加载下面对这四种方法进行简要的介绍和分析:
同步加载:假设当前场景为A,我们要切换到场景B,unity会在切换场景的时候将场景B中的所有内容(场景B中所有的静态物体,不包括后续代码中Instantiate实例化的物体)都加载到内存中,然后销毁A,显示B。由于加载B是同步进行的(也就是在一个线程中),所以当B场景较大的时候执行此方法会感觉到卡顿。
异步加载:这个与第一种情况基本一样,唯一的区别是加载B的过程是异步的(也就是加载新场景的行为是在一个后台线程中进行的,不影响主线程的运行),这样在加载B的时候当前场景A不受影响,可以继续运行,所以即使场景B很大也不会感觉到卡顿。
同步附加式加载:假设当前场景是A,我们要加载场景B,unity在加载B的时候不会销毁A,也就是说加载结束之后A和B将同时存在,这个适合于世界地图比较大的时候,根据人走到的位置来动态的加载世界地图中的不同部分。当然前提是将世界地图做成多个不同的scene文件。
异步附加式加:这种情况与上一种基本一样,区别仍然在于加载B的过程是在一个后台线程中异步进行的。2.5C#脚本语言编程技术C#是一种安全的、稳定的、简单的、优雅的,由C和C++衍生出来的面向对象的编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复杂特性(例如没有宏以及不允许多重继承)。C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。C#是面向对象的编程语言。它使得C++程序员可以高效的开发程序,且因可调用由C/C++编写的本机原生函数,因此绝不损失C/C++原有的强大的功能。因为这种继承关系,C#与C/C++具有极大的相似性,熟悉类似语言的开发者可以很快的转向C#。2.6跨平台手机游戏发布技术2.6.1发布Android使用Unity3D发布Android项目需要Java的SDK和Android的SDK运行环境。在安装完Java的SDK之后要注意Java环境变量的配置。在配置完成的Java的JDK和Android的JDK之后,还需要在Unity3D中对AndroidSDK进行定位,完成Unity3D环境的配置。运行Unity3D之后,点击菜单栏中的Edit-Preferences,在AndroidSDKLocation选项里定位AndroidSDK。首选项里面的参数设置具体如图2-1首选项设置面板所示。2-1首选项设置面板图当完成环境配置之后就可以发布Android游戏了。Unity3D的游戏发布是以场景为单位,通过加入需要发布的不同场景,然后选择需要发布的平台就可以进行发布。发布Android的游戏界面具体如图2-2Android发布面板图。2-2Android发布面板图2.6.2发布Ios在Unity3D上发布Ios时,需要设置好PlayerSettings选项。首先确保机器中装Xcode,IOS设备连接在电脑中,然后选中IOS设备,单机BuildandRun这时候Unity3D就开始导出这个游戏项目了。导出成功后自动打开Xcode并且运行导出的这个项目。发布Ios的游戏界面具体如图2-3Ios发布面板图。2-3Ios发布面板图2.7Unity3D引擎介绍2.7.1Unity3D简介Unity3D是由UnityTechnologies开发的一款全面整合的专业游戏引擎,其具有的功能使得开发人员可专注于游戏的设计而忽略底层的技术实现,达到快速开发的目的。Unity类似于Director,Blendergameengine,Virtools或TorqueGameBuilder等利用交互的图型化开发环境为首要方式的软件其编辑器运行在Windows和MacOSX下。其主要的特色有:图形动力:内部封装了DirectX和OpenGL图形渲染库,并附带一些常用的渲染组件及着色器脚本。物理仿真:Unity3d不但整合了NvidiaPhysX物理引擎,并在其基础上封装了游戏中常会用到的物理组件,如碰撞体、连接体等。跨平台性:可发布游戏至Windows、Mac、iOS、Android、Xbox、Wii或PS3平台,也可以利用Unitywebplayer或者Flash插件发布网页游戏,支持Mac和Windows的网页浏览。资源商城:开发人员可在资源商城中购买其他人开发的资源(代码、模型等),进行高效复用。资源服务器:Unity资源服务器是一个附加的版本控制的产品,但比起SVN更适合游戏团队中不同职位的人员共同使用(程序、策划、美术)。性能分析器:引擎中自带一个Profiler分析器,开发人员可在编辑器或者设备连线进行性能分析CPU和GPU不同阶段的效率。2.7.2Unity3D基本概念完整的Unity3d程序是由若干个场景(Scene)组合起来的,每个场景中又包含有许多游戏对象(GameObject),每个对象可以具有若干组件(Component),其中的继承自MonoBehavior的脚本组件进行初始化、更新等操作,而在场景所看到的内容是由摄像头(Camera)来呈现并控制的。场景(Scene):场景是Unity3D程序的基本组成单位,任何一个Unity3D程序都是由若干场景组合而成,程序通过脚本在这些场景之间跳转。场景通过场景图的形式组织,场景图实际上是一种树形结构,其中每个节点就是一个游戏对象。对象与对象之间存在父子关系,即当父级对象移动、旋转、缩放时,子级对象也跟着一起变换。游戏对象(GameObject):在场景中按照场景图形式组织,场景图实际上是一种树形结构。树形层次结构中的节点,加入的特定组件后就成了有实际功能的对象,如可渲染网格、摄像机、光源等,游戏对象可以打包成.prefab格式的文件方便复用。组件(Component):组件可以是网格(Mesh)、光源(Light)、摄像机(Camera)、粒子系统(Particle)、物理碰撞体(Collider)、布料(Cloth)、连接体(Joint)、声音(Audio)、动画(Animation)以及最重要的脚本(Script)。Unity3D的设计是以面向对象理论为基础,Unity3D支持C#、JavaScript和Boo三种脚本语言,如果对象继承自MonoBehavior脚本对象,生命周期将交给Unity3D来管理。第3章游戏总体设计3.1游戏创意随着移动硬件设备的日益强大,并且移动平台技术在这几年得到迅猛发展,移动平台上的游戏也出现了惊人的增长,轻量级、微创新、时间碎片化一直是移动游戏的发展趋势。《愤怒的小鸟》、《顽皮鳄鱼爱洗澡》等几款创意游戏都得到了巨大的成功,这些游戏的共同特点有:1.操作简单游戏目的简单明确。不论是高级游戏玩家还是不常玩游戏的用户群,很容易知道如何操作并理解游戏的目的。如《愤怒的小鸟》只需一只手指调整弹弓的角度和力度最终将猪击飞,《顽皮鳄鱼爱洗澡》只要用手指刮开泥土将水引导进鳄鱼的浴缸。2.真实的物理规律游戏中充分考虑到现实生活中的物理规律,如《愤怒的小鸟》中飞行的速度、重力的考虑,《顽皮鳄鱼爱洗澡》中水流的流体走向。3.多样化的设计别出心裁的设计不仅使玩家产生兴趣继续挑战,也会更加开动玩家的脑筋。如《愤怒的小鸟》中小鸟不同的技能、会荡秋千的猪、冰雪的场景和会引燃的炸药,《顽皮鳄鱼爱洗澡》中清水、污水、泥石流产生的不同效果,以及风扇、喷枪的设计等。3.1.1游戏策划按照这些思路产生了将游乐场中“碰碰车”这一游乐项目搬上有游戏的想法,“碰碰车游戏”同样遵从以上三个特点,下面是简单的游戏策划。游戏名称:《疯狂碰碰车》游戏类型:3D休闲益智类游戏游戏平台:PC、Android、iOS游戏模式:多人联机模式,单人AI练习模式3.1.2游戏玩法玩家通过操作车辆,在竞技场中与其他玩家操作的车辆进行娱乐。玩家应该尽量操作车辆的前部去撞其他车辆的背部,这样可以抢夺对方的游戏积分,同样的,应该通过躲避尽量避免自己的背部遭到袭击。达到游戏时间后进行积分结算,确定本场游戏排名。游戏操作:前、后、左、右,在移动设备上可映射为重力感应和滑动操作。游戏可玩性:(1)多样的车辆,不同车辆具有不同的外形、速度以及技能等属性,如加速快的豪华跑车、碰撞效果惊人的火车头等,玩家通过胜过获得游戏币来购买梦寐以求的车辆。(2)多样的地形,可以绘制不同地域风情的竞技场,并且不同的竞技场应该有不同的物理属性增加车辆驾驶趣味,如冰川、泥泞的森林,以及适合车辆躲避的树、草、坡度等布置。(3)真实的物理仿真,如前两个特性所列,不同的设计会带来丰富的物理仿真效果。3.2游戏功能设计3.2.1游戏总体功能设计一个游戏包含多个场景,玩家根据当前的游戏进度和选项进入不同赛道。而游戏模块为游戏提供了一些必须用到的功能,这些功能,都是完全独立与所有的场景存在的,它们并不知道到底有多少关卡,关卡的内容是什么,它们的主要工作,就是与游戏的控制单元进行信息的交换,从而支持游戏的进行。
游戏框架设计必须符合游戏的玩法需求和所使用的工具,不同于大型的MMO(MassiveMultiplayerOn-Line)Game,《疯狂碰碰车》没有复杂的游戏系统,更加侧重于游戏可玩性的设计,并且由于使用Unity3D引擎,省去了许多底层模块的设计,其中核心的模块为:场景系统,车辆管理系统,比赛系统,赛车控制系统。具体如图3-1游戏总体功能设计图。疯狂碰碰车疯狂碰碰车赛车控制系统比赛系统车辆管理系统场景系统赛车控制系统比赛系统车辆管理系统场景系统加速选择赛道选择车辆天空加速选择赛道选择车辆天空转弯刹车车辆进场车辆个性化地形转弯刹车车辆进场车辆个性化地形倒计时玩家车库水面倒计时玩家车库水面漂移漂移赛车追逐赛车商城场景光照赛车追逐赛车商城场景光照比赛终点检测比赛终点检测比赛结算比赛结算图3-1游戏总体功能设计图3.2.2各模块功能设计1.场景系统设计1.功能:场景系统主要功能是在玩家选择一个场景后,进入比赛场地,展现给玩家一个3D赛道场景。是一个给玩家展示游戏世界的模块。赛道场景包括游戏场景,游戏特效,以及UI界面的显示。游戏场景主要设计:场景中需要包括天空、地形、水面。其中路面赛道环绕整个地形一圈,分别标注起点和重点标识建筑。要求场景中包含大桥,水面从大桥下流过,使得地形更加丰富,营造出玩家在一个庞大的赛道中进行比赛的效果。(2)游戏特效主要设计:太阳光照、游戏特效。需要阳光照射到比赛场景中,背光的地方如隧道、山峰背后灯光要变暗。当玩家到达终点需要特效。(3)UI界面显示设计:记分牌、加速指示器、时间计时器等。记分牌用来记录玩家的目前的分。加速指示器用来显示目前玩家碰碰车的速度。时间计时器用来显示玩家目前的游戏时间。2.车辆管理系统设计2.功能:车辆管理系统主要功能是让玩家可以随心所欲的选择一款自己喜欢的赛车进行比赛,并对赛车可以进行特性化的装扮,配置。车辆管理系统包括游戏中的:(1)玩家车库:玩家可以在车库中选择一款自己喜爱的赛车。(2)赛车加工厂:玩家可以在加工厂里,为自己的爱车做个性化的修改。(3)赛车商城:玩家可以在商城中,购买自己喜爱的赛车,配件,皮肤。4.比赛系统设计4.功能:比赛系统主要功能是让玩家可以与其他赛车在赛道上进行比赛。比赛系统包括:选择赛道:玩家进入赛场前先选择一个自己喜欢的赛道。车辆进场:所有车辆依次安排到出发点排列。倒计时:倒计时5秒后,玩家车辆可以受到玩家控制。碰碰车车追逐赛:碰碰车之间可以超越,碰撞,目标是以最快的速度到达终点。当碰撞强度过大会导致碰碰车侧翻。终点检测:到达终点后游戏结束。比赛结算:对本场比赛的赛车排名,用时,得分进行一个详细的结算。4.赛车控制系统设计4.功能:赛车控制系统的主要功能是让玩家可以锁心所欲的控制自己的赛车。赛车控制系统包括:加速:赛车轮胎加速转动,加速行驶。刹车:汽车轮胎减速转动,减速行驶。转弯:赛车轮胎左右转动,改变赛车方向。漂移:赛车尾部向赛车转弯相反方向转动,轮胎停止转动3.3游戏流程结构设计游戏流程内容包括配置选择赛车,选择要进行比赛的赛道场景,控制赛车进行比赛,具体如图3-2游戏流程结构设计图登录游戏登录游戏是否更换赛车 是否更换赛车选择车辆选择赛道是选择车辆选择赛道否进入比赛场地进入比赛场地比赛倒计时比赛倒计时比赛开始比赛开始控制赛车控制赛车是否到达终点是否到达终点是比赛结束比赛结束图3-2游戏流程结构设计图游戏实现4.1场景系统4.1.1天空所谓天空盒,就是用一个作为远景贴图的立方体。在立方体的前后左右上五个面贴上纹理(需要时底面也可以帖)。在简单的天空盒实现中,只需要填写好六个面的24个顶点,并设置立方体随着视点的移动而移动,这样就会给玩家带来天空是在极远处的错觉。但在较为复杂的应用中,还需要使用天空盒的纹理来生成CubeMap,并用之来做水面倒影、云影等特效的贴图。在Unity3D中对天空盒有很好的支持,开发人员只需要几个简单的步骤:(1)创建一个材质;(2)并设置Shader为Unity3D自带的RenderFX->Skybox;(3)为天空的各个面选择贴图;(4)在RenderSetting中设置天空材质为前面创建的材质。具体如图4-1游戏天空图。图4-1游戏天空图4.1.2地形在Unity3D中通过高度图来实现地形,高度图实际上是一张矩形的灰度图,在灰度模式中,颜色通过0~255来表示,0代表黑色,255代表白色,像素越亮代表地势越高,255的像素代表此次顶点最高,反之亦然,其中L为像素的灰度值。分别为Unity3D中定义的地形高度和地形最低点,求得网格顶点的高度y。程序在需要渲染地形时通过读取这张图片,并按照灰度生成顶点高度不一的矩形网格。这样大大减少了游戏模型体积。Unity3D中的地形模块不但可以导入高度图,还可以用笔刷为绘制地形纹理、树、草和岩石,所见即所得,大大减少了开发人员的工作量。具体如图4-2游戏小岛地形图。
图4-2游戏小岛地形图4.1.3水面水面的本质即按照流体规律动态更新顶点位置的网格,Unity3D中的自带有水的对象,但为了使得水面具有更真实的表现力,还要为水面加入反射、折射等效果,这些效果主要是通过渲染到纹理(Render-to-Texture,RTT)来实现。渲染到纹理,简单来说就是把当前场景的一部分或者全部渲染成一个可以使用的纹理上面,然后再另外一次渲染中把它当作普通的纹理使用。光穿过水面,但被水面改变传播方向又返回水面之上叫做反射。向量I被称为入射光线(incidentray),从眼睛射到物体表面,当I到达表面的时候,它会根据表面的法向量N被从R方向反射出去,第二条光线是被反射光线(reflectedray),所以可以根据向量I和N用公式4-1计算被反射的向量R:折射与反射不同的是,光线虽然改变角度但依然进入水面,斯涅耳定律描述了两种媒介之间的分界面光发生了什么,具体代码实现中,我们以折射为例,我们首先将要被折射的物体加入到一个层——m_RefractLatyer中,然后设置一个摄像机用于渲染这个层上的所有物体,得到纹理_RefractionTex并传给shader,然后在水面进行纹理混合计算。具体如图4-3游戏水面图。
4-3游戏水面图
4.1.4光照在一般3D应用程序中,光照和投影是各自独立的计算过程,光照既可以使用固定管线、也可以再Shader自定光照模型实现。投影则是一个双过程的技术:(1)场景以光源的位置为视点被渲染。每个渲染图像的像素的深度值被记录在一个“深度纹理”中,被称为阴影贴图。(2)场景从眼睛的位置渲染,但是用标准的投影纹理把阴影贴图从灯的位置通过投影矩阵运算混合到场景中。在每个像素,深度采样值(从被投影的深度纹理中)与片段到灯的距离进行比较。如果后者小,这意味着这个片段不是阴影,不需要和投影纹理进行混合。因为这个点的深度值(ZB)比记录的阴影贴图的深度值(ZA)大。相反,在图的右边显示了点P的深度值与在阴影贴图中记录的值相同的情况。这意味着在在P和灯源之间没有任何物体,因此P不再阴影中。对于静态物体的投影渲染的第一过程计算,可以在游戏开发过程中进行。Unity内置的光照贴图烘培工具是IlluminateLabs的Beast,其主要原理是对场景中所有静态物体的光照和投影进行计算,并利用特殊的.exr光照贴图格式用以记录光照和投影两种信息,在游戏运行时用光照贴图对模型原有材质进行混合渲染,即可得到正确的光照和投影效果。这样大大减少了游戏运行过程中计算量,提高游戏效率。4.2车辆管理系统4.2.1显示车辆数据在场景中新建一个GUIText,具体操作GameObject->CreateOther->GUIText。把GUIText里面的Text修改为CarNumber=0,FontSize修改为30,Color修改为白色,Font字体修改为BlitzkriegNF字体。具体如图4-4GUIText参数设置图。图4-4GUIText参数设置图4.2.2购买车辆操作判断玩家是否购买车辆需要添加一个UGUI的Button组件。Button组件参数解释:(1)Interactable(是否可用):勾选,按钮可用,取消勾选,按钮不可用,并进入Disabled状态。(2)Transition(过渡方式):ColorTint(颜色改变)SpriteSwap(图片切换)Animation(执行动画)(后面有详细介绍)(3)TargetGraphic(过渡效果作用目标):可以是任一Graphic对象。(4)Navigation(按钮导航):假如你现在有四个按钮,当你点击第一个时,第一个会保持选中状态,然后通过按键盘方向键,会导航将选中状态切换到下一个按钮上,例如你的第一个按钮下方存在第二个按钮,当你选中第一个按方向键下时,第一个按钮的选中状态取消,第二个按钮进入选中状态,前提是这些按钮都开启了导航功能。具体如图4-5Button参数设置图。图4-5Button参数设置图4.3物理模拟系统如前文提到,Unity3D内置对NvidiaPhysX支持,其实际工作就是封装了一些游戏中常用的组件以及脚本中调用的类,只要将这些碰撞体组件赋予游戏对象,就被加入PhysX虚拟世界进行运算。下面主要介绍常用组件:刚体(Rigid):在PhysX的基本概念中,两个碰撞体发生碰撞必须要求其中至少有一个刚体。所以对运动的物体要赋予刚体属性,刚体可设置质量、重力计算、碰撞检测频率等属性。网格碰撞体(MeshCollider):根据游戏玩法,玩家通过车身前部撞击其他车的后部进行游戏,在车身前部和后部各加入一个网格碰撞体,网格碰撞体可通过网格数据定义凸体形状,比起基本碰撞体更加精确。地形碰撞体(TerrainCollider):通过地形模块生成的地形可以选择加入地形碰撞体,就这样就可以不需要定义网格数据来定义网格碰撞体,其本质就是根据高度图生成的网格碰撞体。轮胎碰撞体(WheelCollider):汽车经常在陡峭的地形上行走,如果将轮胎定义为一般碰撞体则容易造成碰撞而导致车身飞起,轮胎碰撞体具有阻尼弹性和摩擦力的属性,不同类型的车辆可以使用不同的轮胎碰撞体参数,模拟出各种效果。弹簧连接体(SpringJoint):物体之间如果通过连接有力的作用,可通过设置连接体来实现。弹簧连接体能够模拟物体之间的阻尼作用。场景中需要进行物理计算的主要有三种:地形、一些3D模型(如栅栏)和汽车,其中地形和3D模型为静态物体,只要为其增加静态碰撞体组件即可。而汽车的构造较为复杂,首先在游戏中前车身和后车身为不同的积分部位,因此要定义为两个网格碰撞体,并且为了得到真实的物理效果,需要将轮胎定义为车轮碰撞体并通过弹簧连接体与车身相连。具体如图4-6物理仿真结构图。图4-6物理仿真结构图依次打开GameObject->CreateEmpty,创建一个空游戏对象,然后选择该对象,打开菜单栏中的Component->Physics->Rigidbody,创建一个刚体。具体如图4-7创建刚体示意图。:图4-7创建刚体示意图调整刚体组件属性面板,具体如图4-8刚体组件属性面板图。图4-8刚体组件属性面板图最后添加BoxCollider盒碰撞体,盒碰撞体是一个立方体外形的基本碰撞体,该碰撞体可以调整为不同大小的长方体,把碰撞体添加到碰碰车模型上,使得碰碰车拥有了模拟碰撞的属性。具体如图4-9BoxCollider盒碰撞体属性面板图。图4-9BoxCollider盒碰撞体属性面板图4.4碰碰车控制系统进行了汽车的物理组件装配之后,还要实现汽车动力学模型。由于汽车在驾驶过程中影响其运动情况的因素错综复杂,操纵机构对汽车的行驶存在着多输入、多藕合、非线性的控制作用,而实时渲染游戏要求动力学仿真计算快速,要在精确度与计算速度之间折中,需要简化动力学模型。为了简化模型,作如下假设:所有车辆都是刚体,不考虑多节车厢的情况。汽车在行驶过程中,因速度的变化受到引擎的驱动力和阻力(动摩擦力、空气阻力),如果汽车在转弯还会收到轮胎的侧摩擦力。假设汽车当前正在转弯且速度为v,且由于转弯轮胎和车身的z轴并不重合,速度v在轮胎x轴方向的分量为v.x,k为阻力系数。汽车当前引擎提供的驱动力决定于汽车当前的档位,档位由当前速度大小决定,不同的车辆有不同的档位设计,为了控制汽车能达到的最大速度,使用二次线性增量法,vtop表示汽车能达到的最大速度,n表示该车当前的档位,vn表示达到该档位的最低速度,Fn表示n档位收到的驱动力。根据以上得出的汽车动力学模型,需要在Unity3D中通过脚本组件实现,首先为汽车对象增加一个继承自MonoBehavior的Car.js脚本,在其中重写两个更新函数Update()和FixedUpdate(),Update()函数在每帧绘制之前调用一次,FixedUpdate()通过一个计时器定时调用,时间间隔可在工程中设置。然后在这两个更新函数进行动力学计算。以下为两个更新函数的代码及各个函数的作用,其中的计算公式中使用了大量的常量因子,不同的汽车可配置不同的参数以产生逼真的效果。GetInput():得到当前玩家的输入,如前进、后退、左转、右转;Check_If_Car_Is_Flipped():判断汽车是否被撞翻,如果是的话,使汽车被翻正;UpdateWheelGraphics():根据汽车瞬时速度旋转轮胎;UpdateGear():根据汽车瞬时速度变换档位;UpdateFriction():如果汽车在转弯状态,轮胎会受到的侧摩擦力,侧摩擦力和瞬时速度的x轴分量的平方成正比,如公式4-4;UpdateDrag():计算当前受到的阻力,阻力和速度的平方成正比,如公式4-4;CalculateEnginePower():根据当前档位计算引擎提供的动力,如公式4-5;ApplyThrottle():根据引擎动力使汽车刚体获得向前力模拟油门效果;ApplySteering():根据引擎动力和玩家的转向输入使汽车刚体获得侧向力模拟转弯效果。4.5UI界面系统Unity3D的另一个便利就是强大的插件功能,开发人员可以定制自己功能的菜单栏选项、组件并注册到编辑器中使用。这种设计方式产生了很多第三方插件,使用这些插件可以使开发人员更快速开发需要的功能。
NGUI是Unity3D中最著名的界面插件,其提供了强大的界面组件和相应的类,下面主要介绍一些NGUI概念:UIRoot:任何一个场景中界面根节点,其中至少包括一个UICamera。UICamera:其本质是一个具有UICamera脚本组件的摄像机,脚本中封装了对其子游戏对象的渲染等功能。Anchor:用于偏移子游戏对象的布局,如上、下、左、右、中。Panel:NGUI中的窗口。Button:按钮元素,可执行OnClick、OnPress、OnRelease等回调函数Label:标签元素,用于显示文字。Atlas:为了节省内存中图片和字体的占用量,NGUI可以将字体和小图片生成一张大图片,Atlas中保存小图的坐标信息,可用于索引到小图Sprite,Sprite:其中有两种特殊的类型,同样起到减少资源占用量的目的。UISlicedSprite将Sprite分为九个切片,每个切片可自由缩放,适合制作边框;UITiledSprite可以进行平铺扩展本游戏中要开发主要有两类界面:一类是主菜单界面,例如玩家在启动游戏后需要进入一个登陆界面,可以进行汽车选择,游戏选项设置,进入竞技场开始游戏等操作。另一类是HUD(HeadUpDisplay)界面,即游戏进行过程中的界面,这个界面需要在碰撞到其他车辆时进行“冒分”,以及显示玩家当前游戏积分和排名等。前文已经介绍了NGUI的一些基本概念。具体如图4-10游戏登陆界面图。图4-10游戏登陆界面图HUD的实现与主界面略有区别,由于要保证总是显示最前,所以要较现有的3D场景之后渲染。Unity3D中会按照场景中摄像机深度值排列渲染顺序,所以要将UICamera的深度值设置的比主摄像机大。4.6网络系统要实现多人模式下的玩家对战,还需要加入网络模块,现有的个人计算机网络主要通过套接字(socket)进行消息传递,套接字可以选择两种主要协议:传输控制协议(TransmissionControlProtocol,简称TCP)和用户数据报协议(UserDatagramProtocol,简称UDP)。TCP是一种面向连接的、可靠的通信协议,UDP是一种面向无连接的传输层协议,更为快速但数据包可能丢失[12]。在游戏开发过程中会根据需要选择不同的协议,如在局域网大厅中,显示房间信息和用户聊天都可以选用UDP,在需要实时保存的玩家信息(如装备、财宝等)必须使用可靠的TCP传输。Unity3DRPC(RemoteProcedureCallProtocol)是Unity3D封装的一套网络应用层套件,跨越了传输层和应用层,使得联网的服务器、客户端之间可以用过RPC函数进行远端函数调用,使得开发包括网络游戏更加容易。其中可设置可靠(reliable)和不可靠(unreliable)两种调用方式,分别对应于TCP和UDP。
根据游戏设计,减少玩家的繁琐的操作,第一个进入游戏的玩家会自动成为房主,并定时用UDP方式在局域网中广播自己的ip地址,后面进入游戏的玩家如果收到这个ip地址,就自动连接这个ip地址进入游戏。作为局域网游戏,汽车信息的更新是频繁的,所以为了提高游戏效率,可以使用不可靠的RPC调用方式。游戏系统主要实现了NetworkManger.cs和NetworkHandle.cs两个类,前者主要管理进入和退出房间的UDP逻辑和其他玩家的RPC网络ID,后者实现了相应的RPC函数,用于在对战过程中,每个客户端(包括房主)定时传输自己的位置、积分等信息。4.7程序架构架构设计的目的是用来对整个游戏工程搭建一个扩展性强,高内聚低耦合的游戏工程。4.7.2脚本程序功能基础类虚拟场景基类。被游戏开始界面,游戏中界面等各个类继承,如游戏主流程管理类。用来展示各界面的切换,对游戏的展示等功能。赛车虚拟基类。被赛车控制类继承,赛车控制类。用来实现赛场上,对赛车的控制的功能,以及物理仿真功能。游戏数据基类。用来实现玩家在游戏里面的分数计算功能。UI界面基类。被展示玩家交互信息的类继承,如UI界面数据类。用来实现所有游戏中给玩家展示游戏进度和排名等内容的功能。4.7.2脚本程序交互Unity3D在是可以创建游戏场景的,在每个游戏场景中又可以创建游戏对象,把每个场景的游戏对象融合在一起就是一款3D游戏。游戏场景之间属于同等级的关系,为了让游戏场景之前交互我们需要有一个凌驾所有场景之上的“全局脚本”。所有场景都能与这个唯一的全局脚本进行交互。当场景切换时可将临时逻辑数据写入全局脚本中,切换完毕后再去全局脚本中取之前保存的数据,从而实现交互。具体交互方式如图4-10脚本交互方式图。图4-11脚本交互方式图游戏展示与性能分析5.1游戏展示5.1.1游戏功能展示按照游戏登录界面,倒计时界面,碰碰车撞翻界面,碰碰车行驶界面,到达终点界面的主线顺序显示。具体如图5-1游戏登录界面。图5-1游戏登录界面具体如图5-2倒计时界面。图5-2倒计时界面具体如图5-3碰碰车撞翻界面。图5-3碰碰车撞翻具体如图5-4碰碰车行驶界面。图5-4碰碰车行驶界面具体如图5-5到达终点界面。图5-5到达终点界面5.1.2游戏展示实现游戏展示的功能中实现了各个场景中切换。展示了玩家从登陆,进入场景,开始驾驶碰碰车最后到达终点的过程,是一个完整的游戏流程。可以让玩家体验到比赛的快感,也可以体验到到达终点的成就感。5.2性能分析《疯狂碰碰车》的目标平台是PC和移动平台,所以选用了目前中端硬件配置的笔记本和手机分别进行了性能测试,笔记本选用的是LenovoIdeaPadY400N,手机选用的是小米2。具体如表5-1所示。表5-1测试设备配置表设备名:LenovoIdeaPadY400N小米2操作系统:Windows7MIUI(Android4.1)CPU型号:i5-3230M高通APQ8064CPU核数:双核四核CPU频率:2.6GHz1.5GHzGPU:GT750M(2GB)Adreno320运行内存:4GB2GB分辨率:1366*7681280*720在LenovoY400N中CPU和GPU耗费时间基本相同,每帧总共耗时为10ms左右,平均帧率达到90fps,游戏完全流畅。结束语在笔者急切想知道一款游戏需要学习什么时,却发现总结成系统性的技术文档或书籍非常少,大多为某方面如3D绘制、网络编程或者工具的使用等只言片语,对于游戏这样一项多领域技术的综合应用是远远不够的。因此,觉得很有必要把自己了解到一款3D游戏成设计到实现做一次总结,为同类问题提供参考。
受条件限制,论文不能把游戏涉及得每一个细节写清楚,只能从各个角度做一些介绍,请予以谅解,论文所围绕的汽车游戏由本人独立完成,主要内容如下:1.研究底层图形渲染API,如Direct3d、OpenGL的渲染管线及一般图形程序的结构,并学习Unity3D的使用快速渲染出需要的效果,如天空盒、海平面、投影;2.研究底层碰撞检测算法,比较Havok和PhysX两款物理引擎及基本概念,学习在Unity3D中使用PhysX,对车辆物理模型进行设计和运动学实现;3.利用高度图创建场景地形,学习3dmax建模创建栅栏碰撞体及车身前后碰撞体分离;4.研究Unity3D中UI制作插件NGUI的基本概念和使用,如Atlas及Sprite,这将大大节省界面图形资源的内存占有率,完成玩家操作界面;5.研究网络编程和Unity3DRPC,解决图形渲染和物理引擎同步问题,用以实现多人模式下玩家对战。致谢经过紧张的忙碌和工作,本次毕业设计已经接近尾声,作为一个本科生的毕业设计,由于经验的匮乏,难免有许多考虑不周全的地方,如果没有导师的督促指导,以及一起工作的同学们的支持,想要完成这个设计是难以想象的。在这里首先要感谢我的导师吕小星老师。他平日里工作繁多,但在我做毕业设计的每个阶段,从外出实习到查阅资料,设计草案的确定和修改,中期检查,后期详细设计等整个过程中都给予了我悉心的指导。我的设计较为复杂繁琐,但是张老师仍然细心地纠正错误。除了敬佩吕老师的专业水平外,他的治学严谨和科学研究的精神也是我永远学习的榜样,并将积极影响我今后的学习和工作。然后还要感谢大学四年来所有的老师,为我打下计算机专业知识的基础;同时还要感谢同学们,在自己设计的同时,和我共同学习,帮助我克服了很多困难,正是因为有了他们的支持和鼓励,此次毕业设计才会顺利完成,衷心感谢大家。此外,感谢计算机学院和实验室老师给我提供充足的设备资源和良好的学习环境,感谢母校——北京开放大学三年来对我的大力栽培!最后对参加论文评阅和答辩工作的老师们表示衷心的感谢!参考文献[1](加)KennethC.Finney.3D游戏开发大全(高级篇)海南出版社2013[2].中国版协游戏工委.2012年中国游戏产业调查报告[R].海南出版社2015.
[3].魏强.3D棒球游戏的设计与实现[D].厦门:厦门大学出版社.2013.
[4].DaveShreiner等著,徐波等译.OpenGL编程指南(原书第5版)[M].北京:机械工业出版社,2013,6-8.
[5].王树军.三维游戏引擎中物理引擎关键技术的研究[D].天津:天津大学出版社.2013.
[6].朱柱.基于Unity3D的虚拟实验系统设计与应用研究[D].武汉:华中师范大学出版社,2014.
[7].陈健松,徐从富,潘云鹤.基于地形的三维场景绘制方法[J].计算机工程与应用,凤凰出版社2014,(08):31-33.
[8].谭同德,许绘香,赵红领,余晓霞.一种基于ShadowMapping的阴影生成改进算法[J].计算机工程与应用,海南出版社2014,(32):165-168.
[9].汪璇.基于OSG的分布式汽车驾驶模拟器运行仿真及碰撞检测研究[D].武汉:武汉理工大学出版社,2014.
[10].W.RichardStevens等著.UNIX网络编程-卷1:套接字联网API(第3版)[M].北京:人民邮电出版社,2015,29-30.附录1、获取场景管理者类类名:GameMgr作用:可以在项目中随时取到游戏管理者全局变量,用来管理游戏各个场景主流程的切换。采用设计模式:单例模式写法://私有成员 privatestatic
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 面向复杂制造环境的车间调度优化技术研究
- 课题申报书:粮食等主要农产品供需能力问题研究
- 课题申报书:来华留学地区学会组织体系建构与治理能力提升研究
- 石油产品环保认证行业跨境出海战略研究报告
- 课题申报书:教育数字化推进策略与实践研究
- 课题申报书:教育公平视角下城乡教育资源均衡配置研究
- 生活技巧分享行业深度调研及发展战略咨询报告
- 垃圾转运过程企业制定与实施新质生产力战略研究报告
- 机器学习入门企业制定与实施新质生产力战略研究报告
- 振动传感器网络部署企业制定与实施新质生产力战略研究报告
- 物业除甲醛工程合同范本
- 2023年06月上海市浦东新区临港新片区文员招考聘用笔试题库含答案解析
- 苏少版《书法练习指导》培训《多宝塔》技法、与《勤礼碑》比较课件
- 如坐针毡:我与通用电气的风雨16年
- 部编小学语文四年级下册第四单元教材分析解读课件
- 2022届“一本、二本临界生”动员大会(2023.5)
- XX人防工程维护管理岗位责任制度
- 塔机基础转换脚计算书
- YBT-4190-2018-工程用机编钢丝网及组合体
- 安全生产费用提取台帐
- 医院传染病登记簿
评论
0/150
提交评论