AnimatableProperty.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using System;
  2. using UnityEngine;
  3. namespace Coffee.UIExtensions
  4. {
  5. [Serializable]
  6. public class AnimatableProperty : ISerializationCallbackReceiver
  7. {
  8. public enum ShaderPropertyType
  9. {
  10. Color,
  11. Vector,
  12. Float,
  13. Range,
  14. Texture
  15. }
  16. [SerializeField] private string m_Name = "";
  17. [SerializeField] private ShaderPropertyType m_Type = ShaderPropertyType.Vector;
  18. public int id { get; private set; }
  19. public ShaderPropertyType type => m_Type;
  20. void ISerializationCallbackReceiver.OnBeforeSerialize()
  21. {
  22. }
  23. void ISerializationCallbackReceiver.OnAfterDeserialize()
  24. {
  25. id = Shader.PropertyToID(m_Name);
  26. }
  27. public void UpdateMaterialProperties(Material material, MaterialPropertyBlock mpb)
  28. {
  29. if (!material.HasProperty(id)) return;
  30. switch (type)
  31. {
  32. case ShaderPropertyType.Color:
  33. var color = mpb.GetColor(id);
  34. if (color != default)
  35. {
  36. material.SetColor(id, color);
  37. }
  38. break;
  39. case ShaderPropertyType.Vector:
  40. var vector = mpb.GetVector(id);
  41. if (vector != default)
  42. {
  43. material.SetVector(id, vector);
  44. }
  45. break;
  46. case ShaderPropertyType.Float:
  47. case ShaderPropertyType.Range:
  48. var value = mpb.GetFloat(id);
  49. if (!Mathf.Approximately(value, 0))
  50. {
  51. material.SetFloat(id, value);
  52. }
  53. break;
  54. case ShaderPropertyType.Texture:
  55. var tex = mpb.GetTexture(id);
  56. if (tex != default(Texture))
  57. {
  58. material.SetTexture(id, tex);
  59. }
  60. break;
  61. }
  62. }
  63. }
  64. }