文章目录
- 本节最终效果
- 前言
- 素材
- 人物移动音效
- 枪口火焰和开火音效
- 枪口灯光
- 弹孔和火花
- 添加武器随镜头手臂摇摆效果
- 源码
- 完结
本节最终效果
前言
本节主要实现添加音效,和一些特效、武器摆动调整。
素材
素材,为了方便我直接用了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);
}
}
配置参数,可以配置到自己喜欢的感觉
效果,可以看到视角移动枪会有跟着小幅度摆动,很灵动
源码
源码在最后一节
完结
赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注
,以便我第一时间收到反馈,你的每一次支持
都是我不断创作的最大动力。当然如果你发现了文章中存在错误
或者有更好的解决方法
,也欢迎评论私信告诉我哦!
好了,我是向宇
,https://xiangyu.blog.csdn.net
一位在小公司默默奋斗的开发者,出于兴趣爱好,于是最近才开始自习unity。如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我可能也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~