unity 3D FPS游戏(二)——简单的武器

二、简单的武器

1.在场景中添加一个圆柱体(Cylinder),reset一下之后,调整大小、方向和材质,使它变成一个长条形,使它的Z轴(蓝色轴)向外,就像一把枪一样,然后把它重命名为Gun,最后把它变成Player的子物体

2.创建一个发射子弹的地方。在场景中创建一个空物体,放到枪口的位置,蓝色轴(Z轴)对外,名称改为ShootPoint,然后把它也拖拽到Player下,变成Player的子物体。

3.制作子弹预制体。在场景中创建一个球体,reset一下,然后调整大小和材质,名称改为Bullet;给球体增加刚体(RigidBody)属性,并勾掉使用重力(Use Gravity)选项;把这个球体拖拽到Project面板中,使其成为一个预制体,最后删除Hierarchy面板中的Bullet。

4.编写发射子弹的脚本。新建一个Script,命名为Shoot,挂载在Player上,代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Shoot : MonoBehaviour
{
    public GameObject BulletPrefab;

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

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

    //Update里面的语句每一帧都会执行
    void Update()
    {
        //判断是否按下了鼠标左键    
        if (Input.GetMouseButtonDown(0))
        {
            //克隆一个子弹预制体,位置和角度与发射点相同
            GameObject bullet = Instantiate(BulletPrefab, BulletSpawn.position, BulletSpawn.rotation);

            //给子弹的刚体一个向前的速度
            bullet.GetComponent<Rigidbody>().velocity = bullet.transform.forward * BulletSpeed;

            //2秒后销毁子弹的克隆体
            Destroy(bullet, 2);
        }
    }

}

5.把做好的子弹预制体拖拽给BulletPrefab,把ShootPoint拖拽给BulletSpawn。

6.运行游戏,测试一下,点击鼠标左键,就会发射出子弹,2秒后,子弹的克隆体就会消失

现在只是单发,如果想要连发,可以把Shoot脚本换成下面的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Shoot : MonoBehaviour
{
    //定义子弹预制体
    public GameObject BulletPrefab;

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

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

    private bool isFiring = false;  // 添加一个状态标志来表示当前是否正在连发

    private void Start()
    {

    }

    //Update里面的语句每一帧都会执行
    void Update()
    {

        //连发效果
        if (Input.GetMouseButtonDown(0) && !isFiring)
        {
            // 开始连发
            StartCoroutine(FireBullets());
        }
        else if (Input.GetMouseButtonUp(0))
        {
            // 停止连发
            isFiring = false;
        }


        IEnumerator FireBullets()
        {
            isFiring = true;

            while (isFiring && currentBulletCount > 0)
            {
                GameObject bullet = Instantiate(BulletPrefab, BulletSpawn.position, BulletSpawn.rotation);
                bullet.GetComponent<Rigidbody>().velocity = bullet.transform.forward * BulletSpeed;
                Destroy(bullet, 2);
                yield return new WaitForSeconds(0.12f);
            }
        }
    }
}

7.实现枪随着摄像机的角度抬高或降低。给ShootPoint物体增加一个Script脚本,命名为FollowGun,代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

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

    //在脚本里面创建一个游戏对象 ShootPoint  用于获取Follow的信息
    GameObject ShootPoint;

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

然后把Hierarchy面板中的Gun拖拽到Follow中

给Gun也挂载一个FollowGun脚本,然后把MainCamera拖拽到Follow中

这样,枪就可以随着摄像机旋转了,而开火位置(shootPoint)随着枪旋转,单击鼠标左键会发射子弹。这个里面还有一些小BUG,比如开火位置与枪口之间会有一小段偏移量,后面我会想办法解决。

引用链接:

简单实现FPS中的射击功能

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值