BFX_ShaderProperies.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. using UnityEngine;
  2. using System.Collections;
  3. using System;
  4. public class BFX_ShaderProperies : MonoBehaviour {
  5. public BFX_BloodSettings BloodSettings;
  6. public AnimationCurve FloatCurve = AnimationCurve.EaseInOut(0, 0, 1, 1);
  7. public float GraphTimeMultiplier = 1, GraphIntensityMultiplier = 1;
  8. public float TimeDelay = 0;
  9. private bool canUpdate;
  10. bool isFrized;
  11. private float startTime;
  12. private int cutoutPropertyID;
  13. int forwardDirPropertyID;
  14. float timeLapsed;
  15. private MaterialPropertyBlock props;
  16. private Renderer rend;
  17. public event Action OnAnimationFinished;
  18. private void Awake()
  19. {
  20. props = new MaterialPropertyBlock();
  21. rend = GetComponent<Renderer>();
  22. cutoutPropertyID = Shader.PropertyToID("_Cutout");
  23. forwardDirPropertyID = Shader.PropertyToID("_DecalForwardDir");
  24. OnEnable();
  25. }
  26. private void OnEnable()
  27. {
  28. startTime = Time.time + TimeDelay;
  29. canUpdate = true;
  30. GetComponent<Renderer>().enabled = true;
  31. rend.GetPropertyBlock(props);
  32. var eval = FloatCurve.Evaluate(0) * GraphIntensityMultiplier;
  33. props.SetFloat(cutoutPropertyID, eval);
  34. props.SetVector(forwardDirPropertyID, transform.up);
  35. rend.SetPropertyBlock(props);
  36. }
  37. private void OnDisable()
  38. {
  39. rend.GetPropertyBlock(props);
  40. var eval = FloatCurve.Evaluate(0) * GraphIntensityMultiplier;
  41. props.SetFloat(cutoutPropertyID, eval);
  42. rend.SetPropertyBlock(props);
  43. timeLapsed = 0;
  44. }
  45. private void Update()
  46. {
  47. if (!canUpdate) return;
  48. rend.GetPropertyBlock(props);
  49. var deltaTime = BloodSettings == null ? Time.deltaTime : Time.deltaTime * BloodSettings.AnimationSpeed;
  50. if (BloodSettings != null && BloodSettings.FreezeDecalDisappearance && (timeLapsed / GraphTimeMultiplier) > 0.3f) { }
  51. else timeLapsed += deltaTime;
  52. var eval = FloatCurve.Evaluate(timeLapsed / GraphTimeMultiplier) * GraphIntensityMultiplier;
  53. props.SetFloat(cutoutPropertyID, eval);
  54. if (BloodSettings != null) props.SetFloat("_LightIntencity", Mathf.Clamp(BloodSettings.LightIntensityMultiplier, 0.01f, 1f));
  55. if (timeLapsed >= GraphTimeMultiplier)
  56. {
  57. canUpdate = false;
  58. OnAnimationFinished?.Invoke();
  59. }
  60. props.SetVector(forwardDirPropertyID, transform.up);
  61. rend.SetPropertyBlock(props);
  62. }
  63. }