unity 第一人称射击游戏推荐Word格式.docx
《unity 第一人称射击游戏推荐Word格式.docx》由会员分享,可在线阅读,更多相关《unity 第一人称射击游戏推荐Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
在参数面板,FBXImporter选项中,你会发现“GenerateColliders”选项,勾选此选项。
如果不做这一步,游戏中玩家会穿越地面直接掉下深渊(实际是开启“碰撞”,产生交互)
把“mainLevelMesh”拖放到场景中。
场景中不需要添加灯光,这关全部场景已经全部应用了灯光贴图。
整个场景对所有灯光进行了灯光贴图渲染,使用了“预烘焙阴影”。
灯光贴图对显示效果有很大帮助,特别是复杂灯光环境。
下面可以在场景中添加一个角色了。
添加主要角色
下面在场景中增加一个可以操控的角色物体。
Unity针对第一人称射击游戏预置了许多内置的控制器,在工程面板StandardAssets->
Prefabs下。
添加第一人称控制器,点击工程面板StandardAssets旁边的小三角,弹出资源列表。
找到Prefabs文件夹,点击小三角形,弹出资源列表。
把“Firstpersoncontroller”拖到场景里。
这时场景中会出现一个代表玩家的圆柱体,三个大箭头代表物体在3D空间中的位置(如果没有看见箭头,选择物体,按“W”键),白色面代表物体当前视角。
现在FPS控制器处于默认视角位置,通过移动它可以改变游戏视野。
把角色移动到游戏环境关卡地面上面的位置。
MainCamera现在已经没有用处了,可以删掉了。
点击“Play”键,现在应该可以通过使用鼠标和键盘在本关卡地形中四处移动了(光标或者“W,A,S,D”)
现在我们创建了一个非常简单的FSP,下面我们给角色添加武器。
增加武器
下面我们将给游戏角色一个类似榴弹的物体,可以在游戏中发射。
要实现这个功能,需要创建一些脚本语言来在Unity中告知这个武器如何动作。
那么我们具体要实现什么呢?
我们要使游戏角色能在摄像机的任意位置开火。
但是,我们还是首先来思考一下游戏角色和武器。
游戏角色游戏中是第一人称的视角,所以摄像机的位置与眼睛平行。
如果玩家使用武器射击,武器应该是在角色的手部位置开火而不是眼睛的位置。
这样我们就要增加一个“gameobject”(游戏物体)来代表榴弹发射器,同时把它放置在游戏角色手持武器时武器所处的位置。
这样就保证了开火的位置没有问题。
创建武器发射器
首先,创建一个“gameobject”代表榴弹发射器。
游戏物体是3D世界中的任一物体(角色、关卡、声音),零件就是游戏物体的属性。
因此我们还需要对游戏物体添加零件:
从主菜单栏选择GameObject>
GreatEmpty,并在层级面板中(Hierarchy)命名为“Launcher”。
注意,空物体在场景中是看不见的,只是用它来作放置飞弹发射器。
现在在场景中把视野推近到FPS控制器,便于我们放置武器发射器。
层级面板中选择FPS控制器,确保鼠标处于场景视图中,按“F”键。
使窗口以当前选择的物体为中心。
层级面板中选择发射器,主菜单栏选择GameObject>
Movetoview。
注意发射器如何移动到FPS控制器附近的。
然后使用手柄,把发射器移动到大概角色手部的位置。
注意:
可以通过设置这个物体的位置来设定游戏角色是左撇子还是右撇子,不需要写代码。
使Unity窗口模式是“2by3”模式(window>
Layouts>
2by3),点击播放键(play)。
确保层级面板中点选了发射器,四处移动角色,同时观察场景窗口。
你将发现发射器并没有随着角色一起运动(现在再次点击播放键停止运行游戏)
下面来解决这个问题,层级面板中,把发射器拖放到FPS控制器下面的主摄像机上。
弹出的对话框点击“是”。
再次运行游戏,观察场景窗口,发射器已经和角色运动一致了。
这样我们就把发射器与摄像机关联起来了。
创建飞弹
下面我们来创建在玩家点击开火键时能够发射出来的飞弹。
我们先用一个简单物体-球体-代替飞弹。
Unity主菜单栏点击Assets>
Creat>
Prefab创建一个预制(Prefab)物体,命名为“Missile”
创建一个球体(GameObject>
CreateObject>
Sphere)
层级面板中,拖放球体到飞弹预制物体上(Missile),这时预制物体图标会变化。
你可以从层级面板中删除球体。
技巧:
游戏运行中产生的任何游戏物体都应该是预制物体(Prefab)。
编写飞弹发射器脚本
FPS控制器是一个包含了几个游戏物体和部件的预制物体。
FPS控制器本身是一个只能沿Y轴旋转的圆柱体,因此,如果我们直接把发射器脚本赋予FPS控制器的话,是实现不了上下开火的。
所以我们把脚本赋予控制器中的能够四周转动的主摄像机。
下面我们来编写第一个描述发射器行为的JavaScript代码。
点击Assets>
Greate>
JavaScript,创建一个空的JavaScript文档。
一个名为“NewBehaviourScript”资源将会出现在工程面板中,把它更名为“MissileLauncher”
通过Unity>
Preferences点击ExternalScriptEditor,可以自定义外部脚本编辑器。
工程面板中创建一个“WeaponScripts”文件夹,放置我们所有的武器脚本。
把MissileLauncher脚本和飞弹预制物体(MissilePrefab)拖到这个文件中。
我们来看看飞弹发射器的完整JavaScript脚本。
进一步思考一下,我们到底想实现什么效果?
我们要检测玩家是否按了开火键,然后产生一枚飞弹,然后把它沿着玩家朝向的方向按照一定的速度发射出去。
我们仔细的解剖一下脚本:
varprojectile:
Rigibody;
varspeed=20;
functionUpdate()
{
这是脚本的开头部分,定义了一些属性,开启了“Update”的功能
if(Input.GetButtonDown(“Fire1”))
首先我们要检测玩家是否按了开火键,“开火1”映射的是鼠标左键和当前配置的键盘上的按键(可以通过主菜单栏的Editor>
ProjectSettings>
Input设定)
varinstantiatedProjectile:
Rigidbody=Instantiate(
projectile,transform.position,transform.rotation);
我们用变量来定义产生的物体。
变量的类型是Rigibody(刚体),因为飞弹是具有物理属性的。
Unity中产生新物体使用的函数是Instantiate,它有三个参数,分别是:
产生的物体、产生物体的3D空间位置、物体的旋转。
它还有另一个语法结构,参照API手册,这里我们只使用这种结构。
第一个参数,projectile,代表我们想创建的物体。
那么到底发射什么物体?
具体产生的物体是可以手动设定的。
实现方法:
把Projectile定义为函数的外部变量,这样就可以在参数面板中显示出来。
发射的物体也可以通过代码来创建,但如果你想使一个变量可调的话,还是用上面的方法。
第二个参数,transform.position,使产生的物体与发射器的空间位置一致。
为什么就是发射器呢?
因为如果要使飞弹产生的位置没有问题,脚本就要关联给发射器。
(transform读取的transform数据就是被赋予脚本的游戏物体transform数据)
第三个参数transform.rotation,与第二个类似,只是它的值与发射器的旋转值是一样的。
instantiatedProjectile.Vellocity=
transform.TransformDirection(Vector3(0,0,speed));
代码的下一部分使飞弹产生运动。
为了实现运动,我们要赋予飞弹一个速度,但是在哪个方向上(X,Y,Z)产生速度呢?
在场景中,点击FPS控制器,出现运动箭头(如果没有出现,按“W”键),其中一个箭头是红色、一个是绿色、一个是蓝色。
红色代表X轴,绿色代表Y轴,蓝色代表Z轴。
因为蓝色指向的方向,与玩家面朝的方向一致,所以我们要在Z轴上给飞弹一个速度。
(Velocity)速度是instantiatedProjectile的一个属性。
我们怎么知道的呢?
因为instantiatedProjectile是刚体的一种,如果我们看看API手册,我们就会知道速度是刚体的属性中的一种。
同时也看看刚体的其它属性。
要设置速度,我们就必须在各个轴向上设定数值。
但还有个小问题。
3D空间中的物体一般使用两种坐标模型:
本地坐标系和世界坐标系。
在本地坐标系中,物体的轴向只与物体本身有关。
在世界坐标系中,轴向是绝对的,例如:
向上,对所有物体来讲向上的方向都是一样的。
Rigidbody.Vellocity刚体物体速度必须使用世界坐标系。
因此,定义速度时,需要把本地坐标系中的Z轴(朝前的方向)向转换成世界坐标系中的相应方向。
可以用函数transform.TransformDirection,它有三个向量作为自变量。
变量speed也应该定义成外部变量,便于后面在编辑器中直接调节数值。
Physics.IgnoreCollision(instantiatedProjectile.collider,
transform.root.collider);
}
最后,我们要关闭飞弹与游戏角色之间的碰撞。
如果不这样做的话,飞弹产生的时候就可能与角色发生碰撞。
可以在API手册IgnoreCollision下查询详细信息。
MissileLauncher.js全部完整代码如下:
varprojectile:
Rigidbody;
varspeed=20;
functionUpdate()
if(Input.GetButtonDown("
Fire1"
))
varinstantiatedProjectile:
Rigidbody=Instantiate(
projectile,transform.position,transform.rotation);
instantiatedProjectile.velocity=
transform.TransformDirection(Vector3(0,0,speed));
Physics.IgnoreCollision(instantiatedProjectile.collider,
transform.root.collider);
把脚本MissileLauncher赋予FPS控制器中的发射器。
在层级面板中点击发射器,检查一下参数面板下面是否显示了MissileLauncherscript。
先前创建的飞弹的预制物体还没有与脚本中的变量projectile创建关联,我们需要在编辑器中创建一下。
变量projectile只能与刚体关联,因此,首先我们要赋予飞弹一个Rigid