Unity3D FPS游戏开发:实现武器发射子弹功能
创作时间:
作者:
@小白创作中心
Unity3D FPS游戏开发:实现武器发射子弹功能
引用
CSDN
1.
https://blog.csdn.net/qq_40306845/article/details/143279309
本教程将详细介绍如何在Unity3D中实现一个简单的第一人称射击(FPS)游戏中的武器发射子弹功能。通过本教程,你将学会如何创建子弹模型、编写子弹控制器脚本以及实现连续发射子弹的逻辑。
子弹
子弹发射位置
在Weapon01下面新建一个GameObject用来设置发射子弹的位置,调整Position放在枪口位置。
子弹模型
子弹模型
在下面路径找到子弹模型,然后拖入到项目中,并右键Prefab-unpack(为了避免影响到原本素材中的预制体)。
子弹材质
然后子弹模型本身是没有材质的,和我们之前拖入枪模型的时候一样,找到下面路径的材质,给它附上。
子弹完整代码
思路
思路非常简单,子弹生成后,应该朝着前方移动一定距离,后销毁。
代码
新建C#代码,BulletController,挂载在Bullet01上。设置两个参数,移动速度和移动距离。子弹的移动和物理相关,所以使用FixedUpdate进行更新。
public class BulletController : MonoBehaviour
{
[Header("子弹数值")]
public float bulletSpeed=1000;// 移动速度
public float range = 10000;// 移动距离
private void FixedUpdate()
{
transform.position+=transform.forward *bulletSpeed * Time.fixedDeltaTime;// 每次移动位移
range -= bulletSpeed * Time.fixedDeltaTime;// 每次移动范围减少
if (range <= 0)
{
Destroy(this.gameObject);// 抵达范围终点,销毁
}
}
}
子弹预制体
把子弹命名为Bullet01,然后拖拽到文件夹中生成预制体。默认子弹模型的大小还挺小的,记得缩放Scale到自己能看到的大小,我设置了0.5倍。
发射子弹代码
思路
参数
我们需要实现发射子弹,并且按下左键连续发射子弹,而且还有弹夹数量。会需要如下的参数,发射子弹得有发射位置和子弹的预制体;连续发射子弹得判断发射状态和子弹的间隔时间;弹夹数量得有弹夹总数和当前子弹数。
[Header("子弹数值")]
public Transform shootPoint;// 子弹发射位置
public GameObject bullet;// 子弹预制体
public float shootInterval = 1;// 子弹间隔时间
private bool isFire;// 发射状态
public int bulletNum = 100;// 弹夹
public int currentBulletNum;// 当前子弹的数量
功能
按下左键后,开启发射子弹;松开左键后,停止发射子弹。
private void OpenFire()
{
if (Input.GetMouseButtonDown(0))
{
isFire = true;
StartCoroutine("Shoot");
}
if (Input.GetMouseButtonUp(0))
{
isFire = false;
StopCoroutine("Shoot");
}
}
发射子弹就是创建子弹,每个子弹生产间隔一段时间。弹夹,产生一个子弹将数量减少,子弹数量为了0的时候将不生产。可以用和上一篇武器瞄准的协程方法,只不过间隔不是帧数而是时间。
IEnumerator Shoot()
{
while (isFire)
{
if (currentBulletNum >0)
{
GameObject newBullet = Instantiate(bullet, shootPoint);
currentBulletNum--;
}
yield return new WaitForSeconds(shootInterval);// 间隔一定时间再发射下一个子弹
}
}
完整代码
WeaponController更新后的完整代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WeaponController : MonoBehaviour
{
[Header("武器数值")]
public Vector3 defaultPosition;// 默认位置
public Vector3 centerPosition;// 中心位置
public float positionLerpRatio = 0.5f;// 线性插值参数
[Header("子弹数值")]
public Transform shootPoint;// 子弹发射位置
public GameObject bullet;// 子弹预制体
public float shootInterval = 1;// 子弹间隔时间
private bool isFire;// 发射状态
public int bulletNum = 100;// 弹夹
public int currentBulletNum;// 当前子弹的数量
void Start()
{
// 自己在Unity中挪位置试出来的
defaultPosition = new Vector3(0.4F, -0.6F, 1.15F);
centerPosition = new Vector3(0F, -0.6F, 0.807F);
currentBulletNum = bulletNum;
}
void Update()
{
ChangePosition();
OpenFire();
}
private void OpenFire()
{
if (Input.GetMouseButtonDown(0))
{
isFire = true;
StartCoroutine("Shoot");
}
if (Input.GetMouseButtonUp(0))
{
isFire = false;
StopCoroutine("Shoot");
}
}
IEnumerator Shoot()
{
while (isFire)
{
if (currentBulletNum >0)
{
GameObject newBullet = Instantiate(bullet, shootPoint);
currentBulletNum--;
}
yield return new WaitForSeconds(shootInterval);
}
}
private void ChangePosition()
{
// 按下左键
if (Input.GetMouseButtonDown(1))
{
StopCoroutine("ToDefault");
StartCoroutine("ToCenter");
}
// 松开左键
if (Input.GetMouseButtonUp(1))
{
StopCoroutine("ToCenter");
StartCoroutine("ToDefault");
}
}
IEnumerator ToCenter() {
while (transform.localPosition!=centerPosition)
{
transform.localPosition = Vector3.Lerp(transform.localPosition, centerPosition, positionLerpRatio);
yield return null;// 等待一帧
}
}
IEnumerator ToDefault()
{
while (transform.localPosition != defaultPosition)
{
transform.localPosition = Vector3.Lerp(transform.localPosition, defaultPosition, positionLerpRatio);
yield return null;// 等待一帧
}
}
}
效果
(此处可以添加实际运行效果的截图或视频,以增强文章的直观性和说服力)
热门推荐
汉字奇闻:探秘你不知道的汉字故事
汉字奇闻:探秘你不知道的汉字故事
卖房所需证件齐全,交易更无忧
GFLOPs、FLOPs与FLOPS:三者的区别与联系,如何影响AI性能
如何提升个人的领导力
轿车和SUV有什么区别?全方位对比分析
部分飞机高铁换乘地铁需二次安检,为何仍无法实现安检互认?
5公里极速燃脂训练计划,5公里跑步怎么能坚持跑完
电影哲学:银幕背后的深度思考
压力性胃痛丨一紧张就胃痛?严重恐作呕?医生解构成因/症状/改善方法
如何面对充满“不确定性”的人生?丨7个方法让你更加从容
铁矿回转窑的工作原理、技术特点及应用优势
《星际争霸:重制版》三大种族背景及战术解析
忆南宁丨百年水街,不可替代的邕城记忆
揭秘 刘红云董氏奇穴止咳三针
熊猫保护法:饿了吃熊猫,这个行为真的犯法吗?
酸奶和什么一起吃能排宿便
PPT逻辑结构:从基础概念到实际应用
什么是韵?诗词写作中的撞韵、挤韵、连韵、落韵是怎么回事?
俄罗斯田径女神波琳娜走红,长相酷似邓紫棋,成为全民焦点
如何评估全世界黄金的储量情况?这种储量情况对市场有何影响?
滤波电容器受周围温度的影响大吗
嗓子干痒怎么办?5个实用解决方案帮你快速缓解不适
《大秦赋》中的樊于期,为何最后叛逃还助荆轲刺秦?
樊於期叛秦之谜:明知逃至燕国亦难逃一死,缘何仍选择背叛?
提升关键词排名有哪些方法?关键词排名提升技巧详解
揭秘《原神》开服策略:如何合理规划和最大化游戏体验
古代帝王陵寝风水布局探秘
股份公司股权如何继承?一文详解继承、注销与转让要点
怎么判断湿疹是由奶粉引起的?吃奶粉过敏的原因及应对方法