[unity3D]简单实现FPS中的射击功能

[Unity3D]最简单最详细的第一人称射击教程

自学Unity3D一段时间,看到在网上有很多有关于Unity3D第一人称射击教程,但是大多数教程都比较复杂难懂,在这里我介绍一个比较简单实用的方法供大家参考,如有什么地方不对,还请大家指正。

话不多说,先来一张效果图在这里插入图片描述最有意思的是这个枪能够随着人物一起动,接下来让我们一起实现这个功能吧

简要说明一下,在实现设计功能之前,这个工程已经具备了基本的行走和跳跃功能,如果对这方面有不懂的同学可以看一下我写的这个教程,简单实用,链接在这里[Unity3D]最简单最详细的第一人称角色控制器

1.在原有的基础上我们创建一个Cylinder当做枪,在这之前我们要适当调整这个Cylinder的形状,让它有枪的样子
(1)创建Cylinder,在hierarchy面板空白处单击右键,选择3D Object——Cylinder。
在这里插入图片描述
(2)调整大小和方向,记住要使这个Cylinder的Z轴(蓝色轴)作为枪的枪口 要Z轴的正方向,这个在后面会有相关说明,调整好了大概就是这个样子

下面这个键可以快速调整
在这里插入图片描述
在这里插入图片描述
(3)调整好后把这个Cylinder的名字改为Gun,可以单机Cylinder,右键rename,也可以单机Cylinder,然后按F2快速改名,改完名后将它拖拽至Player下,使其成为Player的一个子物体,大概就是这样。
在这里插入图片描述
2.接下来我们来创建子弹发射的地方
(1)首先我们要创建一个空对象,用来创造子弹并让它发射出去,在Hierarchy面板下单机右键,选择Create Empty,将它重命名为Bullet,然后在Scene里面拖动它的位置,使其位于Gun的枪口上,然后再将Bullet拖拽至Player下,使其成为Player的一个子物体。在这里插入图片描述记住空对象的Z轴一定要对准外面 就是蓝色那个 因为我这个方法子弹是从这个方向出来的 不然等会就会出现一些奇怪的现象 下面这个就是Z轴对准里面 与枪口对齐后 子弹反方向射出来了 大家可不要犯这样的错啊在这里插入图片描述在这里插入图片描述
大概就是这样的一个效果

3.接下来我们制作一个子弹的预制体
(1)右键单击Hierarchy面板空白处,选择3D Object——Sphere创建一个球体,然后在其Transform组建下修改其大小,让它更小一点
在这里插入图片描述
弄好之后大概就是这样
在这里插入图片描述
(2)将Sphere拖拽至Project下的Asset下使其成为一个预制体,我们可以将它的名字改为Bullet在这里插入图片描述
然后再删除Hierarchy面板下的Bullet。
在这里插入图片描述

到这一步,一个子弹的预制体就做完了,接下来我们来制作设计脚本

4.单击Player,在其下面新建一个Shoot脚本
在这里插入图片描述
双击Shoot,进入脚本编写
在这里插入图片描述

    //定义子弹预制体
    public GameObject BulletPrefab;

    //定义一个公有类型的Transform 用来实例化一个要跟随的对象
    public Transform BulletSpawn;

    //定义一个子弹发射的速度
    public float BulletSpeed = 20;

    //Update里面的语句每一帧都会执行
    void Update()
    {
    
    
        //判断是否按下了鼠标左键    
        if (Input.GetMouseButtonDown(0))
        {
    
    
            //创建一个游戏对象bullet 
            //Instantitate(一个游戏对象,游戏对象的位置,游戏对象的角度)
            //我们会在外面把我们制作的子弹预制体赋值给BulletPrefab  然后用bullet来获取子弹预制体的一系列值,这个后面有图片展示
            //这个语句就相当于把子弹预制体的位置和角度参数给了bullet  经过编写bullet来控制子弹的一系列功能
            GameObject bullet = Instantiate(BulletPrefab, BulletSpawn.position, BulletSpawn.rotation) as GameObject;

           //我们要给子弹添加刚体属性 添加刚体属性后才会有力学特征 才会动
           //bullet.GetComponent<Rigidbody>().velocity代表着获取刚体的速度矢量,表示刚体的位置变化率
           //简单来说 这条语句代表着把一个向前的速度给这个球
            bullet.GetComponent<Rigidbody>().velocity = bullet.transform.forward * BulletSpeed;
           
           //子弹发射后如果不销毁的话就会一直堆积  毕竟不可能百发百中
           //Destroy(销毁对象,多少时间后)
            Destroy(bullet, 2);
        }
    }

