[Unity学习笔记:FPS游戏制作] 发射子弹————(2021.6.20学习笔记)
Posted 曾胖神父
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Unity学习笔记:FPS游戏制作] 发射子弹————(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);//销毁子弹物体
}
}
}
三,脚本的使用方法
在枪口物体下新建物体集,并将物体集和子弹预制体,玩家摄像头绑定在脚本上(如下图)。
四,最终效果
以上是关于[Unity学习笔记:FPS游戏制作] 发射子弹————(2021.6.20学习笔记)的主要内容,如果未能解决你的问题,请参考以下文章
Ruby‘s Adventrue游戏制作笔记Unity角色攻击——发射子弹
Ruby‘s Adventrue游戏制作笔记Unity角色攻击——发射子弹
Ruby‘s Adventrue游戏制作笔记Unity角色攻击——发射子弹
Ruby‘s Adventrue游戏制作笔记(十六)Unity子弹数量及其UI