如何零基础学做饭app用Unity做一个自己的FPS僵尸游戏

扫码下载官方App
Unity 3D实训项目-FPS 行尸走肉
所属微专业:
Unity3D游戏开发实训课程,通过学习制作FPS行尸走肉游戏,教会大家U3D游戏的实用开发技巧。通过对该部分课程的学习,掌握如下知识与技能:1、掌握Unity游戏引擎高级使用技巧;2、掌握光照系统的使用;3、掌握3D环绕立体音效制作;4、掌握粒子特效系统的使用;
1.游戏简介与学习要点1.13D僵尸跑酷游戏介绍1.2学习要点与注意事项1.3游戏策划设计文档的书写2游戏逻辑开发(Unity 3D高级开发技巧与粒子系统)2.1创建地形2.2第一人称角色控制器2.3场景道具布局与实现细节2.4添加模拟水面粒子系统2.5IFY光照系统2.6设置 Navmesh2.7字体的缩放2.8定位玩家批量克隆器2.9使用输入映射2.10添加 3D 环绕立体音效2.11操纵&Mechanim&动画2.12深度了解拟人动画2.13简单的日夜循环系统2.14探索不明确区域系统2.15使用 SendMessageUpwards2.16语言旁边引导2.17使用 BroadcastMessage()&2.18重构邮件系统&2.19音频文件总控制器制作2.20装载区域Prefab&2.21压缩Unity资源文件
所属微专业
所属系列课程
网易公司(163.com)旗下实用技能学习平台。与优秀讲师、专业机构、院校合作,为您提供海量优质课程,以及创新的在线学习体验,帮助您获得全新的个人发展和能力提升。
关注我们:
& 网易公司 版权所有如何正确的使用UNITY3D制作FPS游戏_百度知道
如何正确的使用UNITY3D制作FPS游戏
我有更好的答案
放置我们所有的武器脚本,例如:火箭,零件就是游戏物体的属性。工程面板中创建一个“WeaponScripts”文件夹。点击“Play”键;Creat&。技巧:游戏运行中产生的任何游戏物体都应该是预制物体(Prefab);;Preferences点击External Script Editor,可以自定义外部脚本编辑器。游戏物体是3D世界中的任一物体(角色、关卡。如果不做这一步,白色面代表物体当前视角,三个大箭头代表物体在3D空间中的位置(如果没有看见箭头;Create Object&Sphere)层级面板中,下面我们给角色添加武器。你将发现发射器并没有随着角色一起运动(现在再次点击播放键停止运行游戏)下面来解决这个问题,层级面板中,把发射器拖放到FPS控制器下面的主摄像机上。弹出的对话框点击“是”。再次运行游戏。游戏角色游戏中是第一人称的视角,选择物体,按“W”键)、爆炸、音频等。设置游戏环境导入资源后,你会注意到在工程面板中有许多文件夹。工程面板中,从文件夹“Object/mainLevelMesh”中选择“mainLevelMesh”。整个场景对所有灯光进行了灯光贴图渲染,使用了“预烘焙阴影”。找到Prefabs文件夹,点击小三角形。在参数面板,四处移动角色,同时观察场景窗口,把它更名为“MissileLauncher”技巧:通过Unity&gt:简介这个教程中,并在层级面板中(Hierarchy)命名为“Launcher”。我们先用一个简单物体-球体-代替飞弹。Unity主菜单栏点击Assets&gt。现在在场景中把视野推近到FPS控制器,便于我们放置武器发射器。层级面板中选择FPS控制器,确保鼠标处于场景视图中,按“F”键。使窗口以当前选择的物体为中心。创建飞弹下面我们来创建在玩家点击开火键时能够发射出来的飞弹,在工程面板Standard Assets-&,勾选此选项。那么我们具体要实现什么呢?我们要使游戏角色能在摄像机的任意位置开火,弹出资源列表。把“First person controller”拖到场景里。这时场景中会出现一个代表玩家的圆柱体。编写飞弹发射器脚本FPS控制器是一个包含了几个游戏物体和部件的预制物体、声音),拖放球体到飞弹预制物体上(Missile),把发射器移动到大概角色手部的位置。注意。从Unity安装目录导入Standard Assets资源包。导入工程后,你会在Unity工程面板中的“Standard Assets”文件夹下看见这些资源内容。当我们导入新资源时,最好安装按照资源功能对其分组,这关全部场景已经全部应用了灯光贴图,可以在游戏中发射。要实现这个功能,需要创建一些脚本语言来在Unity中告知这个武器如何动作。灯光贴图对显示效果有很大帮助,特别是复杂灯光环境。下面可以在场景中添加一个角色了。添加主要角色下面在场景中增加一个可以操控的角色物体。Unity针对第一人称射击游戏预置了许多内置的控制器,创建一个空的JavaScript文档。一个名为“NewBehaviourScript”资源将会出现在工程面板中。层级面板中选择发射器,主菜单栏选择Game Object&gt。下面我们来编写第一个描述发射器行为的JavaScript代码。点击Assets&Greate&JavaScript。增加武器下面我们将给游戏角色一个类似榴弹的物体:可以通过设置这个物体的位置来设定游戏角色是左撇子还是右撇子,观察场景窗口,发射器已经和角色运动一致了。这样我们就把发射器与摄像机关联起来了,如果我们直接把发射器脚本赋予FPS控制器的话,是实现不了上下开火的;Prefabs下。添加第一人称控制器,点击工程面板Standard Assets旁边的小三角,弹出资源列表。注意,空物体在场景中是看不见的,所以摄像机的位置与眼睛平行,我们详细了解下如何制作一个简单的第一人称射击游戏(FPS),只是用它来作放置飞弹发射器;Great Empty,可以删掉了;Move to view。注意发射器如何移动到FPS控制器附近的。然后使用手柄。所以我们把脚本赋予控制器中的能够四周转动的主摄像机,FBXImporter选项中,你会发现“Generate Colliders”选项。但是,我们还是首先来思考一下游戏角色和武器。如果玩家使用武器射击,武器应该是在角色的手部位置开火而不是眼睛的位置。这样我们就要增加一个“game object”(游戏物体)来代表榴弹发射器,同时把它放置在游戏角色手持武器时武器所处的位置。这样就保证了开火的位置没有问题。创建武器发射器首先,创建一个“game object”代表榴弹发射器。其中将介绍一些基本的3D游戏编程的概念和一些关于怎样如游戏程序员般思考的技巧。前提这个教程假定你已经熟悉软件Unity基本操作;Prefab创建一个预制(Prefab)物体,命名为“Missile”创建一个球体(GameObject&gt,不需要写代码。使Unity窗口模式是“2by3”模式(window&Layouts&2by3)。FPS控制器本身是一个只能沿Y轴旋转的圆柱体,因此第一部分,这时预制物体图标会变化。现在FPS控制器处于默认视角位置,通过移动它可以改变游戏视野。把角色移动到游戏环境关卡地面上面的位置。Main Camera现在已经没有用处了,游戏中玩家会穿越地面直接掉下深渊(实际是开启“碰撞”,产生交互)把“mainLevelMesh”拖放到场景中。场景中不需要添加灯光。确保层级面板中点选了发射器,掌握了基本的脚本概念。创建新工程下载FPS_Tutorial.zip压缩文件,解压,点击播放键(play),现在应该可以通过使用鼠标和键盘在本关卡地形中四处移动了(光标或者“W,A,S,D”)现在我们创建了一个非常简单的FSP,然后产生一枚飞弹,然后把它沿着玩家朝向的方向按照一定的速度发射出去。我们仔细的解剖一下脚本:var projectile: Rvar speed=20;function Update( ){这是脚本的开头部分,定义了一些属性,开启了“Update”的功能if(Input.GetButtonDown(“Fire1”))首先我们要检测玩家是否按了开火键,“开火1”映射的是鼠标左键和当前配置的键盘上的按键(可以通过主菜单栏的Editor&;Project Settings&Input设定){var instantiatedProjectile: Rigidbody=Instantiate(projectile, transform.position,transform.rotation);我们用变量来定义产生的物体。变量的类型是Rigibody(刚体),因为飞弹是具有物理属性的。Unity中产生新物体使用的函数是Instantiate,它有三个参数,分别是:产生的物体、产生物体的3D空间位置、物体的旋转。它还有另一个语法结构,参照API手册,这里我们只使用这种结构。第一个参数,projectile,代表我们想创建的物体。那么到底发射什么物体?具体产生的物体是可以手动设定的。实现方法:把Projectile定义为函数的外部变量,这样就可以在参数面板中显示出来。发射的物体也可以通过代码来创建,但如果你想使一个变量可调的话,还是用上面的方法。第二个参数,transform.position,使产生的物体与发射器的空间位置一致。为什么就是发射器呢?因为如果要使飞弹产生的位置没有问题,脚本就要关联给发射器。(transform读取的transform数据就是被赋予脚本的游戏物体transform数据)第三个参数transform.rotation,与第二个类似,只是它的值与发射器的旋转值是一样的。代码的下一部分使飞弹产生运动。为了实现运动,我们要赋予飞弹一个速度,但是在哪个方向上(X,Y,Z)产生速度呢?在场景中,点击FPS控制器,出现运动箭头(如果没有出现,按“W”键),其中一个箭头是红色、一个是绿色、一个是蓝色。红色代表X轴,绿色代表Y轴,蓝色代表Z轴。因为蓝色指向的方向,与玩家面朝的方向一致,所以我们要在Z轴上给飞弹一个速度。(Velocity)速度是instantiatedProjectile的一个属性。我们怎么知道的呢?因为instantiatedProjectile是刚体的一种,如果我们看看API手册,我们就会知道速度是刚体的属性中的一种。同时也看看刚体的其它属性。要设置速度,我们就必须在各个轴向上设定数值。但还有个小问题。3D空间中的物体一般使用两种坐标模型:本地坐标系和世界坐标系。在本地坐标系中,物体的轴向只与物体本身有关。在世界坐标系中,轴向是绝对的,例如:向上,对所有物体来讲向上的方向都是一样的。Rigidbody.Vellocity刚体物体速度必须使用世界坐标系。因此,定义速度时,需要把本地坐标系中的Z轴(朝前的方向)向转换成世界坐标系中的相应方向。可以用函数transform.TransformDirection,它有三个向量作为自变量。变量speed也应该定义成外部变量,便于后面在编辑器中直接调节数值。最后,我们要关闭飞弹与游戏角色之间的碰撞。如果不这样做的话,飞弹产生的时候就可能与角色发生碰撞。可以在API手册IgnoreCollision下查询详细信息。MissileLauncher.js全部完整代码如下:把脚本MissileLauncher赋予FPS控制器中的发射器。在层级面板中点击发射器,检查一下参数面板下面是否显示了MissileLauncher script。先前创建的飞弹的预制物体还没有与脚本中的变量projectile创建关联,我们需要在编辑器中创建一下。变量projectile只能与刚体关联,因此,首先我们要赋予飞弹一个Rigidbody。工程面板中点击飞弹,然后从主菜单栏选择Components&;Physics&Rigidbody。这样将会给我们想开火发射的飞弹一个刚体属性。我们必须确保想在游戏中发射的物体类型与脚本中外部变量要求的物体类型是同一类型的物体。创建飞弹与脚本中变量projectile的链接。首先在层级面板中点击发射器,然后把飞弹的预制物体从工程面板中拖拽放置在发射器参数面板中MissileLauncher script部分上。运行游戏的话,你会发现点击开火键可以发出一个受重力影响的小球了。飞弹爆炸下面,当飞弹与其他物体发生碰撞时,增加一个爆炸效果。要实现这个效果,我们要编写一段新脚本赋予飞弹。创建一个新脚本,命名为Projectile。拖放到工程面板的WeaponScripts文件夹下。那么我们想要脚本Projectile实现什么样的效果呢?我们要检测飞弹是否发生碰撞,然后在碰撞点产生一个爆炸效果。代码如下:函数OnCollisionEnter内的程序代码的作用是计算被赋予脚本的物体是否与其他物体发生碰撞。在函数OnCollisionEnter中我们主要是要实现在3D空间中飞弹发生碰撞的点产生一个新爆炸。那么在何处了碰撞的呢?函数OnCollisionEnter就有个记录这个信息的功能。碰撞发生的点的信息储存在变量ContactPoint中。这里我们使用函数Instantiate来创建一个爆炸。我们已经知道函数instatiate有三个参数:(1)产生的物体(2)物体的3D空间位置(3)物体的旋转。第一个参数,后面我们将会赋给一个带粒子系统的游戏物体。同时我们还想通过编辑器来实现这个功能,所以我们把变量设置为外部变量。第二个参数,爆炸产生的点的位置,就是碰撞发生的位置。第三个参数,爆炸旋转的设置,需要解释一下。我们需要爆炸体的Y轴方向与飞弹和其他物体发生碰撞的那个表面的法线方向一致。这就是说如果是墙面那么爆炸就面向外,如果是地板就朝上。那么实际上我们就是要使爆炸体在本地坐标系的Y轴与飞弹与之碰撞的物体的表面法线方向(世界坐标系)一致。最后,我们要让飞弹碰撞后就从游戏中消失,通过函数Destroy()实现,它的参数是gameObject(gameObject代表被赋予这个脚本的物体)。Projectile.js全部代码如下:把脚本赋予飞弹预制物体(Missile prefab)。下面我们要创建飞弹发生碰撞时所产生爆炸的爆炸效果物体。首先,创建一个新的预制物体(命名为Explosion)用来存放爆炸效果资源。标准资源包中(standard asset)有个不错的爆炸预制物体,粒子系统和灯光都设置好了。把这个爆炸预制物体(在Standard Assets/Particles/explosion中)拖放到层级面板。调节这个爆炸效果的各个参数直到你觉得满意,然后把它从层级面板中拖放到工程面板中的爆炸预制物体(Explosion Prefab)中。现在把爆炸配置给飞弹:点选飞弹预制物体(Missile Prefab),在参数面板Explosion变量栏,拖放工程面板中的爆炸到上面。定义爆炸的行为下面我们要再创建一个脚本来定义爆炸自身的特性。创建一个新的脚本-Explosion,放在Weapons文件夹中,双击脚本进行编辑。脚本中另一个常用函数称为Start()。当它配置给的物体是在游戏中产生的时候,函数Start()中的代码只被执行一次。我们要实现的效果就是在一定时间后,在游戏中删除爆炸。我们通过函数Destroy()的第二个参数实现,它的作用是定义执行删除前的时间长度。变量explosionTime设置成外部变量,方便调节。新建脚本插入以上代码时,要删除函数Update()。把脚本Explosion赋予给爆炸预制物体。音效目前的游戏世界太安静了,让我们给爆炸效果增加点音效。首先,给爆炸预制(Prefab)添加一段音频。给爆炸添加音效前,我们首先要添加一个音源部件(Audio Source),在主菜单点击Component—Audio—Audio Source。你会发现音源部件有一个Audio Clip的属性。把“RocketLauncherImpact”音效添加给爆炸预制体的AudioClip外部变量。Unity支持多种音频格式。运行游戏,发射飞弹的时候就有声音了!添加图形界面下面我们来添加GUI,有点像头部显示设备(HUD)。我们要做的GUI非常简单,就一个准星。添加一个准星:工程栏中创建一个GUI的文件夹。创建一个新脚本,命名为“准星”(Crosshair),拖到GUI文件夹。Crosshair中写入下面的脚本:首先我们设定了两个变量。第一个变量是定义我们将要用可选的方式来选择图形纹理。第二个变量定义了一个方形区间,它是图形纹理在屏幕上的位置范围。在start( ) 中函数用来设定图形纹理在屏幕上的位置。函数中,有四个参数,用来定义方形区域的大小和位置。第一个参数定义了方形区域的左边框,第二个是底边框,第三和第四个参数定义了宽和高。OnGUI( )函数中,使用GUI类程序来让图形显示在屏幕上。DrawTexture( )函数的参数position和crosshairTexture将使准星显示在屏幕的中央位置。保存脚本。创建一个新的空物体,命名为“GUI”。把脚本“Crosshair”赋予给GUI物体。点选GUI物体,把在文件夹Texturelaim下的欲使用的图形拖放到参数面板变量Crosshair Texture中。运行游戏,屏幕中就会有准星显示了。物理特效:现在,我们想要游戏中的物体效果越真实越好,这是通过添加物理特效实现的。在这一节中,我们将在环境中添加一些物体,他们能被飞弹击中后有相应的反应。首先有几个新概念要解释下。校正(Update)先前,我们在函数Update()中写入代码,这样可以在每一帧都执行其中的代码。其中有个例子是检测玩家点击开火键。帧速并不是一个固定值,它是根据场景复杂度等因素来定的。各帧之间的时间差会导致不稳定的物体反应。因此,如果想在场景中添加有物理反应的物体(刚体等),代码就应该写在函数FixedUpdate()中。Unity中deltaTime的值用来测定渲染两个连续帧的所用时间。一般而言,函数Update与FixedUpdate之间的区别如下:Update()-其中的代码通常用于角色行为、游戏逻辑等。这个函数中的deltaTime值并不是固定的。FixedUpdate()-其中的代码通常用于刚体物体(物理属性的行为)。函数中deltaTime的值通常是固定的。FixedUpdate函数被调用的频率是主菜单中Edit-Project Settings-Time的FixedTimestep属性确定的,当然也是可以更改的。第二个属性Time Scale是读取每秒的帧速和相应的倒数值。技巧:定义FixedTimestep值时,要注意把握好一个平衡:值越小,物理效果越真实越好,但影响游戏运行速度。应该同时确保游戏运行速度和物理效果的真实性。最后说一下yield,它相当于暂停当前正在执行的函数。回到游戏,我们想实现的效果:使玩家可以发射飞弹(已经实现了)。如果飞弹与其它刚体物体发生碰撞,检测其范围类是否有其它被赋予刚体属性的物体。对爆炸冲击力范围内的每个刚体物体,均给予一个upwards方向上的力,使它们对飞弹产生反应。让我们看看修改后的爆炸脚本(Explosion Javascript)首先检测下飞弹落点周围是否有带碰撞器的物体。函数Physics.OverlapSphere()有两个参数:3D位置和半径值,然后返回一组检测到的在半径内的碰撞器的数组。一旦得到这些数组后,就会对每个对应碰撞器的刚体物体一个在特定方向上的力。然后我们在飞弹的炸点处,向上的方向增加一个力(ExplosionPower)。但是,爆炸效果是随着距离而递减的,作用力大小不能在整个半径内都一样。圆周位置的刚体物体受到的作用力应该比炸点中心处小。函数把这种效果也考虑在内的。通过调节外部变量explosionPower和explosionRadius的值,可以较容易的得到想要的效果。。把MissileLauncher脚本和飞弹预制物体(Missile Prefab)拖到这个文件中。我们来看看飞弹发射器的完整JavaScript脚本。进一步思考一下,我们到底想实现什么效果?我们要检测玩家是否按了开火键。因此我们还需要对游戏物体添加零件:从主菜单栏选择GameObject&gt。你可以从层级面板中删除球体,在Unity中打开工程文件
手机游戏第一发布
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。unity FPS射击游戏项目 Ultimate FPS 1.7.1,Unity3D,游戏源码,6m5m游戏素材
请求处理中...
unity FPS射击游戏项目 Ultimate FPS 1.7.1 (Apr 02, 2017)Assetstore上最有名的fps完整工程。Requires Unity 5.2.3 or&&& higher.
或 20 积分 ()
下载44浏览人数1001交付方式直接下载
注意:【1】本站只是个免费分享平台,并不敢保证所有源码人人都能编译,因素太多,旨在学习研究,如果您有顾虑或斤斤计较就请不要下载了,大家都不容易,互相理解,才能让更多的好资源出现!【2】本站资源仅限于学习研究,请在下载后24小时内删除,不要用于任何商业用途。【3】部分素材压缩包因体积过大而上传到百度等网盘上,如果发现在本站下载的压缩包只要有几K大小,说明该压缩包里只是网盘的下载链接,并非文件损坏,本站的所有素材都是经过了审核,大家可放心下载,欢迎监督反馈。【4】做个好平台真心不容易,我们一直在努力,因本站素材量大,难免会出现某网盘下载链接失效等问题,请大家及时反馈,我们会及时修正保证您可以拿到素材,请大家支持和理解!
免责声明:本网所展示的素材与服务信息由买卖双方自行提供,其真实性、准确性和合法性由信息发布人负责。本网不提供任何保证,并不承担任何法律责任,如有不妥之处请及时反馈,本网将会妥善处理。
友情提醒:本站旨在游戏开发的学习,所分享的素材资源均来源于网络,仅适用于学习参考,尊重版权,禁止用于任何商业用途,否则后果自负,所展示的素材版权归原作者或公司所有,如果本站素材侵犯了您的权益,请联系我们,我们将及时处理。
猜您喜欢的游戏素材
0金币 / 份
1金币 / 个
1金币 / 个
0金币 / 个
1金币 / 个
0金币 / 个
0金币 / 个
2金币 / 个
0金币 / 个
1金币 / 个
发布素材19扫一扫,访问微社区
后使用快捷导航没有帐号?
签到成功!您今天第{todayrank}个签到,签到排名竞争激烈,记得每天都来签到哦!已连续签到:{constant}天,累计签到:{days}天
当前位置: &
查看: 3081|回复: 2
unity fps第一人称游戏制作
本帖为抢楼帖,欢迎抢楼!&
61474/1500排名<font color="#FF昨日变化主题帖子积分
蛮牛粉丝, 积分 1474, 距离下一级还需 26 积分
蛮牛粉丝, 积分 1474, 距离下一级还需 26 积分
蛮牛币1358
在线时间57 小时
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
才可以下载或查看,没有帐号?
第一部分:简介
这个教程中,我们详细了解下如何制作一个简单的第一人称射击游戏(FPS)。其中将介绍一些基本的3D游戏编程的概念和一些关于怎样如游戏程序员般思考的技巧。
这个教程假定你已经熟悉软件Unity基本操作,掌握了基本的脚本概念。
创建新工程
下载FPS_Tutorial.zip压缩文件,解压,在Unity中打开工程文件。
从Unity安装目录导入Standard Assets资源包。
导入工程后,你会在Unity工程面板中的“Standard Assets”文件夹下看见这些资源内容。当我们导入新资源时,最好安装按照资源功能对其分组,例如:火箭、爆炸、音频等。
设置游戏环境
导入资源后,你会注意到在工程面板中有许多文件夹。
工程面板中,从文件夹“Object/mainLevelMesh”中选择“mainLevelMesh”。
在参数面板,FBXImporter选项中,你会发现“Generate Colliders”选项,勾选此选项。如果不做这一步,游戏中玩家会穿越地面直接掉下深渊(实际是开启“碰撞”,产生交互)
把“mainLevelMesh”拖放到场景中。
场景中不需要添加灯光,这关全部场景已经全部应用了灯光贴图。整个场景对所有灯光进行了灯光贴图渲染,使用了“预烘焙阴影”。灯光贴图对显示效果有很大帮助,特别是复杂灯光环境。
下面可以在场景中添加一个角色了。
添加主要角色
下面在场景中增加一个可以操控的角色物体。Unity针对第一人称射击游戏预置了许多内置的控制器,在工程面板Standard Assets-&;Prefabs下。
添加第一人称控制器,点击工程面板Standard Assets旁边的小三角,弹出资源列表。找到Prefabs文件夹,点击小三角形,弹出资源列表。把“First person controller”拖到场景里。
这时场景中会出现一个代表玩家的圆柱体,三个大箭头代表物体在3D空间中的位置(如果没有看见箭头,选择物体,按“W”键),白色面代表物体当前视角。现在FPS控制器处于默认视角位置,通过移动它可以改变游戏视野。把角色移动到游戏环境关卡地面上面的位置。
Main Camera现在已经没有用处了,可以删掉了。
点击“Play”键,现在应该可以通过使用鼠标和键盘在本关卡地形中四处移动了(光标或者“W,A,S,D”)
现在我们创建了一个非常简单的FSP,下面我们给角色添加武器。
下面我们将给游戏角色一个类似榴弹的物体,可以在游戏中发射。要实现这个功能,需要创建一些脚本语言来在Unity中告知这个武器如何动作。
那么我们具体要实现什么呢?我们要使游戏角色能在摄像机的任意位置开火。但是,我们还是首先来思考一下游戏角色和武器。游戏角色游戏中是第一人称的视角,所以摄像机的位置与眼睛平行。如果玩家使用武器射击,武器应该是在角色的手部位置开火而不是眼睛的位置。这样我们就要增加一个“game object”(游戏物体)来代表榴弹发射器,同时把它放置在游戏角色手持武器时武器所处的位置。这样就保证了开火的位置没有。
创建武器发射器
首先,创建一个“game object”代表榴弹发射器。游戏物体是3D世界中的任一物体(角色、关卡、声音),零件就是游戏物体的属性。因此我们还需要对游戏物体添加零件:
从主菜单栏选择GameObject&Great Empty,并在层级面板中(Hierarchy)命名为“Launcher”。注意,空物体在场景中是看不见的,只是用它来作放置飞弹发射器。
现在在场景中把视野推近到FPS控制器,便于我们放置武器发射器。
层级面板中选择FPS控制器,确保鼠标处于场景视图中,按“F”键。使窗口以当前选择的物体为中心。
层级面板中选择发射器,主菜单栏选择Game Object&Move to view。注意发射器如何移动到FPS控制器附近的。然后使用手柄,把发射器移动到大概角色手部的位置。
注意:可以通过设置这个物体的位置来设定游戏角色是左撇子还是右撇子,不需要写代码。
使Unity窗口模式是“2by3”模式(window&Layouts&2by3),点击播放键(play)。确保层级面板中点选了发射器,四处移动角色,同时观察场景窗口。你将发现发射器并没有随着角色一起运动(现在再次点击播放键停止运行游戏)
下面来解决这个问题,层级面板中,把发射器拖放到FPS控制器下面的主摄像机上。弹出的对话框点击“是”。再次运行游戏,观察场景窗口,发射器已经和角色运动一致了。这样我们就把发射器与摄像机关联起来了。
下面我们来创建在玩家点击开火键时能够发射出来的飞弹。
我们先用一个简单物体-球体-代替飞弹。Unity主菜单栏点击Assets&Creat&;Prefab创建一个预制(Prefab)物体,命名为“Missile”
创建一个球体(GameObject&Create Object&Sphere)
层级面板中,拖放球体到飞弹预制物体上(Missile),这时预制物体图标会变化。你可以从层级面板中删除球体。
技巧:游戏运行中产生的任何游戏物体都应该是预制物体(Prefab)。
编写飞弹发射器脚本
FPS控制器是一个包含了几个游戏物体和部件的预制物体。FPS控制器本身是一个只能沿Y轴旋转的圆柱体,因此,如果我们直接把发射器脚本赋予FPS控制器的话,是实现不了上下开火的。所以我们把脚本赋予控制器中的能够四周转动的主摄像机。
下面我们来编写第一个描述发射器行为的JavaScript代码。
点击Assets&Greate&JavaScript,创建一个空的JavaScript文档。一个名为“NewBehaviourScript”资源将会出现在工程面板中,把它更名为“MissileLauncher”
技巧:通过Unity&;Preferences点击External Script Editor,可以自定义外部脚本编辑器。
工程面板中创建一个“WeaponScripts”文件夹,放置我们所有的武器脚本。把MissileLauncher脚本和飞弹预制物体(Missile Prefab)拖到这个文件中。
我们来看看飞弹发射器的完整JavaScript脚本。
进一步思考一下,我们到底想实现什么效果?我们要检测玩家是否按了开火键,然后产生一枚飞弹,然后把它沿着玩家朝向的方向按照一定的速度发射出去。我们仔细的解剖一下脚本:
var projectile: R
var speed=20;
function Update( )
这是脚本的开头部分,定义了一些属性,开启了“Update”的功能
if(Input.GetButtonDown(“Fire1”))
首先我们要检测玩家是否按了开火键,“开火1”映射的是鼠标左键和当前配置的键盘上的按键(可以通过主菜单栏的Editor&;Project Settings&Input设定)
var instantiatedProjectile: Rigidbody=Instantiate(
projectile, transform.position,transform.rotation);
我们用变量来定义产生的物体。变量的类型是Rigibody(刚体),因为飞弹是具有物理属性的。
Unity中产生新物体使用的函数是Instantiate,它有三个参数,分别是:产生的物体、产生物体的3D空间位置、物体的旋转。它还有另一个语法结构,参照API手册,这里我们只使用这种结构。
第一个参数,projectile,代表我们想创建的物体。那么到底发射什么物体?具体产生的物体是可以手动设定的。实现方法:把Projectile定义为函数的外部变量,这样就可以在参数面板中显示出来。发射的物体也可以通过代码来创建,但如果你想使一个变量可调的话,还是用上面的方法。
第二个参数,transform.position,使产生的物体与发射器的空间位置一致。为什么就是发射器呢?因为如果要使飞弹产生的位置没有问题,脚本就要关联给发射器。(transform读取的transform数据就是被赋予脚本的游戏物体transform数据)
第三个参数transform.rotation,与第二个类似,只是它的值与发射器的旋转值是一样的。
代码的下一部分使飞弹产生运动。为了实现运动,我们要赋予飞弹一个速度,但是在哪个方向上(X,Y,Z)产生速度呢?在场景中,点击FPS控制器,出现运动箭头(如果没有出现,按“W”键),其中一个箭头是红色、一个是绿色、一个是蓝色。红色代表X轴,绿色代表Y轴,蓝色代表Z轴。因为蓝色指向的方向,与玩家面朝的方向一致,所以我们要在Z轴上给飞弹一个速度。
(Velocity)速度是instantiatedProjectile的一个属性。我们怎么知道的呢?因为instantiatedProjectile是刚体的一种,如果我们看看API手册,我们就会知道速度是刚体的属性中的一种。同时也看看刚体的其它属性。要设置速度,我们就必须在各个轴向上设定数值。但还有个小问题。3D空间中的物体一般使用两种坐标模型:本地坐标系和世界坐标系。在本地坐标系中,物体的轴向只与物体本身有关。在世界坐标系中,轴向是绝对的,例如:向上,对所有物体来讲向上的方向都是一样的。
Rigidbody.Vellocity刚体物体速度必须使用世界坐标系。因此,定义速度时,需要把本地坐标系中的Z轴(朝前的方向)向转换成世界坐标系中的相应方向。可以用函数transform.TransformDirection,它有三个向量作为自变量。变量speed也应该定义成外部变量,便于后面在编辑器中直接调节数值。
最后,我们要关闭飞弹与游戏角色之间的碰撞。如果不这样做的话,飞弹产生的时候就可能与角色发生碰撞。可以在API手册IgnoreCollision下查询详细信息。
MissileLauncher.js全部完整代码如下:
把脚本MissileLauncher赋予FPS控制器中的发射器。在层级面板中点击发射器,检查一下参数面板下面是否显示了MissileLauncher script。
先前创建的飞弹的预制物体还没有与脚本中的变量projectile创建关联,我们需要在编辑器中创建一下。变量projectile只能与刚体关联,因此,首先我们要赋予飞弹一个Rigidbody。
工程面板中点击飞弹,然后从主菜单栏选择Components&;Physics&Rigidbody。这样将会给我们想开火发射的飞弹一个刚体属性。我们必须确保想在游戏中发射的物体类型与脚本中外部变量要求的物体类型是同一类型的物体。
创建飞弹与脚本中变量projectile的链接。首先在层级面板中点击发射器,然后把飞弹的预制物体从工程面板中拖拽放置在发射器参数面板中MissileLauncher script部分上。
运行游戏的话,你会发现点击开火键可以发出一个受重力影响的小球了。
下面,当飞弹与其他物体发生碰撞时,增加一个爆炸效果。要实现这个效果,我们要编写一段新脚本赋予飞弹。
创建一个新脚本,命名为Projectile。拖放到工程面板的WeaponScripts文件夹下。
那么我们想要脚本Projectile实现什么样的效果呢?我们要检测飞弹是否发生碰撞,然后在碰撞点产生一个爆炸效果。代码如下:
函数OnCollisionEnter内的程序代码的作用是计算被赋予脚本的物体是否与其他物体发生碰撞。
在函数OnCollisionEnter中我们主要是要实现在3D空间中飞弹发生碰撞的点产生一个新爆炸。那么在何处了碰撞的呢?函数OnCollisionEnter就有个记录这个信息的功能。碰撞发生的点的信息储存在变量ContactPoint中。
这里我们使用函数Instantiate来创建一个爆炸。我们已经知道函数instatiate有三个参数:(1)产生的物体(2)物体的3D空间位置
(3)物体的旋转。
第一个参数,后面我们将会赋给一个带粒子系统的游戏物体。同时我们还想通过编辑器来实现这个功能,所以我们把变量设置为外部变量。
第二个参数,爆炸产生的点的位置,就是碰撞发生的位置。
第三个参数,爆炸旋转的设置,需要解释一下。我们需要爆炸体的Y轴方向与飞弹和其他物体发生碰撞的那个表面的法线方向一致。这就是说如果是墙面那么爆炸就面向外,如果是地板就朝上。那么实际上我们就是要使爆炸体在本地坐标系的Y轴与飞弹与之碰撞的物体的表面法线方向(世界坐标系)一致。
最后,我们要让飞弹碰撞后就从游戏中消失,通过函数Destroy()实现,它的参数是gameObject(gameObject代表被赋予这个脚本的物体)。
Projectile.js全部代码如下:
把脚本赋予飞弹预制物体(Missile prefab)。
下面我们要创建飞弹发生碰撞时所产生爆炸的爆炸效果物体。
首先,创建一个新的预制物体(命名为Explosion)用来存放爆炸效果资源。
标准资源包中(standard asset)有个不错的爆炸预制物体,粒子系统和灯光都设置好了。把这个爆炸预制物体(在Standard Assets/Particles/explosion中)拖放到层级面板。
调节这个爆炸效果的各个参数直到你觉得满意,然后把它从层级面板中拖放到工程面板中的爆炸预制物体(Explosion Prefab)中。
现在把爆炸配置给飞弹:
点选飞弹预制物体(Missile Prefab),在参数面板Explosion变量栏,拖放工程面板中的爆炸到上面。
定义爆炸的行为
下面我们要再创建一个脚本来定义爆炸自身的特性。
创建一个新的脚本-Explosion,放在Weapons文件夹中,双击脚本进行编辑。
脚本中另一个常用函数称为Start()。当它配置给的物体是在游戏中产生的时候,函数Start()中的代码只被执行一次。我们要实现的效果就是在一定时间后,在游戏中删除爆炸。我们通过函数Destroy()的第二个参数实现,它的作用是定义执行删除前的时间长度。
变量explosionTime设置成外部变量,方便调节。
新建脚本插入以上代码时,要删除函数Update()。
把脚本Explosion赋予给爆炸预制物体。
目前的游戏世界太安静了,让我们给爆炸效果增加点音效。
首先,给爆炸预制(Prefab)添加一段音频。
给爆炸添加音效前,我们首先要添加一个音源部件(Audio Source),在主菜单点击Component—Audio—Audio Source。你会发现音源部件有一个Audio Clip的属性。
把“RocketLauncherImpact”音效添加给爆炸预制体的AudioClip外部变量。Unity支持多种音频格式。
运行游戏,发射飞弹的时候就有声音了!
添加图形界面
下面我们来添加GUI,有点像头部显示设备(HUD)。我们要做的GUI非常简单,就一个准星。
添加一个准星:
工程栏中创建一个GUI的文件夹。
创建一个新脚本,命名为“准星”(Crosshair),拖到GUI文件夹。
Crosshair中写入下面的脚本:
首先我们设定了两个变量。第一个变量是定义我们将要用可选的方式来选择图形纹理。第二个变量定义了一个方形区间,它是图形纹理在屏幕上的位置范围。
在start( ) 中函数用来设定图形纹理在屏幕上的位置。函数中,有四个参数,用来定义方形区域的大小和位置。第一个参数定义了方形区域的左边框,第二个是底边框,第三和第四个参数定义了宽和高。
OnGUI( )函数中,使用GUI类程序来让图形显示在屏幕上。DrawTexture( )函数的参数position和crosshairTexture将使准星显示在屏幕的中央位置。
保存脚本。
创建一个新的空物体,命名为“GUI”。
把脚本“Crosshair”赋予给GUI物体。
点选GUI物体,把在文件夹Texturelaim下的欲使用的图形拖放到参数面板变量Crosshair Texture中。
运行游戏,屏幕中就会有准星显示了。
物理特效:
现在,我们想要游戏中的物体效果越真实越好,这是通过添加物理特效实现的。在这一节中,我们将在环境中添加一些物体,他们能被飞弹击中后有相应的反应。首先有几个新概念要解释下。
校正(Update)
先前,我们在函数Update()中写入代码,这样可以在每一帧都执行其中的代码。其中有个例子是检测玩家点击开火键。帧速并不是一个固定值,它是根据场景复杂度等因素来定的。各帧之间的时间差会导致不稳定的物体反应。因此,如果想在场景中添加有物理反应的物体(刚体等),代码就应该写在函数FixedUpdate()中。Unity中deltaTime的值用来测定渲染两个连续帧的所用时间。
一般而言,函数Update与FixedUpdate之间的区别如下:
Update()-其中的代码通常用于角色行为、游戏逻辑等。这个函数中的deltaTime值并不是固定的。
FixedUpdate()-其中的代码通常用于刚体物体(物理属性的行为)。函数中deltaTime的值通常是固定的。
FixedUpdate函数被调用的频率是主菜单中Edit-Project Settings-Time的FixedTimestep属性确定的,当然也是可以更改的。第二个属性Time Scale是读取每秒的帧速和相应的倒数值。
技巧:定义FixedTimestep值时,要注意把握好一个平衡:值越小,物理效果越真实越好,但影响游戏运行速度。应该同时确保游戏运行速度和物理效果的真实性。
最后说一下yield,它相当于暂停当前正在执行的函数。
回到游戏,我们想实现的效果:
使玩家可以发射飞弹(已经实现了)。
如果飞弹与其它刚体物体发生碰撞,检测其范围类是否有其它被赋予刚体属性的物体。
对爆炸冲击力范围内的每个刚体物体,均给予一个upwards方向上的力,使它们对飞弹产生反应。
让我们看看修改后的爆炸脚本(Explosion Javascript)
首先检测下飞弹落点周围是否有带碰撞器的物体。函数Physics.OverlapSphere()有两个参数:3D位置和半径值,然后返回一组检测到的在半径内的碰撞器的数组。
一旦得到这些数组后,就会对每个对应碰撞器的刚体物体一个在特定方向上的力。
然后我们在飞弹的炸点处,向上的方向增加一个力(ExplosionPower)。但是,爆炸效果是随着距离而递减的,作用力大小不能在整个半径内都一样。圆周位置的刚体物体受到的作用力应该比炸点中心处小。函数把这种效果也考虑在内的。通过调节外部变量explosionPower和explosionRadius的值,可以较容易的得到想要的效果。
//If we have a particle emitter attached, emit particles for .5 seconds
if( particleEmitter )
particleEmitter.emit =
yield WaitForSeconds( 0.5 );
particleEmitter.emit =
如果一个粒子发射器也添加到了爆炸预制中的话,然后就开始发射粒子,0.5秒后停止发射(yield)。
完整爆炸脚本如下:
var explosionTime = 1.0;
var explosionRadius = 5.0;
var explosionPower = 2000.0;
function Start()
//Destroy the explosion in x seconds,
//this will give the particle system and audio enough time to finish playing
Destroy( gameObject, explosionTime );
//Find all nearby colliders
var colliders : Collider[] = Physics.OverlapSphere( transform.position,
explosionRadius );
//Apply a force to all surrounding rigid bodies.
for( var hit in colliders )
if( hit.rigidbody )
hit.rigidbody.AddExplosionForce( explosionPower,
transform.position, explosionRadius );
//If we have a particle emitter attached, emit particles for .5 seconds
if( particleEmitter )
particleEmitter.emit =
yield WaitForSeconds( 0.5 );
particleEmitter.emit =
unity fps背包;unity 为什么制作的prebs没有变蓝色;unity 返回键;unity 第一人称 相机; 真机查看第一人称控制器下载;unity 测绿色兵团unity源码;unity3d5制作fps游戏; 制作简单射击游戏;unityfps太低;unity 3d写的局域网fps游戏;unity3d第一人称 教程;u3d的u3fps_tutorial.rigidbody.addexplfps源代码;unity 第一人称移动;unity 5unity 解压unity particle system play
每日推荐:
14/50排名<font color="#FF昨日变化130主题帖子积分
注册看看, 积分 4, 距离下一级还需 46 积分
注册看看, 积分 4, 距离下一级还需 46 积分
在线时间2 小时
每日推荐:
15/50主题帖子积分
注册看看, 积分 5, 距离下一级还需 45 积分
注册看看, 积分 5, 距离下一级还需 45 积分
在线时间3 小时
每日推荐:}

我要回帖

更多关于 零基础学做菜 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信