[Unity学习笔记:FPS游戏制作(2)] 发射子弹————(2021.6.20学习笔记)

往期博客 [Unity学习笔记:FPS游戏制作(1)]角色的移动,旋转与推进上升————(2021.6.13学习笔记)

一,实现思路

制作子弹的预制体,然后在脚本的Update()中进行监听用户是否点击鼠标左键,如果用户点击鼠标左键,则加载之前制作的子弹预制体,并在枪口的附近位置生成子弹。而且考虑到枪口位置随用户视角变化,非固定,所以子弹生成位置不能为绝对位置,而是相对位置。但这里有个问题出现了,那就是子弹发射出去的时候为绝对位置(如果为相对位置的话,发射出去的子弹会随着枪口位置变化,发生变化。错误演示如下图)
在这里插入图片描述
为了解决以上的问题,一个解决办法就是,在枪口附近新建一个空物体集(Bullets),并将子弹生成为该物体集的子对象,然后因为该物体集本身也为枪口的子物体,所以保证子弹处于枪口的相对位置,最后在发射的时候调用该物体集的DetachChildren(),解除该物体集跟子弹的父子关系,让子弹发射之后为绝对位置。
解决完子弹发射的位置问题之后,只要通过Destroy()将发射后的子弹物体销毁,整个子弹发射功能就完成了。

二,实现代码

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

public class FireScript : MonoBehaviour
{
    public GameObject BulletPrefab;//子弹预制体
    public GameObject Bullets;//子弹物体集
    public Camera PlayerCamera;//玩家摄像头
    public int BulletSpeed = 800;//子弹速度
    private int index=0;//子弹计数
    void Update()
    {
        if(Input.GetKeyDown(KeyCode.Mouse0))//监测鼠标左键是否被点击
        {
            index++;//子弹计数
            GameObject BulletGameObject = Instantiate(BulletPrefab);//加载预制体
            BulletGameObject.name = "Bullet"+index;
            BulletGameObject.transform.parent = Bullets.transform;//设置子弹父对象
            BulletGameObject.transform.localPosition = new Vector3((float)(-1),0,(float)(-0.02));//在指定坐标生成子弹
            BulletGameObject.transform.rotation = PlayerCamera.transform.rotation;
            Bullets.transform.DetachChildren();//解除父子关系
            BulletGameObject.GetComponent<Rigidbody>().AddForce(PlayerCamera.transform.forward * BulletSpeed);//给予子弹一个向前的推进力
            Destroy(BulletGameObject,2);//销毁子弹物体
        }
    }
}

三,脚本的使用方法

在枪口物体下新建物体集,并将物体集和子弹预制体,玩家摄像头绑定在脚本上(如下图)。
在这里插入图片描述

四,最终效果

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值