86 lines
2.9 KiB
C#
86 lines
2.9 KiB
C#
using UnityEngine;
|
|
using UnityEditor;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
|
|
public class ShaderSwapper : Editor
|
|
{
|
|
private static bool init = false;
|
|
private static Dictionary<Shader, Shader> shaderDict;
|
|
private static Shader standardShader;
|
|
private static Shader diffuseShader;
|
|
private static Shader bumppedShader;
|
|
private static Shader alphaTestShader;
|
|
private static void Init()
|
|
{
|
|
shaderDict = new Dictionary<Shader, Shader>();
|
|
standardShader = Shader.Find("Standard");
|
|
diffuseShader = Shader.Find("Zhanyou/Mobile/DiffuseEmit");
|
|
bumppedShader = Shader.Find("Zhanyou/Mobile/DiffuseBumpedEmit");
|
|
alphaTestShader = Shader.Find("Zhanyou/Mobile/Transparent/DiffuseAlphaTest");
|
|
|
|
shaderDict.Add(Shader.Find("Mobile/Diffuse"), diffuseShader);
|
|
shaderDict.Add(Shader.Find("Mobile/Bumped Diffuse"), bumppedShader);
|
|
shaderDict.Add(Shader.Find("Particles/Additive"), Shader.Find("Zhanyou/Particles/AdditiveClip"));
|
|
}
|
|
|
|
[MenuItem("Assets/Use Mobile Shader", false, 0)]
|
|
public static void SwapShaderFromAsset()
|
|
{
|
|
if (Selection.objects.Length > 0)
|
|
{
|
|
for (int i = 0; i < Selection.objects.Length; i++)
|
|
{
|
|
var material = Selection.objects[i] as Material;
|
|
if (material)
|
|
HandleOneMaterial(material);
|
|
}
|
|
SwapShader();
|
|
}
|
|
}
|
|
|
|
[MenuItem("GameObject/Use Mobile Shader", false, 15)]
|
|
public static void SwapShader()
|
|
{
|
|
if (!init)
|
|
{
|
|
Init();
|
|
init = true;
|
|
}
|
|
if (Selection.gameObjects.Length > 0)
|
|
{
|
|
for (int i = 0; i < Selection.gameObjects.Length; i++)
|
|
HandleOneGameObject(Selection.gameObjects[i]);
|
|
}
|
|
}
|
|
private static void HandleOneGameObject(GameObject item)
|
|
{
|
|
var meshRenderer = item.GetComponent<MeshRenderer>();
|
|
if (meshRenderer && meshRenderer.sharedMaterials.Length > 0)
|
|
{
|
|
for (int i = 0; i < meshRenderer.sharedMaterials.Length; i++)
|
|
HandleOneMaterial(meshRenderer.sharedMaterials[i]);
|
|
}
|
|
}
|
|
private static void HandleOneMaterial(Material material)
|
|
{
|
|
Shader target;
|
|
if (shaderDict.TryGetValue(material.shader, out target))
|
|
material.shader = target;
|
|
else if (material.shader == standardShader)
|
|
{
|
|
var blendMode = (int)material.GetFloat("_Mode");
|
|
// Alpha Cut Off 模式
|
|
if (blendMode == 1)
|
|
material.shader = alphaTestShader;
|
|
else
|
|
{
|
|
var normalMap = material.GetTexture("_BumpMap");
|
|
if (normalMap != null)
|
|
material.shader = bumppedShader;
|
|
else
|
|
material.shader = diffuseShader;
|
|
}
|
|
}
|
|
}
|
|
} |