美文网首页
场景Shader替换工具

场景Shader替换工具

作者: NightChord | 来源:发表于2024-03-26 17:45 被阅读0次

工具说明

Shader替换工具是一款Unity编辑器扩展工具,用于批量替换场景中物体的Shader。

功能

  • 支持替换单个物体或递归替换所有子物体
  • 自动赋值原有材质的贴图到替换后的Shader
  • 支持自定义替换Shader

使用方法

  1. 在Unity菜单栏中选择 EditorTools/Shader Replace Tool 打开工具窗口
  2. 选择要替换的Shader
  3. 选择是否替换子物体
  4. 点击 Replace 按钮开始替换

注意事项

  • 替换Shader后,需要手动保存场景
  • 脚本中获取贴图的代码可能需要根据实际情况进行修改

代码示例

using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

public class ShaderReplaceTool : EditorWindow
{
  // 替换shader
  public Shader replaceShader;

  // 是否替换子物体
  public bool replaceChildren = true;

  [MenuItem("EditorTools/Shader Replace Tool")]
  static void Init()
  {
    ShaderReplaceTool window = (ShaderReplaceTool)EditorWindow.GetWindow(typeof(ShaderReplaceTool));
    window.Show();
  }

  void OnGUI()
  {
    replaceShader = (Shader)EditorGUILayout.ObjectField("Replace Shader", replaceShader, typeof(Shader), false);
    replaceChildren = EditorGUILayout.Toggle("Replace Children", replaceChildren);

    if (GUILayout.Button("Replace"))
    {
      ReplaceShader();
    }
  }

  void ReplaceShader()
  {
    // 获取当前场景中所有物体
    GameObject[] allObjects = GameObject.FindObjectsOfType<GameObject>();

    foreach (GameObject obj in allObjects)
    {
      // 遍历物体及其子物体
      if (replaceChildren)
      {
        ReplaceShader(obj.transform);
      }
      else
      {
        ReplaceShader(obj.transform, false);
      }
    }
  }

  void ReplaceShader(Transform trans, bool recursive = true)
  {
    // 获取物体的材质
    Renderer renderer = trans.GetComponent<Renderer>();
    if (renderer != null)
    {
      // 替换材质的shader
      Material[] mats = renderer.sharedMaterials;

      for (int i = 0; i < mats.Length; i++)
      {
        mats[i].shader = replaceShader;

        // 赋值贴图
        if (replaceShader != null)
        {
          // 获取原有材质的贴图
          Texture2D baseMap = mats[i].GetTexture("_MainTex") as Texture2D;
          Texture2D normalMap = mats[i].GetTexture("_BumpMap") as Texture2D;
          Texture2D metallicMap = mats[i].GetTexture("_MetallicGlossMap") as Texture2D;

          // 赋值到替换shader后的材质
          mats[i].SetTexture("_Base_Map", baseMap);
          mats[i].SetTexture("_Normal_Map", normalMap);
          mats[i].SetTexture("_ORM", metallicMap);
        }
      }
    }

    // 递归遍历子物体
    if (recursive)
    {
      foreach (Transform child in trans)
      {
        ReplaceShader(child, recursive);
      }
    }
  }
}

相关文章

网友评论

      本文标题:场景Shader替换工具

      本文链接:https://www.haomeiwen.com/subject/zagstjtx.html