收藏 分享(赏)

基于Unity3D的TPS游戏的设计与开发.doc

上传人:精品资料 文档编号:7767603 上传时间:2019-05-25 格式:DOC 页数:38 大小:5.43MB
下载 相关 举报
基于Unity3D的TPS游戏的设计与开发.doc_第1页
第1页 / 共38页
基于Unity3D的TPS游戏的设计与开发.doc_第2页
第2页 / 共38页
基于Unity3D的TPS游戏的设计与开发.doc_第3页
第3页 / 共38页
基于Unity3D的TPS游戏的设计与开发.doc_第4页
第4页 / 共38页
基于Unity3D的TPS游戏的设计与开发.doc_第5页
第5页 / 共38页
点击查看更多>>
资源描述

1、滨江学院学年论文题目 基于 Unity3D 在 PC 端的 TPS 游戏的开发与设计院 系电子系专 业电子信息工程学生姓名杨鑫学号 20142305047指导教师王 新 蕾职称讲师二一七年十月二十五日基于 Unity3D 在 PC 端的 TPS 游戏的开发与设计杨鑫南京信息工程大学滨江学院 电子信息工程专业,南京 210044摘要:本文详细介绍了基于 Unity3D 游戏引擎(个人版)的 TPS(第三人称射击)游戏的开发与设计的过程,主要包括游戏开发前准备,场景的制作以及游戏角色控制,子弹发射效果,敌对角色生成的实现方法等。并简单介绍了 Unity3D 引擎及其特点和资源商店的利用。详细阐述了

2、游戏中的各种关键 C#脚本程序。实现以键盘控制位置鼠标控制视角的人机对抗游戏模式。游戏操作简单,人物动作细腻多变,场景氛围代入感强,给玩家良好的游戏体验。关键词: Unity3D;TPS ;C#第 1 章 绪论1.1 基于 Unity 游戏开发的国内外现状2016 年又被称为 VR 元年。虚拟现实(VR)是当今最前沿的科学技术之一,谷歌,微软,Facebook ,苹果,三星,索尼等知名高科技企业对其视为上宾。VR 通过计算机虚拟出现实世界,在 VR 技术影响下,仿佛置身于另一个世界。2016 年,是 VR 技术突破性发展的一年,VR 将与各行各业相互融合,产生庞大的岗位需求VR 开发工程师,而

3、 Unity 已经成为 VR 内容开发的首选平台。通过使用 Unity 引擎制作的游戏吸引了全球 6 亿游戏玩家。 ,Facebook 拥有 8.29 亿的日常用户。用Unity 制作的应用和游戏目前的累计体验量已达到了 87 亿次。根据 Unity 官方在 2017 年 8 月最新公布的数据 1,Unity 中国区的开发者数量、用户活跃度和终端安装量均已经成为全球第一。在世界范围内,Unity 占据全功能游戏引擎市场份额的 45%,居世界首位。最接近我们的美国,其市场份额只有我们的三分之一。Unity 的每月全球活跃用户超过 60 万。中国区每个月 Unity 引擎被使用的次数总和高达 18

4、0 万次,居世界首位。美国以 150 万次使用居世界第二。Unity 中国区在 3D 手机游戏市场的占有份额已经达到 75%,超越日本成为世界第一。也就是说在最火的前 100款 3D 手机游戏中,平均每 10 款就有 7.5 款是使用 Unity 引擎制作。很多使用 Unity 制作的游戏都是跨平台的,其中不乏优秀作品,比如神庙逃亡 2 , 地铁跑酷 ,使命召唤 , 纪念碑谷等。国内首款基于 Unity 3D 引擎研发的三国题材网游将魂 2(现已停运) ,自 2009 年初就进入了研发历程,其后则还有骏梦游戏研发的 Unity 3D 游戏新仙剑 OL 3。针对 Unity 3D 引擎的研发技术

