You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
92 lines
2.8 KiB
92 lines
2.8 KiB
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<Material> newMaterials = new List<Material> (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<Material> newMaterials = new List<Material> (renderer.sharedMaterials); |
|
newMaterials.RemoveAt (k); |
|
renderer.sharedMaterials = newMaterials.ToArray (); |
|
return; |
|
} |
|
} |
|
|
|
for (int k = 0; k < materials.Length; k++) { |
|
if (materials [k] == bmDepthOnly) { |
|
EditorUtility.DisplayDialog ("Depth Support", "This object was not previously modified! Nothing to do.", "Ok"); |
|
return; |
|
} |
|
} |
|
|
|
} |
|
|
|
|
|
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<Renderer> (); |
|
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<Material> ("HighlightPlus/HighlightPlusDepthWrite"); |
|
if (bmDepthOnly == null) { |
|
EditorUtility.DisplayDialog ("Depth Support", "HighlightPlusDepthWrite material not found!", "Ok"); |
|
return null; |
|
} |
|
} |
|
|
|
return renderer; |
|
} |
|
|
|
|
|
} |
|
} |