SFX_MaterialAdder.cs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using System.Collections.Generic;
  2. using UnityEngine;
  3. // ReSharper disable once CheckNamespace
  4. namespace QFX.SFX
  5. {
  6. public class SFX_MaterialAdder : SFX_ControlledObject
  7. {
  8. public Material Material;
  9. public float LifeTime;
  10. public GameObject[] Targets;
  11. private readonly Dictionary<Renderer, Material[]> _rendToMaterialsMap = new Dictionary<Renderer, Material[]>();
  12. private bool _isMaterialAdded;
  13. private float _addedTime;
  14. public override void Run()
  15. {
  16. base.Run();
  17. _addedTime = Time.time;
  18. if (_isMaterialAdded)
  19. return;
  20. if (Targets != null && Targets.Length > 0)
  21. {
  22. foreach (var target in Targets)
  23. {
  24. GetMaterialsAndFillCollection(target);
  25. }
  26. }
  27. else
  28. {
  29. GetMaterialsAndFillCollection(gameObject);
  30. }
  31. _isMaterialAdded = true;
  32. SFX_InvokeUtil.RunLater(this, Stop, LifeTime);
  33. }
  34. public override void Stop()
  35. {
  36. base.Stop();
  37. var timeDiff = Time.time - _addedTime;
  38. if (timeDiff < LifeTime)
  39. {
  40. //call again
  41. SFX_InvokeUtil.RunLater(this, Stop, LifeTime - timeDiff);
  42. return;
  43. }
  44. SFX_MaterialUtil.ReplaceMaterial(_rendToMaterialsMap);
  45. _rendToMaterialsMap.Clear();
  46. _isMaterialAdded = false;
  47. }
  48. private void GetMaterialsAndFillCollection(GameObject targetGo)
  49. {
  50. var rendToMaterials = SFX_MaterialUtil.GetOriginalMaterials(targetGo);
  51. foreach (var rToMat in rendToMaterials)
  52. _rendToMaterialsMap[rToMat.Key] = rToMat.Value;
  53. SFX_MaterialUtil.AddMaterial(targetGo, Material);
  54. }
  55. }
  56. }