SFX_MaterialUtil.cs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. using System.Collections.Generic;
  2. using UnityEngine;
  3. // ReSharper disable once CheckNamespace
  4. namespace QFX.SFX
  5. {
  6. public static class SFX_MaterialUtil
  7. {
  8. public static void ReplaceMaterial(GameObject targetGo, Material templateMaterial)
  9. {
  10. var newMaterial = new Material(templateMaterial);
  11. var rends = targetGo.GetComponentsInChildren<Renderer>();
  12. foreach (var rend in rends)
  13. {
  14. var materialsLength = rend.sharedMaterials.Length;
  15. var materials = new Material[materialsLength];
  16. for (int i = 0; i < materialsLength; i++)
  17. materials[i] = newMaterial;
  18. rend.sharedMaterials = materials;
  19. }
  20. }
  21. public static void RemoveAllMaterials(GameObject targetGo)
  22. {
  23. var rends = targetGo.GetComponentsInChildren<Renderer>();
  24. foreach (var rend in rends)
  25. rend.sharedMaterials = new Material[0];
  26. }
  27. public static void AddMaterial(GameObject targetGo, Material templateMaterial)
  28. {
  29. var newMaterial = new Material(templateMaterial);
  30. var rends = targetGo.GetComponentsInChildren<Renderer>();
  31. foreach (var rend in rends)
  32. {
  33. var materialsLength = rend.sharedMaterials.Length + 1;
  34. var materials = new Material[materialsLength];
  35. for (int i = 0; i < rend.sharedMaterials.Length; i++)
  36. materials[i] = rend.sharedMaterials[i];
  37. materials[materialsLength - 1] = newMaterial;
  38. rend.sharedMaterials = materials;
  39. }
  40. }
  41. public static void ReplaceMaterial(Dictionary<Renderer, Material[]> rendererToMaterials)
  42. {
  43. foreach (var rendToMaterials in rendererToMaterials)
  44. rendToMaterials.Key.sharedMaterials = rendToMaterials.Value;
  45. }
  46. public static Dictionary<Renderer, Material[]> GetOriginalMaterials(GameObject targetGo)
  47. {
  48. var rendererToMaterials = new Dictionary<Renderer, Material[]>();
  49. var rends = targetGo.GetComponentsInChildren<Renderer>();
  50. foreach (var rend in rends)
  51. rendererToMaterials[rend] = rend.sharedMaterials;
  52. return rendererToMaterials;
  53. }
  54. }
  55. }