关注

材质(material)的RenderQueue和Shader的RenderQueue不符

问题

  • 物体莫名出现在奇怪的渲染深度(depth)上
  • Layer的顺序被忽略(例如Sprite Renderer)

原因

出现这种情况可能有以下几种原因:

  • 使用Editor脚本或Runtime脚本修改了材质的renderQueue值。这个材质可能会被复制,在其他工程重用。但材质会误认为其RenderQueue与着色器(Shader)的Renderqueue数值一致。例如:gameObject.GetComponent<Renderer>().sharedMaterial.renderQueue = 2000;
  • 在旧版本的Unity(1.3之前,更多信息见下方),为材质分配新的着色器并不会重置材质的RenderQueue。

解决方案

重设材质的RenderQueue使其匹配着色器的RenderQueue。

下面的Editor脚本将会扫描工程中的所有材质,并将它们的RenderQueue与着色器相匹配。

using UnityEditor;
using UnityEngine;

public class ResetMaterialsRenderQueue
{
	[MenuItem ("Assets/Reset Materials RenderQueue")]
	static void DoResetMaterialsRenderQueue()
	{
        Material[] materials = (Material[])Resources.FindObjectsOfTypeAll(typeof(Material));

	    int materialsLength = materials.Length;

	    for (int i = 0; i < materialsLength; ++i)
	    {
	        if (materials[i].shader != null)
	        {
	            materials[i].renderQueue = materials[i].shader.renderQueue;
	        }
	    }  
	}
}

更多信息

5.1.3更新日志-图形:在材质检视器中更改着色器时会重置材质的RenderQueue。

Further Instructions

  • Download the file below
  • Unzip into Assets/Editor folder
  • In Unity Editor, go to Assets and select Reset Materials RenderQueue
这篇文章有帮助吗?
1 人中有 1 人觉得有帮助
还有其它问题?提交请求

0 评论

登录写评论。