using System; using System.Collections.Generic; using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endif namespace UnityStandardAssets.Utility { public class AutoMobileShaderSwitch : MonoBehaviour { [SerializeField] private ReplacementList m_ReplacementList; // Use this for initialization private void OnEnable() { #if UNITY_IPHONE || UNITY_ANDROID || UNITY_WP8 || UNITY_TIZEN var renderers = FindObjectsOfType<Renderer>(); Debug.Log (renderers.Length+" renderers"); var oldMaterials = new List<Material>(); var newMaterials = new List<Material>(); int materialsReplaced = 0; int materialInstancesReplaced = 0; foreach(ReplacementDefinition replacementDef in m_ReplacementList.items) { foreach(var r in renderers) { Material[] modifiedMaterials = null; for(int n=0; n<r.sharedMaterials.Length; ++n) { var material = r.sharedMaterials[n]; if (material.shader == replacementDef.original) { if (modifiedMaterials == null) { modifiedMaterials = r.materials; } if (!oldMaterials.Contains(material)) { oldMaterials.Add(material); Material newMaterial = (Material)Instantiate(material); newMaterial.shader = replacementDef.replacement; newMaterials.Add(newMaterial); ++materialsReplaced; } Debug.Log ("replacing "+r.gameObject.name+" renderer "+n+" with "+newMaterials[oldMaterials.IndexOf(material)].name); modifiedMaterials[n] = newMaterials[oldMaterials.IndexOf(material)]; ++materialInstancesReplaced; } } if (modifiedMaterials != null) { r.materials = modifiedMaterials; } } } Debug.Log (materialInstancesReplaced+" material instances replaced"); Debug.Log (materialsReplaced+" materials replaced"); for(int n=0; n<oldMaterials.Count; ++n) { Debug.Log (oldMaterials[n].name+" ("+oldMaterials[n].shader.name+")"+" replaced with "+newMaterials[n].name+" ("+newMaterials[n].shader.name+")"); } #endif } [Serializable] public class ReplacementDefinition { public Shader original = null; public Shader replacement = null; } [Serializable] public class ReplacementList { public ReplacementDefinition[] items = new ReplacementDefinition[0]; } } } namespace UnityStandardAssets.Utility.Inspector { #if UNITY_EDITOR [CustomPropertyDrawer(typeof (AutoMobileShaderSwitch.ReplacementList))] public class ReplacementListDrawer : PropertyDrawer { const float k_LineHeight = 18; const float k_Spacing = 4; public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { EditorGUI.BeginProperty(position, label, property); float x = position.x; float y = position.y; float inspectorWidth = position.width; // Don't make child fields be indented var indent = EditorGUI.indentLevel; EditorGUI.indentLevel = 0; var items = property.FindPropertyRelative("items"); var titles = new string[] {"Original", "Replacement", ""}; var props = new string[] {"original", "replacement", "-"}; var widths = new float[] {.45f, .45f, .1f}; const float lineHeight = 18; bool changedLength = false; if (items.arraySize > 0) { for (int i = -1; i < items.arraySize; ++i) { var item = items.GetArrayElementAtIndex(i); float rowX = x; for (int n = 0; n < props.Length; ++n) { float w = widths[n]*inspectorWidth; // Calculate rects Rect rect = new Rect(rowX, y, w, lineHeight); rowX += w; if (i == -1) { // draw title labels EditorGUI.LabelField(rect, titles[n]); } else { if (props[n] == "-" || props[n] == "^" || props[n] == "v") { if (GUI.Button(rect, props[n])) { switch (props[n]) { case "-": items.DeleteArrayElementAtIndex(i); items.DeleteArrayElementAtIndex(i); changedLength = true; break; case "v": if (i > 0) { items.MoveArrayElement(i, i + 1); } break; case "^": if (i < items.arraySize - 1) { items.MoveArrayElement(i, i - 1); } break; } } } else { SerializedProperty prop = item.FindPropertyRelative(props[n]); EditorGUI.PropertyField(rect, prop, GUIContent.none); } } } y += lineHeight + k_Spacing; if (changedLength) { break; } } } // add button var addButtonRect = new Rect((x + position.width) - widths[widths.Length - 1]*inspectorWidth, y, widths[widths.Length - 1]*inspectorWidth, lineHeight); if (GUI.Button(addButtonRect, "+")) { items.InsertArrayElementAtIndex(items.arraySize); } y += lineHeight + k_Spacing; // Set indent back to what it was EditorGUI.indentLevel = indent; EditorGUI.EndProperty(); } public override float GetPropertyHeight(SerializedProperty property, GUIContent label) { SerializedProperty items = property.FindPropertyRelative("items"); float lineAndSpace = k_LineHeight + k_Spacing; return 40 + (items.arraySize*lineAndSpace) + lineAndSpace; } } #endif }