文章目录

  • 一,实现思路
  • 二,实现代码
  • 三,脚本的使用方法
  • 四,最终效果


一,实现思路

制作子弹的预制体,然后在脚本的Update()中进行监听用户是否点击鼠标左键,如果用户点击鼠标左键,则加载之前制作的子弹预制体,并在枪口的附近位置生成子弹。而且考虑到枪口位置随用户视角变化,非固定,所以子弹生成位置不能为绝对位置,而是相对位置。但这里有个问题出现了,那就是子弹发射出去的时候为绝对位置(如果为相对位置的话,发射出去的子弹会随着枪口位置变化,发生变化。错误演示如下图)

unity fps计算规则 unity fps教程_c#


为了解决以上的问题,一个解决办法就是,在枪口附近新建一个空物体集(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);//销毁子弹物体
        }
    }
}

三,脚本的使用方法

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

unity fps计算规则 unity fps教程_unity3d_02

四,最终效果

unity fps计算规则 unity fps教程_unity_03