using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering; using UnityEditor; namespace HighlightPlus { public class TransparentWithDepth { static Material bmDepthOnly; [MenuItem("GameObject/Effects/Highlight Plus/Add Depth To Transparent Object", false, 100)] static void AddDepthOption () { Renderer renderer = GetRenderer(); if (renderer == null) return; if (!EditorUtility.DisplayDialog("Add Depth To Transparent Object", "This option will force the transparent object to write to the depth buffer by adding a new special material to the renderer (existing materials are preserved) so it can occlude and allow See-Through effect.\nOnly use on transparent objects.\n\nProceed?", "Yes", "No")) { return; } Material[] materials = renderer.sharedMaterials; for (int k = 0; k < materials.Length; k++) { if (materials[k] == bmDepthOnly) { EditorUtility.DisplayDialog("Depth Support", "Already set! Nothing to do.", "Ok"); return; } } if (materials == null) { renderer.sharedMaterial = bmDepthOnly; } else { List newMaterials = new List(materials); newMaterials.Insert(0, bmDepthOnly); renderer.sharedMaterials = newMaterials.ToArray(); } } [MenuItem("GameObject/Effects/Highlight Plus/Remove Depth Compatibility", false, 101)] static void RemoveDepthOption () { Renderer renderer = GetRenderer(); if (renderer == null) return; Material[] materials = renderer.sharedMaterials; for (int k = 0; k < materials.Length; k++) { if (materials[k] == bmDepthOnly) { List newMaterials = new List(renderer.sharedMaterials); newMaterials.RemoveAt(k); renderer.sharedMaterials = newMaterials.ToArray(); return; } } EditorUtility.DisplayDialog("Depth Support", "This object was not previously modified! Nothing to do.", "Ok"); } static Renderer GetRenderer () { if (Selection.activeGameObject == null) { EditorUtility.DisplayDialog("Depth Support", "This option can only be used on GameObjects.", "Ok"); return null; } Renderer renderer = Selection.activeGameObject.GetComponent(); if (renderer == null) { EditorUtility.DisplayDialog("Depth Support", "This option can only be used on GameObjects with a Renderer component attached.", "Ok"); return null; } if (bmDepthOnly == null) { bmDepthOnly = Resources.Load("HighlightPlus/HighlightPlusDepthWrite"); if (bmDepthOnly == null) { EditorUtility.DisplayDialog("Depth Support", "HighlightPlusDepthWrite material not found!", "Ok"); return null; } } return renderer; } } }