本节最终效果
前言
本节主要实现添加音效,和一些特效、武器摆动调整。
素材
素材,为了方便我直接用了unity免费的音效输出,后面还会使用他里面的一些特效
https://assetstore.unity.com/packages/templates/systems/low-poly-shooter-pack-free-sample-144839
人物移动音效
修改PlayerController
MoveSound(); //移动音效 public void MoveSound() { // 如果在地面上并且移动长度大于0.9 if (isGround && moveDirection.sqrMagnitude > 0.9f) { audioSource.clip = isRun ? runingSound : walkingSound; if (!audioSource.isPlaying) audioSource.Play(); } else { if (audioSource.isPlaying) audioSource.Pause(); } }
配置参数
测试效果,截屏是没声音的,这里就不演示了
枪口火焰和开火音效
修改WeaponController
[Header("特效")] public ParticleSystem muzzleFlash;//枪口火焰特效 [Header("声音")] private AudioSource audioSource; public AudioClip fireSound; private void Start() { currentBullects = bulletsMag; audioSource = GetComponent<AudioSource>(); } // 射击 public void GunFire() { //。。。 PlayerShootSound(); muzzleFlash.Play();//枪口火焰 } //播放射击音效 public void PlayerShootSound() { audioSource.clip = fireSound; audioSource.Play(); }
配置参数,在枪口处放置特效
火焰粒子特效我稍微改了一下参数
效果
枪口灯光
灯光介绍:零基础带你从小白到超神14——灯光、摄像机、天空盒、镜子的制作
在枪口处加个点光源,配置参数,并默认关闭灯光
修改WeaponController
public Light muzzleFlashLight;//枪口火焰灯光 void Update() { if (Input.GetMouseButton(0) && currentBullects > 0) { GunFire(); } else { muzzleFlashLight.enabled = false; } } // 射击 public void GunFire() { //... muzzleFlashLight.enabled = true;//枪口灯光 }
效果
弹孔和火花
子弹和火花为了省事,我直接P_IMP_Concrete的特效分出来
修改WeaponController
public GameObject hitParticle;//子弹击中火花粒子特效 public GameObject bullectHole;//弹孔 // 射击 public void GunFire() { if (fireTimer < fireRate || currentBullects <= 0) return; isFire = true; 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 + "被击中了"); GameObject hitParticleEffect = Instantiate(hitParticle, hit.point, Quaternion.identity);//实例出击中特效 GameObject bullectHoleEffect=Instantiate (bullectHole, hit.point,Quaternion.FromToRotation(Vector3.up,hit.normal));//实例出弹孔号 Destroy(hitParticleEffect, 1f); Destroy(bullectHoleEffect, 3f); } currentBullects--; fireTimer = 0; PlayerShootSound(); }
配置参数
新增ImpactScript 脚本,用于控制弹道击中表面时的效果,播放击中音效,并在一定时间后销毁
public class ImpactScript : MonoBehaviour { [Header("持续时间")] public float despawnTimer = 10.0f; [Header("音效")] public AudioClip[] impactSounds; public AudioSource audioSource; private void Start() { // 启动销毁计时器 StartCoroutine(DespawnTimer()); // 从数组中随机选择一个音效剪辑 audioSource.clip = impactSounds[Random.Range(0, impactSounds.Length)]; // 播放随机音效 audioSource.Play(); } private IEnumerator DespawnTimer() { // 等待指定时间 yield return new WaitForSeconds(despawnTimer); // 销毁撞击效果物体 Destroy(gameObject); } }
挂载配置参数
效果
添加武器随镜头手臂摇摆效果
新增
// 武器摇摆 public class WeaponSway : MonoBehaviour { /* 摇摆的参数 */ public float amount; // 摇摆幅度 public float smoothAmount; // 平滑值 public float maxAmount; // 最大摇摆幅度 private Vector3 originalPosition; // 初始位置 void Start() { // 自身位置(相对于父级物体变换得位置) originalPosition = transform.localPosition; } void Update() { // 设置武器手臂模型位置的值,(鼠标反转) float movementX = -Input.GetAxis("Mouse X") * amount; float movementY = -Input.GetAxis("Mouse Y") * amount; // 限制摇摆范围 movementX = Mathf.Clamp(movementX, -maxAmount, maxAmount); movementY = Mathf.Clamp(movementY, -maxAmount, maxAmount); Vector3 finalPosition = new Vector3(movementX, movementY, 0); // 手柄位置变换 transform.localPosition = Vector3.Lerp(transform.localPosition, finalPosition + originalPosition, Time.deltaTime * smoothAmount); } }
配置参数,可以配置到自己喜欢的感觉
效果,可以看到视角移动枪会有跟着小幅度摆动,很灵动
源码
源码在最后一节