Test
This commit is contained in:
199
Assets/Standard Assets/Utility/AutoMobileShaderSwitch.cs
Normal file
199
Assets/Standard Assets/Utility/AutoMobileShaderSwitch.cs
Normal file
@ -0,0 +1,199 @@
|
||||
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
|
||||
}
|
Reference in New Issue
Block a user