-
-
Save sinbad/bd0c49bc462289fa1a018ffd70d806e3 to your computer and use it in GitHub Desktop.
using UnityEngine; | |
using UnityEditor; | |
using System.Linq; | |
/// This just exposes the Sorting Layer / Order in MeshRenderer since it's there | |
/// but not displayed in the inspector. Getting MeshRenderer to render in front | |
/// of a SpriteRenderer is pretty hard without this. | |
[CustomEditor(typeof(MeshRenderer))] | |
public class MeshRendererSortingEditor : Editor | |
{ | |
public override void OnInspectorGUI() | |
{ | |
base.OnInspectorGUI(); | |
MeshRenderer renderer = target as MeshRenderer; | |
var layers = SortingLayer.layers; | |
EditorGUILayout.BeginHorizontal(); | |
EditorGUI.BeginChangeCheck(); | |
int newId = DrawSortingLayersPopup(renderer.sortingLayerID); | |
if(EditorGUI.EndChangeCheck()) { | |
renderer.sortingLayerID = newId; | |
} | |
EditorGUILayout.EndHorizontal(); | |
EditorGUILayout.BeginHorizontal(); | |
EditorGUI.BeginChangeCheck(); | |
int order = EditorGUILayout.IntField("Sorting Order", renderer.sortingOrder); | |
if(EditorGUI.EndChangeCheck()) { | |
renderer.sortingOrder = order; | |
} | |
EditorGUILayout.EndHorizontal(); | |
} | |
int DrawSortingLayersPopup(int layerID) { | |
var layers = SortingLayer.layers; | |
var names = layers.Select(l => l.name).ToArray(); | |
if (!SortingLayer.IsValid(layerID)) | |
{ | |
layerID = layers[0].id; | |
} | |
var layerValue = SortingLayer.GetLayerValueFromID(layerID); | |
var newLayerValue = EditorGUILayout.Popup("Sorting Layer", layerValue, names); | |
return layers[newLayerValue].id; | |
} | |
} | |
// This is free and unencumbered software released into the public domain. | |
// | |
// Anyone is free to copy, modify, publish, use, compile, sell, or | |
// distribute this software, either in source code form or as a compiled | |
// binary, for any purpose, commercial or non-commercial, and by any | |
// means. | |
// | |
// In jurisdictions that recognize copyright laws, the author or authors | |
// of this software dedicate any and all copyright interest in the | |
// software to the public domain. We make this dedication for the benefit | |
// of the public at large and to the detriment of our heirs and | |
// successors. We intend this dedication to be an overt act of | |
// relinquishment in perpetuity of all present and future rights to this | |
// software under copyright law. | |
// | |
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | |
// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR | |
// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | |
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | |
// OTHER DEALINGS IN THE SOFTWARE. | |
// | |
// For more information, please refer to <http://unlicense.org/> |
This script is a life saver! Thanks!
This definitely needs to be built into Unity. Thanks for sharing! 😄
Thanks! :D
Hi could you add a license notice to the code? I really want to use it in our game project but I can't use it if it doesn't have a license free for commercial use.
Hi could you add a license notice to the code? I really want to use it in our game project but I can't use it if it doesn't have a license free for commercial use.
OK, I've added Unlicense.org's text to the bottom.
Awesome work! Thank you!
Thanks 👍 It really should be there by default though 😆
This script breaks the visibility of Lighting and Lightmapping settings.
Thank you so much! This is amazing and script works flawlessly for me 👍
This script breaks the visibility of Lighting and Lightmapping settings.
Fixed these here: https://gist.github.com/Zurigan/1f8484d7ac60f059e2f8ba49640c6d0e
Your script is a fucking lifesaver! i have to register to comment that i love you!
Having a sorting layer before the default one will produce a negative SortingLayer.value. I fixed that and also added persistence to the foldout here: https://gist.github.com/Steffenvy/c15daa426046e0df3193fcc5e0f63996
Change OnInspectorGUI in the following way to allow Prefab editing too:
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
MeshRenderer renderer = target as MeshRenderer;
EditorGUILayout.BeginHorizontal();
EditorGUI.BeginChangeCheck();
int newId = DrawSortingLayersPopup(renderer.sortingLayerID);
if (EditorGUI.EndChangeCheck())
{
Undo.RecordObject(target, "Sorting Layer change");
renderer.sortingLayerID = newId;
EditorUtility.SetDirty(target);
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
EditorGUI.BeginChangeCheck();
int order = EditorGUILayout.IntField("Sorting Order", renderer.sortingOrder);
if (EditorGUI.EndChangeCheck())
{
Undo.RecordObject(target, "Sorting Order change");
renderer.sortingOrder = order;
EditorUtility.SetDirty(target);
}
EditorGUILayout.EndHorizontal();
}
And fix the bug with layers beneath Default as @Ratatoeskr proposed above.
First time in 5 months that I tried to modify prefab instance values, and I noticed there wasn't any overrides created, so I fixed that:
https://gist.github.com/Steffenvy/c15daa426046e0df3193fcc5e0f63996
All I can say is that you for this. And thank you to everyone who added on top of this.
thank you!
Big thank you for this. I was used to doing it via script, but this really is a much more reliable method if you are relying on non-coders setting up parts of a game, like I am.
A hero rises to our aid!
Still comes in handy with 2022 LTS branch of Unity. I tried everything to get my water mesh to render over the majority of my sprites, and nothing worked except this.
I remade it by inheriting the internal class MeshRendererEditor
to keep the default functionality and compability with prefab, multi-edit, and undo/redo. Also I added support for SkinnedMeshRenderer
and included installation as a UPM package.
https://github.com/qwe321qwe321qwe321/Unity-ExposeSortingLayerEditor
If you sort the layers such that there are layers beneath "Default" then their value is < 0 which makes this line offering an incorrect result. You could write
var newLayerValue = EditorGUILayout.Popup("Sorting Layer", layers.ToList().FindIndex(l => l.id == layerID), names);
instead