5.脚本写完后记得Ctrl+S保存一下,我们回到Unity中,给子弹添加刚体属性(这个应该在制作子弹预制体的时候就要加上的,忘记加了),添加刚体属性后才会有力学特征 才会动
在这里插入图片描述
同时记得把重力过勾选去掉 不然的话就会像这样 子弹会在发射的途中下落在这里插入图片描述
当然了 你把BulletSpeed设置快一点的话 还是可以运动的 但是它还是会下落 类似于平抛运动 还是把它刚体里面的重力给勾掉在这里插入图片描述
接着要做下面的步骤 还没弄完呢 别急着运行 这时候还运行不了啊 上面就给你们演示一下

接下来我们要将对象实例化,将预制体Bullet拖拽给bulletprefab,将Hierarchy面板下Player下的Bullet拖拽给Transform在这里插入图片描述
这样大家就应该能够理解 BulletPrefab在代码里面就相当于这个拖拽进来的物体 Bullet Spawn在代码里就相当于拖拽进来的这个物体的位置 换成其它物体也一样 在Player下 Bullet是枪口 所以要获取枪口的位置 子弹从枪口里面发射出去的嘛

接下来在游戏里面按运行按钮 我们就可以运行了 效果如下在这里插入图片描述但是我们会发现 随着我们屏幕摄像机的移动 枪并没有随着一起移动 还是在原来的位置没有变化 子弹也是一样

6.所以我们接下来要实现枪跟着屏幕摄像机一起动的功能 让枪口跟着枪 枪跟着摄像机 以达到三者旋转角度相同的功能 这样就能够实现文章开头的功能 所以我们写一个跟随脚本就行了 在这里 我用了一个很简单的方法 如下

(1)首先为枪口Bullet添加一个跟随相机转动的脚本 单击Player下的Bullet 添加一个脚本 我这里命名为 Follow Gun在这里插入图片描述
由于我是做教程 已经写好了 它直接就有 大家还需要自己编辑 代码如下

    //创建一个公有的用于实例化的物体Follow  到时候要跟着谁转动  就把谁赋值给这个
    public GameObject Follow;

   //在脚本里面创建一个游戏对象 bullet  用于获取Follow的信息
    GameObject bullet;
 
    void Update()
    {
    
    
        //获取要实例化对象的信息  bullet就相当于游戏外面拖拽进来的物体了
        bullet = Follow;
        //transform.rotation也可以写成This.transform.rotation  也就是当前脚本所挂物体的角度
        //等于外面拖拽进来物体的角度 由于在Update方法里面  所以每帧都会更新  达到一个同步的现象
        transform.rotation = bullet.transform.rotation;
    }

接下来Ctrl+S保存,回到Unity中,将Gun拖入到Follow中在这里插入图片描述(2)再给Gun添加Follow Gun脚本(名字就不要介意了 功能都一样 就不用再写一个一模一样的脚本了)
在这里插入图片描述
并将Main Camera拖入到Follow中
在这里插入图片描述
接下来我们运行Unity看看效果
在这里插入图片描述
如果觉得可以的话就点个赞 关注一下吧 后面还会更新很多有关于Unity3D的教程哦 o(∩_∩)o

猜你喜欢

转载自blog.csdn.net/Z_hongli/article/details/109863110