Allows you to set the render order for objects to avoid transparent sort issues. JS version has been extended to allow an option to affect all children of a GameObject but removes the option to affect materials other than sharedMaterial, as that was not necessary in my project. Feel free to modify.
Notes
- The default transparent queue is 3000.
- Lower queues will be rendered first, higher ones later.
- This change will affect the shared material, so you have to make separate materials for separate render queues.
- In the editor, this change will persist across runs. However, the scripts still need to be attached to the correct objects in a build in order to work there.
c#
using UnityEngine;
using System.Collections;
[AddComponentMenu("Effects/SetRenderQueue")]
[RequireComponent(typeof(Renderer))]
public class SetRenderQueue : MonoBehaviour {
public int queue = 1;
public int[] queues;
protected void Start() {
if (!renderer || !renderer.sharedMaterial || queues == null)
return;
renderer.sharedMaterial.renderQueue = queue;
for (int i = 0; i < queues.Length && i < renderer.sharedMaterials.Length; i++)
renderer.sharedMaterials[i].renderQueue = queues[i];
}
}
js
var queue : int = 3000; //3000 is default in Unity var applyToChildren : boolean = false; function Awake(){ SetRenderQueue(); } function SetRenderQueue(){ if (!renderer || !renderer.sharedMaterial || applyToChildren){ if(applyToChildren){ for(var child : Transform in transform){ child.renderer.sharedMaterial.renderQueue = queue; } } else { print("No renderer found on this GameObject. Check the applyToChildren box to apply settings to children"); } } else {renderer.sharedMaterial.renderQueue = queue;} }
保持每个使用的shader有自己独立的材质球,相同材质球会排序无效
其他参考:
*http://jakobknudsen.wordpress.com/2013/07/20/transparency-and-sorting/
*http://aras-p.info/texts/VertexShaderTnL.html
*http://wiki.unity3d.com/index.php?title=SetRenderQueue
*http://docs.unity3d.com/Manual/SL-AlphaTest.html
*http://www.visualizationlibrary.org/documentation/pag_guide_polygon_depth_sorting.html