DebrisFader.cs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using UnityEngine;
  2. namespace HQFPSWeapons
  3. {
  4. public class DebrisFader : MonoBehaviour
  5. {
  6. [SerializeField]
  7. private bool m_StartAutomatically = true;
  8. [SerializeField]
  9. [Clamp(0.01f, 30f)]
  10. private float m_FadeDuration = 10f;
  11. [SerializeField]
  12. private Material m_FadeMaterial = null;
  13. [SerializeField]
  14. private AnimationCurve m_FadeCurve = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f);
  15. private float m_DestroyTime;
  16. private MeshRenderer[] m_Renderers;
  17. private Material m_SharedMaterial;
  18. private bool m_StartedFading;
  19. public void StartFading()
  20. {
  21. m_DestroyTime = Time.time + m_FadeDuration;
  22. m_StartedFading = true;
  23. }
  24. private void Awake()
  25. {
  26. m_Renderers = GetComponentsInChildren<MeshRenderer>(true);
  27. if(m_Renderers.Length > 0)
  28. {
  29. m_SharedMaterial = new Material(m_FadeMaterial);
  30. m_SharedMaterial.name = m_FadeMaterial.name + " - Clone";
  31. for(int i = 0;i < m_Renderers.Length;i ++)
  32. m_Renderers[i].sharedMaterial = m_SharedMaterial;
  33. }
  34. #if UNITY_EDITOR
  35. UnityEditor.MaterialEditor.ApplyMaterialPropertyDrawers(m_SharedMaterial);
  36. #endif
  37. }
  38. private void Start()
  39. {
  40. if(m_StartAutomatically)
  41. StartFading();
  42. }
  43. private void Update()
  44. {
  45. if(!m_StartedFading)
  46. return;
  47. if(m_Renderers.Length == 0 || Time.time >= m_DestroyTime)
  48. {
  49. Destroy(gameObject);
  50. return;
  51. }
  52. float alpha = 1f - (m_DestroyTime - Time.time) / m_FadeDuration;
  53. m_SharedMaterial.color = new Color(m_SharedMaterial.color.r, m_SharedMaterial.color.g, m_SharedMaterial.color.b, m_FadeCurve.Evaluate(alpha));
  54. }
  55. }
  56. }