Advertisement
Guest User

ChangeMaterialChildren2

a guest
May 31st, 2017
24
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.29 KB | None | 0 0
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using UnityEngine;
  4.  
  5. //This attribute is used so the component is working in also Edit Mode  (not in play)
  6. [ExecuteInEditMode]
  7. public class ChangeMaterialChildren : MonoBehaviour
  8. {
  9.     //Class to simplify the visualization on inspector window
  10.    [System.Serializable]
  11.     private class MeshMaterial
  12.     {
  13.         public MeshRenderer targetMeshRenderer;        //Target meshRender to apply targetMaterial
  14.         private Material targetMaterial;                //Target maaterial to apply to meshRenderer
  15.         /* Removing individual updating
  16.          * public bool updateMaterial;                    //Used on inspector window to apply targetMaterial on meshRenderer
  17.          */
  18.     }
  19.  
  20.     public Material masterMaterial;
  21.  
  22.     [SerializeField]
  23.     private List<MeshMaterial> meshMaterial;  //List of combination of MeshRenderer - Targetmaterial
  24.  
  25.     [SerializeField]
  26.     private bool updateAll = false;           //Used on inspector to update all meshRenderer in the list meshMaterial
  27.  
  28.     private void Update()
  29.     {
  30.         //When you check the box (uptadeMaterial) in the inspector of an item in the meshMaterial list
  31.         /* Removing individual updating
  32.            MeshMaterial itemToUpdate = meshMaterial.Find(m => m.updateMaterial == true);
  33.         if (itemToUpdate != null)
  34.         {
  35.             itemToUpdate.targetMeshRenderer.sharedMaterial = itemToUpdate.targetMaterial;             //Applying material to meshRenderer
  36.             //Setting to false again because we already applied to material
  37.             //other wise this is called every frame (not ideal)
  38.             itemToUpdate.updateMaterial = false;
  39.         }
  40.         */
  41.  
  42.         //When you check the box (uptadeAll)
  43.         if (updateAll)
  44.         {
  45.             //apply all the materials
  46.             foreach (var m in meshMaterial)
  47.                 m.targetMeshRenderer.sharedMaterial = masterMaterial;       //changed to update from masterMaterial
  48.  
  49.             //Reset updateAll, otherwise this is called every frame (not ideal)
  50.             updateAll = false;
  51.         }
  52.     }
  53.  
  54.     //This is called when you attach this component on a gameObject, so I use it to initialize
  55.     private void Reset()
  56.     {
  57.         meshMaterial = new List<MeshMaterial>();
  58.  
  59.         //I assume that your "carpets" are 3D models, so i'll search all children items of this gameobject with MeshRenderer component.
  60.         List<MeshRenderer> mr = GetComponentsInChildren<MeshRenderer>().ToList();
  61.  
  62.         //If i recall correctly GetComponentsInChildren will include the parent (this gameobject) so i remove the parent
  63.         MeshRenderer myMeshRenderer = GetComponent<MeshRenderer>();
  64.         if (myMeshRenderer != null)
  65.             mr.Remove(myMeshRenderer);
  66.  
  67.         //Initializing the list of MeshRenderers affected
  68.         /*
  69.         foreach (var r in mr)
  70.         {
  71.             MeshMaterial meshMat = new MeshMaterial()
  72.             {
  73.                 targetMeshRenderer = r,
  74.                 targetMaterial = r.sharedMaterial,  //By default the targetMaterial is the current material of the mesh renderer
  75.                 /* Removing Individual updating
  76.                  * updateMaterial = false
  77.                  *
  78.             };
  79.             meshMaterial.Add(meshMat);
  80.         }*/
  81.     }
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement