Files
JJBB/Assets/Project/Script/Shader/Editor/ShaderSwapper.cs
2024-08-23 15:49:34 +08:00

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;
}
}
}
}