1
0

PlayAndFade.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. using MelonLoader;
  2. using Il2CppInterop.Runtime.Injection;
  3. using Il2Cpp;
  4. using UnityEngine;
  5. using UnityEngine.Rendering;
  6. using Il2CppInterop.Runtime.Attributes;
  7. using System.Collections;
  8. namespace AudioMgr
  9. {
  10. public class PlayAndFade
  11. {
  12. Shot _assignedShot;
  13. Clip _assignedClip;
  14. double _fadeDuration;
  15. double _clipDuration;
  16. double _startTime;
  17. double _stopTime;
  18. double _timeElapsed;
  19. float _startVolume;
  20. object _timerLoop;
  21. bool _isPlaying;
  22. public PlayAndFade(Shot targetShot, Clip audioClip, double fadeDuration)
  23. {
  24. _assignedShot = targetShot;
  25. _assignedClip = audioClip;
  26. _fadeDuration = fadeDuration;
  27. _startTime = AudioSettings.dspTime + 0.5;
  28. _assignedShot.AssignClip(_assignedClip);
  29. _assignedShot._audioSource.PlayScheduled(_startTime);
  30. _clipDuration = _assignedClip.clipLength;
  31. _startVolume = _assignedShot._audioSource.volume;
  32. _stopTime = _startTime + _clipDuration - _fadeDuration;
  33. _isPlaying = true;
  34. _timerLoop = MelonCoroutines.Start(TimerLoop());
  35. }
  36. [HideFromIl2Cpp]
  37. private IEnumerator TimerLoop()
  38. {
  39. float time = 0;
  40. while (_isPlaying)
  41. {
  42. _timeElapsed = AudioSettings.dspTime - _startTime;
  43. if (_timeElapsed < _stopTime)
  44. {
  45. yield return null;
  46. }
  47. else if (_timeElapsed > _stopTime)
  48. {
  49. _assignedShot._audioSource.volume = Mathf.Lerp(_startVolume, 0, time / (float)_fadeDuration);
  50. time += Time.deltaTime;
  51. }
  52. if(_assignedShot._audioSource.volume <= 0)
  53. {
  54. _assignedShot.Stop();
  55. _isPlaying = false;
  56. }
  57. }
  58. yield return null;
  59. }
  60. }
  61. }