5、,九众互动 CEO 朱传靖也曾提过,该引擎基于特定的技术架构,实现了实时生成查看的功能,易用性高,更简化了开发的流程。基于此,九众互动的首款 3D 网游将魂 ,在游戏品质和研发时间上并没有太多的冲突。在国外游戏厂商应用 Unity3D 引擎方面,美国 Playnet 公司目前已经推出了 3D 军事战争网游激战海陆空 。此外,俄国 Nival 公司研发的新型态 Dota 游戏Prine world在 Steam 上备受好评,欧美公司的 3D 魔幻 MMORPG 网游,都是非常受期待和关注的 Unity3D 网游。1.2 课题研究目的与意义游戏,对于很多人,占据了大学生活的大部分时光,许多大学生玩

6、了 4 年游戏而碌碌无为。本文以新的视角为广大的游戏爱好者展现良好的发展前景,让大家了解一个游戏的简单制作流程,体验其中的乐趣,致敬每一个愿意把人生奉献给游戏事业的人。Unity 的迅速发展让 Unity3d 从业人才需求不断攀升,并且从业人员的薪资十分可观。 以人才招聘来看,目前企业招聘人数呈现上升趋势,一般要求大专、本科学历,一年以上开发经验的人员一般待遇都会在 10K 左右,高级人才甚至达到 20K-25K。随着工作经验和技能的增加,从业人员薪资水平不断增长。目前 Unity 需求主要集中在一线大城市,北京、上海、深圳、广州等,这些一线城市的薪资水平是非常可观的。从薪资角度来说,Unit

7、y3d 工程师在棋牌游戏开发的工资能拿到 15000 元左右,当然还是要看具体的熟练水平的 4。所以说学习 Unity 并从事其相关工作,对于大学生来说是不错的出路。当然制作游戏不仅仅局限于此,还要懂美术,音乐,策划等多方面的知识。通过本次课题的研究,不仅是熟悉了 Unity 开发工具,也为今后参加大型团队游戏制作项目提供了帮助。1.3 课题研究内容本文主要介绍的是利用 Unity 5 制作一款 TPS 游戏的过程,具体内容有:第二章,游戏的相关知识和开发平台的阐述,简单介绍 Unity 的诞生和优势以及引擎的各种系统和碰撞函数。阐明了游戏设计的基本流程和开发流程。第三章,游戏的的总体设计,定

8、制游戏的主体内容,包括名称,剧情,基本玩法,介绍开发前的项目准备。第四章,游戏各个模块的具体实现,包括场景的制作,主人公的制作,子弹的制作以及敌对 AI 的制作等等。第五章,PC 端游戏打包与发布,简单介绍利用 Unity 在 PC 端打包发布的方法。第 2 章 系统平台的阐述和游戏的相关知识2.1Unity 5 的简介Unity3D 是由 Unity Technologies 开发的一个让玩家轻松创建例如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一款全面整合的专业游戏引擎。Unity 类似于 Director,Blender game engine,

9、 Virtools 或 Torque Game Builder 等利用交互的图型化开发环境为首要方式的软件。其编辑器运行在 Windows 和 Mac OS X 下,可发布游戏至Windows、Mac、Wii、iPhone 、WebGL(需要 HTML5)、Windows phone 8 和 Android 平台。也可以利用 Unity web player 插件发布网页游戏,支持 Mac 和 Windows 的网页浏览。它的网页播放器也被 Mac 所支持。2.1.1Unity 5 游戏引擎的诞生业界现有的游戏引擎数不胜数,其中最具代表性的商业游戏引擎有虚幻引擎 5,CryEngine 3,H

10、eroEngine,Rage Engine 等,但因为其价格以及对 PC 配置要求高让很多个人游戏开发者尤其是学生望而却步。在这样背景下,Unity 公司提出了 “大众游戏开发”的口号,让开发人员不在考虑价格,提供任何人都可以轻松开发的优秀游戏引擎。2015 年 3 月在旧金山举行的游戏开发者大会上 Unity 5 正式公诸于世。2.1.2Unity 5 的优势(1)支持多平台跨平台运行,只需开发一次,稍加修改,就可以发布到 23 多个平台运行。现在,Unity 已经可以支持以下平台 6: 移动平台(iOS、Android、Windows Phone、BlackBerry、Tizen) 桌面平

