Unity编辑器紫色

紫色原因是因为编辑器内跑了其他平台的shader兼容性导致的,需要动态的去修改shader,主要用到Unity的api : Shader.Find(shaderName);

具体的工具代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ShaderManager
{
    public static ShaderManager Instance;
    public static ShaderManager GetInstance()
    {
        if (Instance == null)
        {
            Instance = new ShaderManager();
        }
        return Instance;
    }
    List<Renderer> results = new List<Renderer>();
    List<Image> imageResults = new List<Image>();
    /// <summary>
    /// 修改一个AssetBundle内的所有shader
    /// </summary>
    public void ResetAllMaterials(AssetBundle bundle)
    {
        //对Material进行更改
        var materials = bundle.LoadAllAssets<Material>();
        foreach (Material m in materials)
        {
            var shaderName = m.shader.name;
            if (shaderName == "Hidden/InternalErrorShader")
                continue;
            var newShader = Find(shaderName);
            if (newShader != null)
            {
                m.shader = newShader;
            }
            else
            {
                Debug.LogWarning("unable to refresh shader: " + shaderName + " in material " + m.name);
            }
        }
        //对GameObject进行更改
        var gameObjects = bundle.LoadAllAssets<GameObject>();
        foreach (var go in gameObjects)
        {
            results.Clear();
            //物件上的材质
            go.GetComponentsInChildren<Renderer>(true, results);
            if (results.Count > 0)
            {
                for (int ii = 0; ii < results.Count; ii++)
                {
                    for (int k = 0; k < results[ii].sharedMaterials.Length; ++k)
                    {
                        var m = results[ii].sharedMaterials[k];
                        UseEditorShader(m);
                    }
                    //粒子
                    if (results[ii] is ParticleSystemRenderer particleRender)
                    {
                        UseEditorShader(particleRender.sharedMaterial);
                        UseEditorShader(particleRender.trailMaterial);
                    }
                }
            }
            //贴图上的材质
            imageResults.Clear();
            go.GetComponentsInChildren<Image>(true, imageResults);
            if (imageResults.Count > 0)
            {
                for (int ii = 0; ii < imageResults.Count; ii++)
                {
                    UseEditorShader(imageResults[ii].material);
                }
            }
        }
    }
    
    /// <summary>
    /// 修改单个物件的Shader
    /// </summary>
    /// <param name="go"></param>
    public void ResetEditorShader(GameObject go)
    {
        if (go == null)
        {
            return;
        }
        results.Clear();
        go.GetComponentsInChildren<Renderer>(true, results);
        if (results.Count > 0)
        {
            for (int ii = 0; ii < results.Count; ii++)
            {
                for (int k = 0; k < results[ii].sharedMaterials.Length; ++k)
                {
                    var m = results[ii].sharedMaterials[k];
                    UseEditorShader(m);
                }
            }
        }
    }
    void UseEditorShader(ref Shader shader)
    {
        if (shader == null)
            return;
        var shaderName = shader.name;
        var newShader = Find(shaderName);
        if (newShader != null)
            shader = newShader;
    }
    void UseEditorShader(Material material)
    {
        if (material == null || material.shader == null)
            return;
        var shaderName = material.shader.name;
        var newShader = Find(shaderName);
        if (newShader != null)
            material.shader = newShader;
    }
    Shader Find(string shaderName)
    {
        Shader outShader = Shader.Find(shaderName);
        if (outShader == null)
        {
            outShader = Shader.Find("Standard");
        }
        return outShader;
    }
}

Shader的添加形式大概有两种:

  1. 跟随AssetBundle 打进包里面,可以直接使用
         
    ShaderManager.GetInstance().ResetAllMaterials(bundleInfo.bundle);

  2. 自建材质
                material = new Material(shader);
    #if EDITOR_RUN_OTHER_PLAT
                material.shader = Shader.Find(material.shader.name);
    #endif

 

相关推荐

  1. Unity编辑器紫色

    2023-12-27 07:26:01       57 阅读
  2. Unity编辑器扩展

    2023-12-27 07:26:01       32 阅读
  3. unity编辑器扩展

    2023-12-27 07:26:01       35 阅读
  4. Unity编辑器扩展

    2023-12-27 07:26:01       29 阅读
  5. Unity编辑器扩展

    2023-12-27 07:26:01       25 阅读
  6. Unity编辑器扩展

    2023-12-27 07:26:01       28 阅读
  7. Unity宏和编辑器

    2023-12-27 07:26:01       24 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-27 07:26:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-27 07:26:01       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-27 07:26:01       82 阅读
  4. Python语言-面向对象

    2023-12-27 07:26:01       91 阅读

热门阅读

  1. mysql如何分析sql是否成功使用索引

    2023-12-27 07:26:01       66 阅读
  2. 专属于程序员烂漫的表白||Python画动态爱心

    2023-12-27 07:26:01       71 阅读
  3. 微信小程序:跳转页面

    2023-12-27 07:26:01       63 阅读
  4. 运算符讲解

    2023-12-27 07:26:01       44 阅读
  5. 微信小程序实现一个天气预报应用程序

    2023-12-27 07:26:01       63 阅读
  6. C语言:冒泡排序算法的原理

    2023-12-27 07:26:01       46 阅读
  7. 【VS】如何把wpf项目打包成exe文件

    2023-12-27 07:26:01       47 阅读
  8. 数据库的连接池详解

    2023-12-27 07:26:01       53 阅读
  9. 单元测试实战

    2023-12-27 07:26:01       67 阅读
  10. WPF RelativeSource

    2023-12-27 07:26:01       58 阅读
  11. 10分钟了解nextTick,并实现简易版本的nextTick

    2023-12-27 07:26:01       50 阅读
  12. 【Python】FastAPI学习记录(二)

    2023-12-27 07:26:01       66 阅读