本节最终效果
前言
本节就先实现添加武器,一些射击基本功能实现。
绑定人物手臂和武器
这里我找了一个人的手臂和武器动画素材
将他拖入到为摄像机的子集,然后调整到合适位置即可
你会发现手臂有一部分没法正常显示,那是因为默认摄像机只会投射大于0.3外的范围,所以我们需要把摄像机投射最小范围尽量改小,这里设置为0.01即可
枪准心
这里就随便画一个UI即可,放在0位置,指示准心,效果如下
射线发射子弹
新增WeaponController
public class WeaponController : MonoBehaviour { public Transform shooterPoint; // 射击的位置 public int bulletsMag = 30; // 一个弹匣子弹数量 public int range = 100; // 武器的射程 public int bulletLeft = 300; // 备弹 void Update() { if (Input.GetMouseButton(0)) { GunFire(); } } ///<summary> /// 射击 ///</summary> public void GunFire() { RaycastHit hit; Vector3 shootDirection = shooterPoint.forward; // 射击方向(向前) //场景显示红线,方便调试查看 Debug.DrawRay(shooterPoint.position, shooterPoint.position + shootDirection * range, Color.red); if (Physics.Raycast(shooterPoint.position, shootDirection, out hit, range)) // 判断射击 { Debug.Log(hit.transform.name + "被击中了"); } } }
挂载脚本,ShootPoint记得一定要放在摄像机0,0,0位置
效果
控制射速
public float fireRate = 0.1f;//射速 private float fireTimer;//计时器 void Update() { if (Input.GetMouseButton(0) && currentBullects > 0) { GunFire(); } //定时器 if (fireTimer < fireRate) { fireTimer += Time.deltaTime; } } // 射击 public void GunFire() { if (fireTimer < fireRate) return; RaycastHit hit; Vector3 shootDirection = shooterPoint.forward; // 射击方向(向前) //场景显示红线,方便调试查看 Debug.DrawRay(shooterPoint.position, shooterPoint.position + shootDirection * range, Color.red); if (Physics.Raycast(shooterPoint.position, shootDirection, out hit, range)) // 判断射击 { Debug.Log(hit.transform.name + "被击中了"); } fireTimer = 0; }
效果,每过0.1秒射击一次
打空一个弹夹
public int currentBullets; // 当前子弹数量 private void Start() { currentBullects = bulletsMag; } public void GunFire() { if (fireTimer < fireRate || currentBullects <= 0) return; //。。。 currentBullects--; }
显示子弹数
绘制简单的UI
public TextMeshProUGUI AmmoTextUI;//子弹UI void Update() { //。。。 UpdateAmmoUI(); } //更新子弹UI private void UpdateAmmoUI() { AmmoTextUI.text = currentBullects + "/" + bulletLeft; }
效果
换弹
if (Input.GetKeyDown(KeyCode.R)) { Reload(); } //换弹 public void Reload() { if (bulletLeft <= 0) return; //计算需要填装的子弹数=1个弹匣子弹数-当前弹匣子弹数 int bullectToLoad = bulletsMag - currentBullects; //计算备弹需扣除子弹数 int bullectToReduce = (bulletLeft >= bullectToLoad) ? bullectToLoad : bulletLeft; bulletLeft -= bullectToReduce;//减少备弹数 currentBullects += bullectToReduce;//当前子弹数增加 }
效果
源码
源码在最后一节