Files
2026-03-04 09:37:33 +08:00

145 lines
3.6 KiB
C#

using System.Collections.Generic;
using UnityEngine;
namespace DarkTonic.MasterAudio
{
[AddComponentMenu("Dark Tonic/Master Audio/Footstep Sounds")]
public class FootstepSounds : MonoBehaviour
{
public enum FootstepTriggerMode
{
None = 0,
OnCollision = 1,
OnTriggerEnter = 2,
OnCollision2D = 3,
OnTriggerEnter2D = 4
}
public MasterAudio.SoundSpawnLocationMode soundSpawnMode = MasterAudio.SoundSpawnLocationMode.AttachToCaller;
public FootstepTriggerMode footstepEvent;
public List<FootstepGroup> footstepGroups = new List<FootstepGroup>();
public EventSounds.RetriggerLimMode retriggerLimitMode;
public int limitPerXFrm;
public float limitPerXSec;
public int triggeredLastFrame = -100;
public float triggeredLastTime = -100f;
private Transform _trans;
private Transform Trans
{
get
{
if (_trans != null)
{
return _trans;
}
_trans = base.transform;
return _trans;
}
}
private void OnTriggerEnter(Collider other)
{
if (footstepEvent == FootstepTriggerMode.OnTriggerEnter)
{
PlaySoundsIfMatch(other.gameObject);
}
}
private void OnCollisionEnter(Collision collision)
{
if (footstepEvent == FootstepTriggerMode.OnCollision)
{
PlaySoundsIfMatch(collision.gameObject);
}
}
private bool CheckForRetriggerLimit()
{
switch (retriggerLimitMode)
{
case EventSounds.RetriggerLimMode.FrameBased:
if (triggeredLastFrame > 0 && AudioUtil.FrameCount - triggeredLastFrame < limitPerXFrm)
{
return false;
}
break;
case EventSounds.RetriggerLimMode.TimeBased:
if (triggeredLastTime > 0f && AudioUtil.Time - triggeredLastTime < limitPerXSec)
{
return false;
}
break;
}
return true;
}
private void PlaySoundsIfMatch(GameObject go)
{
if (!CheckForRetriggerLimit())
{
return;
}
switch (retriggerLimitMode)
{
case EventSounds.RetriggerLimMode.FrameBased:
triggeredLastFrame = AudioUtil.FrameCount;
break;
case EventSounds.RetriggerLimMode.TimeBased:
triggeredLastTime = AudioUtil.Time;
break;
}
for (int i = 0; i < footstepGroups.Count; i++)
{
FootstepGroup footstepGroup = footstepGroups[i];
if ((footstepGroup.useLayerFilter && !footstepGroup.matchingLayers.Contains(go.layer)) || (footstepGroup.useTagFilter && !footstepGroup.matchingTags.Contains(go.tag)))
{
continue;
}
switch (footstepGroup.playSoundType)
{
case EventSounds.PlaySoundType.InvokeParameterCommand:
if (!(footstepGroup.parameterCommandName == "[None]"))
{
MasterAudio.InvokeParameterCommand(footstepGroup.parameterCommandName, Trans);
}
break;
case EventSounds.PlaySoundType.PlaySoundGroup:
if (!(footstepGroup.soundType == "[None]"))
{
float volume = footstepGroup.volume;
float? pitch = footstepGroup.pitch;
if (!footstepGroup.useFixedPitch)
{
pitch = null;
}
string variationName = null;
if (footstepGroup.variationType == EventSounds.VariationType.PlaySpecific)
{
variationName = footstepGroup.variationName;
}
switch (soundSpawnMode)
{
case MasterAudio.SoundSpawnLocationMode.CallerLocation:
MasterAudio.PlaySound3DAtTransformAndForget(footstepGroup.soundType, Trans, volume, pitch, footstepGroup.delaySound, variationName);
break;
case MasterAudio.SoundSpawnLocationMode.AttachToCaller:
MasterAudio.PlaySound3DFollowTransformAndForget(footstepGroup.soundType, Trans, volume, pitch, footstepGroup.delaySound, variationName);
break;
}
}
break;
}
}
}
}
}