Unity 框架

ObjectHighlight.cs 2.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. using System.Linq;
  2. using UnityEngine;
  3. namespace TFramework
  4. {
  5. public class ObjectHighlight : MonoBehaviour
  6. {
  7. private Renderer[] _renderers;
  8. private Material _highlightMaskMaterial;
  9. [SerializeField]
  10. private Color _highlightColor;
  11. public Color HighlightColor
  12. {
  13. get => _highlightColor;
  14. set
  15. {
  16. _highlightColor = value;
  17. UpdateMaterialProperties();
  18. }
  19. }
  20. private void Awake()
  21. {
  22. _renderers = GetComponentsInChildren<Renderer>();
  23. _highlightMaskMaterial= Instantiate(Main.GetMagr<EffectManager>().m_hihghlightMaterial);
  24. _highlightMaskMaterial.name = "Highlight (Instance)";
  25. _highlightColor = Main.GetMagr<EffectManager>().m_defaultHighlightColor;
  26. }
  27. private void OnEnable()
  28. {
  29. foreach (var renderer in _renderers)
  30. {
  31. var materials = renderer.sharedMaterials.ToList();
  32. materials.Add(_highlightMaskMaterial);
  33. renderer.materials = materials.ToArray();
  34. }
  35. UpdateMaterialProperties();
  36. }
  37. private void OnDisable()
  38. {
  39. foreach (var renderer in _renderers)
  40. {
  41. var materials = renderer.sharedMaterials.ToList();
  42. materials.Remove(_highlightMaskMaterial);
  43. renderer.materials = materials.ToArray();
  44. }
  45. }
  46. private void OnDestroy()
  47. {
  48. foreach (var renderer in _renderers)
  49. {
  50. var materials = renderer.sharedMaterials.ToList();
  51. materials.Remove(_highlightMaskMaterial);
  52. renderer.materials = materials.ToArray();
  53. }
  54. Destroy(_highlightMaskMaterial);
  55. }
  56. void UpdateMaterialProperties()
  57. {
  58. _highlightMaskMaterial?.SetColor("_HighlightColor", _highlightColor);
  59. }
  60. }
  61. }