160 lines
5.5 KiB
C#
160 lines
5.5 KiB
C#
|
|
/*! \cond PRIVATE */
|
||
|
|
using System.Collections.Generic;
|
||
|
|
using UnityEngine;
|
||
|
|
|
||
|
|
// ReSharper disable once CheckNamespace
|
||
|
|
namespace DarkTonic.MasterAudio {
|
||
|
|
[AddComponentMenu("Dark Tonic/Master Audio/Footstep Sounds")]
|
||
|
|
// ReSharper disable once CheckNamespace
|
||
|
|
public class FootstepSounds : MonoBehaviour {
|
||
|
|
// ReSharper disable InconsistentNaming
|
||
|
|
public MasterAudio.SoundSpawnLocationMode soundSpawnMode = MasterAudio.SoundSpawnLocationMode.AttachToCaller;
|
||
|
|
public FootstepTriggerMode footstepEvent = FootstepTriggerMode.None;
|
||
|
|
|
||
|
|
public List<FootstepGroup> footstepGroups = new List<FootstepGroup>();
|
||
|
|
|
||
|
|
// retrigger limit
|
||
|
|
public EventSounds.RetriggerLimMode retriggerLimitMode = EventSounds.RetriggerLimMode.None;
|
||
|
|
public int limitPerXFrm = 0;
|
||
|
|
public float limitPerXSec = 0f;
|
||
|
|
public int triggeredLastFrame = -100;
|
||
|
|
public float triggeredLastTime = -100f;
|
||
|
|
// ReSharper restore InconsistentNaming
|
||
|
|
|
||
|
|
private Transform _trans;
|
||
|
|
|
||
|
|
public enum FootstepTriggerMode {
|
||
|
|
None,
|
||
|
|
OnCollision,
|
||
|
|
OnTriggerEnter,
|
||
|
|
OnCollision2D,
|
||
|
|
OnTriggerEnter2D
|
||
|
|
}
|
||
|
|
|
||
|
|
#if PHY3D_ENABLED
|
||
|
|
// ReSharper disable once UnusedMember.Local
|
||
|
|
private void OnTriggerEnter(Collider other) {
|
||
|
|
if (footstepEvent != FootstepTriggerMode.OnTriggerEnter) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
PlaySoundsIfMatch(other.gameObject);
|
||
|
|
}
|
||
|
|
|
||
|
|
// ReSharper disable once UnusedMember.Local
|
||
|
|
private void OnCollisionEnter(Collision collision) {
|
||
|
|
if (footstepEvent != FootstepTriggerMode.OnCollision) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
PlaySoundsIfMatch(collision.gameObject);
|
||
|
|
}
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#if PHY2D_ENABLED
|
||
|
|
// ReSharper disable once UnusedMember.Local
|
||
|
|
private void OnCollisionEnter2D(Collision2D collision) {
|
||
|
|
if (footstepEvent != FootstepTriggerMode.OnCollision2D) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
PlaySoundsIfMatch(collision.gameObject);
|
||
|
|
}
|
||
|
|
|
||
|
|
// ReSharper disable once UnusedMember.Local
|
||
|
|
private void OnTriggerEnter2D(Collider2D other) {
|
||
|
|
if (footstepEvent != FootstepTriggerMode.OnTriggerEnter2D) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
PlaySoundsIfMatch(other.gameObject);
|
||
|
|
}
|
||
|
|
#endif
|
||
|
|
|
||
|
|
private bool CheckForRetriggerLimit() {
|
||
|
|
// check for limiting restraints
|
||
|
|
switch (retriggerLimitMode) {
|
||
|
|
case EventSounds.RetriggerLimMode.FrameBased:
|
||
|
|
if (triggeredLastFrame > 0 && AudioUtil.FrameCount - triggeredLastFrame < limitPerXFrm) {
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case EventSounds.RetriggerLimMode.TimeBased:
|
||
|
|
if (triggeredLastTime > 0 && AudioUtil.Time - triggeredLastTime < limitPerXSec) {
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
private void PlaySoundsIfMatch(GameObject go) {
|
||
|
|
if (!CheckForRetriggerLimit()) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
// set the last triggered time or frame
|
||
|
|
switch (retriggerLimitMode) {
|
||
|
|
case EventSounds.RetriggerLimMode.FrameBased:
|
||
|
|
triggeredLastFrame = AudioUtil.FrameCount;
|
||
|
|
break;
|
||
|
|
case EventSounds.RetriggerLimMode.TimeBased:
|
||
|
|
triggeredLastTime = AudioUtil.Time;
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
// ReSharper disable once ForCanBeConvertedToForeach
|
||
|
|
for (var i = 0; i < footstepGroups.Count; i++) {
|
||
|
|
var aGroup = footstepGroups[i];
|
||
|
|
|
||
|
|
// check filters for matches if turned on
|
||
|
|
if (aGroup.useLayerFilter && !aGroup.matchingLayers.Contains(go.layer)) {
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (aGroup.useTagFilter && !aGroup.matchingTags.Contains(go.tag)) {
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
|
||
|
|
var volume = aGroup.volume;
|
||
|
|
float? pitch = aGroup.pitch;
|
||
|
|
if (!aGroup.useFixedPitch) {
|
||
|
|
pitch = null;
|
||
|
|
}
|
||
|
|
|
||
|
|
string variationName = null;
|
||
|
|
if (aGroup.variationType == EventSounds.VariationType.PlaySpecific) {
|
||
|
|
variationName = aGroup.variationName;
|
||
|
|
}
|
||
|
|
|
||
|
|
switch (soundSpawnMode) {
|
||
|
|
case MasterAudio.SoundSpawnLocationMode.CallerLocation:
|
||
|
|
MasterAudio.PlaySound3DAtTransformAndForget(aGroup.soundType, Trans, volume, pitch, aGroup.delaySound,
|
||
|
|
variationName);
|
||
|
|
break;
|
||
|
|
case MasterAudio.SoundSpawnLocationMode.AttachToCaller:
|
||
|
|
MasterAudio.PlaySound3DFollowTransformAndForget(aGroup.soundType, Trans, volume, pitch, aGroup.delaySound,
|
||
|
|
variationName);
|
||
|
|
break;
|
||
|
|
case MasterAudio.SoundSpawnLocationMode.MasterAudioLocation:
|
||
|
|
MasterAudio.PlaySoundAndForget(aGroup.soundType, volume, pitch, aGroup.delaySound, variationName);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private Transform Trans {
|
||
|
|
get {
|
||
|
|
if (_trans != null) {
|
||
|
|
return _trans;
|
||
|
|
}
|
||
|
|
|
||
|
|
_trans = transform;
|
||
|
|
|
||
|
|
return _trans;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
/*! \endcond */
|