11、台(Windows、Windows Store、Mac、Linux) 游戏主机(PS3、XBOX、Wii) 网页游戏(Internet Explorer、WebGL) 虚拟现实与增强现实(Oculus Rift、Gear VR)(2)集成开发环境从场景设计、编程、调试到构建、开发游戏的整个生命周期都可以在 Unity IDE 中完成,效率非常之高。另外,直观而合理的集成开发环境也为开发人员提供了便利。(3)所有功能免费只要你是独立开发者或是没有营收的小公司就符合使用 Unity Personal Edition(个人版)的条件。但上一年营收或资本额超过了 10 万美金,就失去了使用个人版的资格

12、,就必须购买 Unity Professional Edition(专业版) 。(4)开放社区社区提供了大量的帮助手册和体系化的示例文件,同时,Unity 拥有一个资源分享和知识问答的交流平台,包括论坛、博客、在线视频等,以此帮助开发者更为便捷的了解 Unity 引擎。(5)资源商店Unity3D 不仅拥有很强大的功能,丰富的模块,还有 Asset Store 提供开发过程中所需要的所有资源,具有超强的效能和超高的性价比,使编程周期大大缩短,即使是小型开发团队也可以轻松运作。也可以通过 Asset Store 销售自己制作的产品,获得利润。2.2 相关 Unity 技术知识2.2.1 物理系统

13、Unity 内置了 NVIDIA 的 Physx 物理引擎,Physx 是目前使用最为广泛的物理引擎,被很多游戏大作所采用,开发者可以通过物理引擎高效、逼真地模拟刚体碰撞、车辆驾驶、布料、重力等物理效果使游戏画面更加真实,更加生动 7。Rigidbody 刚体组件,可使游戏对象在物理系统的控制下来运动刚体可接受外力与扭矩力用来保证游戏对象像在真实世界中那样进行运动。任何游戏对象只有添加了刚体组件才能受到重力的影响,通过脚本为游戏对象添加的作用力以及通过 NVIDIA 物理引擎与其他的游戏对象发生互动的运算都需要游戏对象添加了刚体组件。Collides 碰撞体,碰撞体是物理组件的一类它要与刚体一

14、起添加到游戏对象上才能触发碰撞。如果两个刚体相互撞在一起,除非两个对象有碰撞体时物理引擎才会计算碰撞,在物理模拟中,没有碰撞体的刚体会彼此相互穿过。Character Controller 角色控制器,角色控制器主要用于对第三人称或第一人称游戏主角的控制,并不使用刚体物理效果。2.2.2 动画系统Mecanim 动画系统随着 Unity 4.0 的升级而出现,这是一种动画中间引擎,使用其可以轻松制作柔和、平滑的动画效果,它提供了 为人形角色提供的简易的工作流和动画创建能力;。 Retargeting(运动重定向)功能,即把动画从一个角色模型应用到另一个角色模型上。 针对 Animation C

15、lips(动画片段)的简易工作流,即针对动画片段以及它们之间的过渡和交互过程的预览能力。这样可以使动画师更加独立地进行工作,而不用过分地依赖于程序员,从而在编写逻辑代码之前就可以预览动画效果。 一个用于管理动画间复杂交互作用的可视化编程工具。 通过不同逻辑来控制不同身体部位运动的能力 8。2.2.3 渲染系统在 Unity 里,渲染路径(Rendering Path)决定了光照是如何应用到 Unity Shader 中的。因此,如果要和光源打交道,我们需要为每个 Pass 指定它使用的渲染路径,只有这样我们才能在 Unity Shader 中访问到Unity 为我们准备好的光照信息。Unity

16、 的渲染框架支持正向渲染与延迟光照渲染两种渲染模式、任意多光源、主直线光源的多层级阴影渲染以及各种自定义的材质和后置渲染特效。在 Unity5.0 版本之前,主要有 3 种:前向渲染路径(Forward RenderingPath)、延迟渲染路径 (Deferred Rendering Path)和顶点照明渲染路径(Vertex Lit Rendering Path)。但在 Unity5.0 版本以后,Unity 做了很多更改,主要有两个变化:首先,顶点照明渲染路径已经被Unity 抛弃(但目前仍然可以对之前使用了顶点照明渲染路径的 Unity Shader 兼容) ;其次,新的延迟渲染路径代

