Unity编辑器紫色

这篇具有很好参考价值的文章主要介绍了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

 文章来源地址https://www.toymoban.com/news/detail-768738.html

到了这里,关于Unity编辑器紫色的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity编辑器扩展 | 编辑器扩展基础入门

    前言 当谈到游戏开发工具,Unity编辑器是一个备受赞誉的平台。它为开发者提供了一个强大且灵活的环境,使他们能够创建令人惊叹的游戏和交互式体验。 然而,Unity编辑器本身也是可以扩展和定制的,这为开发者提供了进一步提升工作流程和增强功能的机会。 在Unity 编辑器

    2024年02月10日
    浏览(77)
  • 【Unity编辑器扩展】 | 编辑器扩展入门基础

    前言 当谈到游戏开发工具,Unity编辑器是一个备受赞誉的平台。它为开发者提供了一个强大且灵活的环境,使他们能够创建令人惊叹的游戏和交互式体验。 然而,Unity编辑器本身也是可以扩展和定制的,这为开发者提供了进一步提升工作流程和增强功能的机会。 在Unity 编辑器

    2024年02月10日
    浏览(84)
  • Unity 可视化节点编辑器(GraphView、编辑器扩展)

      前几天把导师的项目打包发布交了一稿,这半个星期除了再把项目缝缝补补外(说实话项目做到后边实在有些无聊,都是些琐碎的东西而且自己也学不到什么,纯粹是 浪费 消磨时间)无聊逛Unity商店发现了个有意思的东西,说实话一开始我以为只是单纯绘制的2D动画:

    2024年02月12日
    浏览(63)
  • Unity编辑器扩展(外挂)

    每日一句:未来的样子藏在现在的努力里 目录 什么是编译器开发 C#特性[System.Serializable] 特殊目录 命名空间 /*检视器属性控制*/     //添加变量悬浮提示文字     //给数值设定范围(最小0,最大150) //指定输入框,拥有5行 //默认显示5行,最多显示10行内容,再多用滚动条控

    2024年01月24日
    浏览(88)
  • 修改unity代码编辑器

    将   Unity  自带的 MonoDevelop  替换成微软的 VS  2017 编辑器。 操作步骤 : 第一步:选择Edit选项卡下的Preferences..选项 第二步:选择External Tools 第三步:修改右侧的External Script Editor,选择VS2017  有的小伙伴可能下拉框中没有VS2017选项,没关系,点击Brower..,找到VS2017的应用程序

    2024年02月11日
    浏览(48)
  • Unity 编辑器常用方法

    自动根据RuntimeInitializeLoadType选择一个时机执行。静态方法 AfterSceneLoad 在场景加载之后初始化子系统。这意味着子系统将在场景加载完成后进行初始化,并在场景加载后的脚本执行时可用。 BeforeSceneLoad 在场景加载之前初始化子系统。这意味着子系统将在场景加载之前进行初始

    2024年02月07日
    浏览(54)
  • 【Unity知识树】Unity编辑器加速小技巧

      运行游戏时不重新编译脚本 现象:每次运行游戏都会弹出一个重新加载脚本的框,耽误几秒钟时间。     提速技巧:勾选工程设置 编辑器 Enter Play Mode Options的选项即可。     以后如果脚本没有改动,运行时不会重新编译。   取消不必要的csproj脚本工程文件 新版本的Uni

    2024年02月12日
    浏览(41)
  • 【Unity UIToolkit】UIBuilder基础教程-制作简易的对话系统编辑器 3步教你玩转Unity编辑器扩展工具

    随着Unity开发的深入,基本的Unity编辑器界面并不能满足大部分玩家高阶开发的要求。为了提高开发的效率,有针对性的定制化扩展编辑器界面是提高开发效率的不错选择。 今天就给大家带来Unity官方提高的编辑器扩展工具UIToolkit(集成了UIBuilder和UI Debugger等插件)的使用教程。

    2024年02月04日
    浏览(72)
  • Unity Editor 编辑器介绍

    Project 窗口 :列出所有的资源 Console 窗口 :日志输出 Hierarchy 窗口 :在Project 窗口选择一个 Scene 场景后,会在这个窗口显示这个构成这个场景的所有游戏对象 Inspector 窗口: 在 Hierarchy窗口 或 Project 窗口中选择任何一个资源,Inspector窗口 显示与这个资源相关的所有属性。 S

    2024年02月16日
    浏览(43)
  • Unity编辑器开发——EditorWindow

    官方文档:EditorWindow - Unity 脚本 API EditorWindow  继承自  ScriptableObject 1.静态变量 变量名 官方解释 使用场景 focusWindow 当前已获得键盘焦点的 EditorWindow。(只读) mouseOverWindow 当前在鼠标光标下的 EditorWindow。(只读) 2.变量 变量名 官方解释 使用场景 titleContent 用于绘制 Edi

    2024年02月16日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包