前言
FPS游戏之角色移动的脚步声
FootstepAudioData 脚本起到了保存人物的脚步声的作用,使得人物在行进过程中伴随着产生已保存的能够增强体验感的脚步声。
PlayerFootstepListener 在脚本中会判断角色发出声音的必备条件,当角色移动或者发生较大幅度动作的时候发出脚步的声音,使用Physic API检测角色是否有移动,同时用Physic API来实现角色踩踏位置的对应材质的声音。
一、存放脚步声音
创建一个FootstepAudioData脚本存放,并用一个列表存放声音
CreateAssetMenu(menuName = "FPS/Footstep Audio Data")]
public class FootstepAudioData : ScriptableObject
{
public List<FootstepAudio> FootstepAudios = new List<FootstepAudio>();
}
[System.Serializable]
public class FootstepAudio
{
public string Tag;
public List<AudioClip> AudioClips = new List<AudioClip>();
public float Delay;
}
并在物体上设置好对应的组件
二、设置脚步声
1.角色发出声音的必备条件
角色移动或者发生较大幅度动作的时候发出声音
2.如何检测角色是否有移动
用Physic API检测
if (characterController.velocity.normalized.magnitude >= 0.1f)
{
nextPlayTime += Time.deltaTime;
if (characterController.velocity.magnitude >= 4)
{
characterState = State.Sprinting;
}
bool tmp_IsHit = Physics.Linecast(footstepTransform.position,
footstepTransform.position +
Vector3.down * (characterController.height / 2 + characterController.skinWidth-characterController.center.y),
out RaycastHit tmp_HitInfo,
LayerMask);
3.如何实现角色踩踏位置的对应材质的声音
用Physic API检测
if (tmp_IsHit)
{
//TODO:检测类型
foreach (var tmp_AudioElement in FootstepAudioData.FootstepAudios)
{
if (tmp_HitInfo.collider.CompareTag(tmp_AudioElement.Tag))
{
if (nextPlayTime >= tmp_AudioElement.Delay)
{
//TODO:播放移动声音
int tmp_AudioCount = tmp_AudioElement.AudioClips.Count;
int tmp_AudioIndex = UnityEngine.Random.Range(0, tmp_AudioCount);
AudioClip tmp_FootstepAudioClip = tmp_AudioElement.AudioClips[tmp_AudioIndex];
FootstepAudioSource.clip = tmp_FootstepAudioClip;
FootstepAudioSource.Play();
nextPlayTime = 0;
break;
}
}
}
}
三、修复下蹲移动时没有脚步声音
选中一个物体,点击面板中的layer
然后点击addlayer 点击player如下图
然后将layer mask设置为default