17、替了原来的延迟渲染路径(同样,目前也提供了对较旧版本的兼容) 。2.2.4 脚本系统Unity 脚本开发是整个游戏开发过程中的重要环节,即便最简单的游戏也需要脚本来响应用户的操作,此外游戏常见的事件触发、游戏对象的创建与销毁等都需要通过脚本来控制 9。Unity 中可以选择两种脚本进行开发,分别为 JavaScript 和 C#。Unity 使用的 JavaSript 语法与网页开发中基本相同,也可以称其为 Unity 脚本。而 C#是一种分别借鉴了 C+和 Java 优点的语言,国内开发主流的还是使用 C#语言。Unity 5 不再支持 Boo 脚本。本游戏是运用 C#进行开发的。2.2.5

18、 键盘交互技术键盘交互主要是指能够控制游戏者在游戏场景中进行移动,键盘交互以设置方向键“” “” “”“”或者“W ”“S”“A”“D”为控制键,分别用来控制游戏者的 “前”、 “后”、 “左”、 “右”的走动。在Unity 中,可以通过函数实现这些功能,以用 “W”“S”“A”“D”为控制键为例,脚本命名为 js,其代码如下:if(Input.GetKey(KeyCode.W)transform.Translate(0 , 0 , 2*Time.deltaTime);if(Input.GetKey(KeyCode.S)transform.Translate(0 , 0 , -2*Time.d

19、eltaTime); if(Input.GetKey(KeyCode.A)transform.Translate( -2*Time.deltaTime , 0 , 0 );if(Input.GetKey(KeyCode.D) transform.Translate( 2*Time.deltaTime , 0 , 0); 2.2.6 碰撞检测技术碰撞检测在 3D 游戏中是非常重要且常见的一件事情,好的碰撞检测要求人物在场景中可以平滑移动,当人物在在场景中漫游的时候,在各种前进方向上如果有被其他物体挡住的情况下,不但不能再继续往前走,而且要尽可能地沿合理的路线滑动。在 Unity3d 中,碰撞检测

20、的功能是由函数封装好的,我们只需要调用函数就可以实现了。OnControllerColliderHit()函数是用于角色碰撞的,角色如果添加了Charactor Controller (Unity 自带的用于角色控制的脚本)则使用这个函数检测碰撞,且不需要加刚体的。一般的刚体之间碰撞使用 OnCollisionEnter()函数,范围触发用 OnTriggerEnter()函数。2.4 游戏项目流程(1)原型阶段实现游戏的必要技术验证。产出:一个最简单的只有 1 关或者 1 个场景的的游戏原型。美术效果图。(2)Alpha 版阶段完善游戏角色的逻辑,定义完善的数据结构和关卡配置,制作游戏 UI

21、,菜单 UI 等。产出:一个能玩若干关卡的版本。(3)Beta 版阶段完善逻辑,批量制作美术,关卡或者其他游戏内容,细化 UI 等各方面。加 IAP,GameCenter 等。产出:完整的可玩版本,具备所有的游戏内容、关卡等。(4)产品阶段测试,修 Bug,图标,截图,多语言说明,视频录制等等准备上线需要做的一切事情。提交上线。产出:可以提交上线的 app 包。本作由于个人能力有限,只制作了出游戏的原型和 Alpha 测试版。2.5Unity 制作游戏流程(1)游戏策划一个游戏的诞生,往往是策划们脑海中的灵感一现,这是游戏诞生的第一步。主要工作是编写游戏背景故事,制定游戏规则,设计游戏交互环节

22、,计算游戏公式,以及整个游戏世界的一切细节等。(2)游戏原画设定根据策划的文案,设计出整部游戏的美术方案,包括概念类原画设计和制作类原画设计两种,为后期的游戏美术(模型、特效等)制作提供标准和依据。(3)游戏的模型及贴图制作原画通过后指,游戏建模师就要按着原画中的场景、角色和道具按照比例制作设计成的物体,建模的过程很复杂,很多时候要靠建模师的发挥,好的模型和贴图会让游戏增色不少。(4)游戏的程序编写当模型完成后,程序员就要编写程序了,游戏角色的动作,人机交互系统,伤害的计算,血量的计算,AI 的行为方式,巡逻路径等都是程序员的工作。(5)游戏的测试测试就是发现问题并进行改进,从而提升软件产品的

23、质量。游戏测试也具备了以上的所有特性,不过由于游戏的特殊性,所以游戏测试则主要分为两部分组成,一是传统的软件测试,二游戏本身的测试,由于游戏特别是网络游戏,它相当于网上的虚拟世界,是人类社会的另一种方式的体现,所以也包含了人类社会的一部分特性,同时它又是游戏所以还涉及到娱乐性,可玩性等独有特性,所以测试的面相当的广。 我们称之为游戏世界测试,常由真实用户参与完成,多以封测内测等形式出现。第 3 章 游戏的总体设计3.1 游戏类型第三人称射击游戏 10简称:TPS,是射击游戏的一种。与第一人称射击游戏的区别在于第一人称射击游戏里屏幕上显示的只有主角的视野,而第三人称射击游戏更加强调动作感,主角在

24、游戏屏幕上是可见的。在游戏中,你可以看到游戏者,你好像一个旁观者或者操控者,而不是本人。这样更有利于观察角色的受伤情况和周围事物,以及弹道。虽说没有第一人称射击的爽快感,但第三人称也有很多优势可以实现动作和枪战的完美结合,可以观察到一些第一人称看不见的地方,增强代入感。在一些第一人称射击游戏中,可以进行对第一人称至第三人称的转换。3.2 游戏背景本作游戏名称暂定为SpaceShooter ,故事发生在未来,UNSC(联合国太空指挥部)收到一条来自远地殖民地的求救信息,主人公为 UNSC 的超级战士,收到指挥部的指令,率先前往远地殖民的军事堡垒进行调查,并发现可怕的外星人,与之发生了一番恶斗。3

25、.3 游戏开发步骤 设置游戏开发环境 下载并导入游戏资源 设计游戏场景 构建主人公移动和开火机制 构建敌对角色的行为机制 构建主人公和敌对角色之间的关系机制 构建游戏 UI3.4 游戏总体规划W、S、A、D 键控制玩家行走,鼠标控制视角,鼠标左键按下开火。敌对角色在军事基地中固定点生成,玩家需消灭所有敌对角色完成通关。玩家有 100 点 HP,敌对角色会近身攻击玩家,每攻击一次,玩家收到 10 点伤害,被攻击 10 次后玩家死亡,击中敌对角色三次后,敌对角色死亡,玩家每击杀一个敌对角色获得 50 点分数。3.5 开发前准备3.5.1 创建资源商店账号Unity 运营商可以交易高品质资源的开放市

26、场。资源商店中,可以购买所需的 3D 模型、贴图、动画、插件、脚本、音乐甚至是完整的游戏项目,其中有不少的优秀的免费资源。要想使用资源商店,需要拥有账号,可以直接使用安装 Unity 时注册的账号登录。如果没有账号,则需现在资源商店中注册。3.5.2 下载项目所需的游戏资源打开 Unity 资源商店官网,在右上角搜索以下关键字进行搜索并下载资源导入到项目中来: Skybox Volume2(搜索 Skybox Vol2) Sci-Fi Level (搜索 Sci-Fi) Extreme Sci-Fi LITE(搜索 Sci-Fi) Monster(搜索 Monster) Barrel 3D 模

27、型(搜索 Barrel)至于主人公角色可以登录Unity 5 权威讲解的作者李在贤的个人空间(http:/www.Unity3dS 5 ,但本作内容与其有很大出入,本人能力有限,离不开商店资源和书本指导,所以本作是站在巨人肩上的拙劣之作。3.5.3 导入游戏资源启动 Unity,新建项目,在项目视图中创建 Scenes(存放场景) 、Scripts(存放脚本) 、Prefabs(存放预制体) 、Images(存放贴图和材质球) 、Models(存放模型) 、Sounds(存放音频) 。导入游戏资源,至于是把游戏资源分类分别存入对应文件夹中这里不做介绍也不做要求(重命名资源文件名称或者移动位置可

28、能会导致资源发生错误) 。第 4 章 游戏各个模块的具体实现4.1 游戏场景制作4.1.1 导入地图模型点开 SciFi Level 文件夹中的 SciFi Level.unity 场景文件。将会看到图 1(本文中给出的所有图片均是实机开发中画面)的地图资源载入到 Senes 面板。图 1 地图资源导入4.1.2 3D 模型创建地形,材质包,并将材质包赋予创建好的 Plane 模型。右击 Hierarchy 面板,3D ObjectPlane,重命名为 Ground,在 Hierarchy 面板中选中 Ground,调整Inspector 面板中的 Transform 组件中的属性,使其紧贴地

29、图的正下方,如图 2。图 2 地板的创建4.1.3 材质渲染选中 Project 面板中的 Image 文件夹,右击创建 Materials 文件夹,选中右击创建 Material 材质球,重命名为 Ground 1,将适合的贴图(如 06)拖入到材质球的 Inspector 面板中,最后在选中 Project 面板中将Ground 1 材质包拖拽到 Scenes 面板中的 Ground 模型,就会有图 3 的效果。图 3 地板材质4.1.4 天空盒的创建在 Project 面板中的 ImagesMaterials 文件夹中创建新的材质球,重命名为 Skybox,选择其 Shader,设置为

30、Skybox/6 Side。在原先下载好的 Skybox Volume2 中找到天空盒的 6 面图像文件将其拖动到材质球Skybox 的对应版面。最后选择菜单栏 WindowLighting Scene,将材质球 Skybox 拖入到 Environment组件中。最后得到如图 3 的场景。图 4 六面天空盒4.1.5 场景的美化利用下载好的 SciFi_Battery_Pack_free 文件中的模型,将其适当的添加到 Scene 面板中,为场景添彩。如图 5 和图 6。图 5 添加电池模型图 6 添加铁箱模型4.2 主人公的制作导入的主人公角色模型的动画已经包含在内,这里主要处理三个问题,

31、一是如何利用键盘的W、S、A、D 键控制角色的上下左右走向,如何利用鼠标来控制控制角色视角转向,二是在角色移动的同时实现对应动画的播放,三是如何实现第三人称摄像机视角对角色位置的跟随。4.2.1 导入主人公模型将下载好的 AngryBotPlayer 拖拽到 Scene 面板中的地图中的合适位置,如图 7。图 7 主人公模型4.2.2 角色移动实现Unity 中定义了游戏中许多必备的组合件,其中就包括控制角色移动的 Input.GetAxis(“Horizontal”/“Vertical”)组合键,它们分别控制方向左右和上下,当按下 W、S 键或者 UP、DOWN 键时,Input.GetAx

32、is(“Horizontal”)函数即会返回-11 之间的一个值。在 Scprits 中创建 C#脚本 PlayerCtrl.cs,并将其拖拽到 Scene 面板中的 Player。脚本代码如下:using System.Collections;using System.Collections.Generic;using UnityEngine;public class PlayerCtrl : MonoBehaviourprivate float h = 0.0f;private float v = 0.0f;/必须先分配变量,之后才能使用需要访问的组件,private Transform

33、tr;/移动速度变量(声明为 public 并显示到检视视图)public float moveSpeed = 10.0f;/旋转速度变量public float rotSpeed = 100.0f;void Start () /向脚本初始部分分配 Transform 组件tr = GetComponent();void Update () h = Input.GetAxis(“Horizontal“);v = Input.GetAxis(“Vertical“);Debug.Log(“H=“ + h.ToString();Debug.Log(“V=“ + v.ToString();/计算前后左

34、右移动方向向量Vector3 moveDir = (Vector3.forward * v) + (Vector3.right * h);/Translate(移动方向*速度*位移值*Time.deltaTime,基础坐标)tr.Translate(moveDir.normalized * Time.deltaTime, Space.Self);/以 Vector3.up 轴为基准,以 rotSpeed 速度旋转tr.Rotate(Vector3.up * Time.deltaTime * rotSpeed * Input.GetAxis(“Mouse X“);4.2.3 摄像机追踪实现为了实

35、现摄像机平滑移动和震动效果,采用方法如下:将摄像机向主人公身后移动距离 dist,再向上提高高度 height,然后将摄像机方向调整为指向主人公方向 11,具体如图 8 所示。图 8 摄像头跟随示意图在 Scprits 中创建脚本 FollowCam.cs,将其拖拽到 Hierarchy 面板中的 Main Camera。脚本代码如下:using System.Collections;using System.Collections.Generic;using UnityEngine;public class FollowCam : MonoBehaviour public Transform

36、 targetTr; /要追踪的游戏对象的 Transform 变量public float dist = 10.0f; /与摄像机之间的距离heighttdist trcammmpublic float height = 3.0f; /设置摄像机的高度public float dampTrace = 20.0f; /实现平滑追踪的变量/摄像机本身的 Transform 变量private Transform tr;/ Use this for initializationvoid Start()/将摄像机本身的 Transform 组件分配至 trtr = GetComponent();/使

37、用 LateUpdate 函数,调用所有 Update 函数后才会调用该函数/要追踪的目标游戏对象停止移动后,调用 LateUpdate 函数void LateUpdate()/将摄像机防置在被追踪目标后方的 dist 距离的位置/将摄像机向上抬高 heighttr.position = Vector3.Lerp(tr.position /起始位置 , targetTr.position /结束位置 - (targetTr.forward * dist)+ (Vector3.up * height), Time.deltaTime * dampTrace); /内插时间/使摄像机朝向游戏对象t

38、r.LookAt(targetTr.position);4.2.4 角色动画的实现Unity 支持两种动画系统:Legacy 动画系统(旧版动画系统)和 Mecanim 动画系统(新版动画系统) 。Legacy 动画系统:在 3D Animation Tool 中制作动画。Mecanim 动画系统:新的动画系统,可以利用动作复制功能重复利用现有的动画。旧版动画系统是 Unity 引擎在 4.0 版本之前使用的。尽管 Mecanim 是在多数情况下(特别是针对人形动画)应该是优先选用的动画系统,但是旧版动画系统仍然在一些特殊场合被使用:一种情况是处理Unity 4.0 之前版本生成的动画和相关代

39、码;另一种情况是使用参数而不是时间来控制动画片段(例如控制瞄准角度) 12。而 AngryBotPlayer 模型不适合 Mecanim 动画所需的骨骼系统,同时 PlayerCtrl 中引用的Input.GetAxis(“Horizontal”/“Vertical”)函数是使用参数控制动画片段的方式前提,所以这里使用 Legacy动画系统制作主人公的动画。点开 Player 模型会看到 Animations 组件,将任务的休眠、前进、后退、左移、右移动画片段放入动画文件中,为各个动画片段添加开始帧和结束帧,如图 9。图 9 Animations 组件示意图对 PlayerCtrl.cs 脚本

40、进行添加和修改(加粗字体为修改部分) 。using System.Collections;using System.Collections.Generic;using UnityEngine;/此类需要声明属性 System.Serializable,表示可视化/显示到检视视图System.Serializablepublic class Animpublic AnimationClip idle;public AnimationClip runForward;public AnimationClip runBackward;public AnimationClip runRight;publ

41、ic AnimationClip runLeft;public class PlayerCtrl : MonoBehaviourprivate float h = 0.0f;private float v = 0.0f;/必须先分配变量,之后才能使用需要访问的组件,private Transform tr;/移动速度变量(声明为 public 并显示到检视视图)public float moveSpeed = 10.0f;/旋转速度变量public float rotSpeed = 100.0f;/要显示到检视视图的动画类变量public Anim anim;/要访问下列 3D 模型 Anim

42、ation 组件对象的变量public Animation _animation;void Start () /向脚本初始部分分配 Transform 组件tr = GetComponent();/查找位于自身下级的 Animation 组件并分配到变量_animation = GetComponentInChildren();/保存并运行 Animation 组件的动画片段_animation.clip = anim.idle;_animation.Play();void Update () h = Input.GetAxis(“Horizontal“);v = Input.GetAxis(

43、“Vertical“);Debug.Log(“H=“ + h.ToString();Debug.Log(“V=“ + v.ToString();/计算前后左右移动方向向量Vector3 moveDir = (Vector3.forward * v) + (Vector3.right * h);/Translate(移动方向*速度*位移值*Time.deltaTime,基础坐标)tr.Translate(moveDir.normalized * Time.deltaTime, Space.Self);/以 Vector3.up 轴为基准,以 rotSpeed 速度旋转tr.Rotate(Vect

44、or3.up * Time.deltaTime * rotSpeed * Input.GetAxis(“Mouse X“);/以键盘输入值为基准,执行要操作的动画if (v = 0.1f)/前进动画_animation.CrossFade(anim.runForward.name, 0.3f);else if (v = 0.1f)/向右移动动画_animation.CrossFade(anim.runRight.name, 0.3f);else if (h ().AddForce(transform.forward * speed);运行游戏后我们会发现子弹击中墙体后会被反弹,不符合现实,所以

45、还需要让子弹碰撞到墙壁物体后可以立即消失,所以就要检测到碰撞。在 Unity 中碰撞感知要满足两个条件,一是两个物体都有 Collider 组件,二是移动的一方必须有Rigidbody 组件。所以需要将场景中所有类似于墙体的物体添加 Collider 组件。检测碰撞时,主要运用两个事件,OnCollision 和 OnTigger 事件。每一种 Collider 组件中都会有一个 Is Tigger 选项,勾选 Is Tigger 选项就需要运用 OnCollision 事件,取消勾选 Is Tigger 选项就需要运用 OnTigger 事件,OnTigger 事件和 OnCollision

46、 事件主要的不同之处就是 OnTigger 事件处理碰撞,移动物体会穿过被碰撞物体,如图 11。图 11 OnColision 事件和 OnTrigger 事件的区别本文利用 OnCollision 事件处理碰撞,主要函数有 OnCollisionEnter 和 OnCollisionExit 函数。子弹碰撞墙壁,墙壁就需检测到子弹,分辨出是子弹还是其他物体,在 Unity 中,可以个物体添加一个 Tag 标签,然后在脚本中调用该标签就可以识别所有具有该标签的物体,选中 Bullet 的预制体在 Tag属性中添加新的 Tag 标签 BULLET,如图 12。图 12 Tag 标签的设定为墙体之

47、类的被碰撞物体添加脚本 WallCtrl.cs 脚本,脚本代码如下:using System.Collections;using System.Collections.Generic;using UnityEngine;public class WallCtrl : MonoBehaviour /表示火花粒子对象的变量public GameObject sparkEffect;/碰撞开始时触发事件void OnCollisionEnter(Collision coll)! 不勾选 Is Trigger 碰撞墙壁触发 OnCollision 事件!触发 OnTrigger 事件 勾选 Is Tr

48、igger 穿过墙壁/比较发生碰撞的游戏对象的 Tag 值if (coll.collider.tag = “BULLET“)/删除发生碰撞的对象Destroy(coll.gameObject);实例化子弹,当玩家按下鼠标左键发射一颗子弹,在 Scene 面板中新建一个空物体,调整位置,将其设置在枪口,重命名为 FirePos,为枪口的空物体添加新脚本 FireCtrl,代码如下。using System.Collections;using System.Collections.Generic;using UnityEngine;public class FireCtrl : MonoBehaviour /子弹预设public GameObject bullet;/子弹发射坐标public Transform firePos;void Update () /鼠标左击时调用 Fire 函数if (Input.GetMouseButtonDown(0)Fire();void Fire()/动态生成子弹的函数CreateBullet();void CreateBullet()/动态生成 Bullet 预设Instantiate(bullet, firePos.position, firePos.rotation);4.3.3 子弹拖尾效果实现创建新的材质球,赋予 Trai

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报