Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using UnityEngine;
- [DisallowMultipleComponent]
- public class Outline : MonoBehaviour
- {
- public enum Mode
- {
- OutlineAll,
- OutlineVisible,
- OutlineHidden,
- OutlineAndSilhouette,
- SilhouetteOnly
- }
- public Mode OutlineMode
- {
- get { return outlineMode; }
- set
- {
- outlineMode = value;
- needsUpdate = true;
- }
- }
- public Color OutlineColor
- {
- get { return outlineColor; }
- set
- {
- outlineColor = value;
- needsUpdate = true;
- }
- }
- public float OutlineWidth
- {
- get { return outlineWidth; }
- set
- {
- outlineWidth = value;
- needsUpdate = true;
- }
- }
- [SerializeField]
- private Mode outlineMode;
- [SerializeField]
- private Color outlineColor = Color.blue;
- [SerializeField, Range(0f, 10f)]
- private float outlineWidth = 5f;
- private Renderer[] renderers;
- private Material outlineMaskMaterial;
- private Material outlineFillMaterial;
- private bool needsUpdate;
- void Awake()
- {
- renderers = GetComponentsInChildren<Renderer>();
- outlineMaskMaterial = Instantiate(Resources.Load<Material>(@"Materials/OutlineMask"));
- outlineFillMaterial = Instantiate(Resources.Load<Material>(@"Materials/OutlineFill"));
- outlineMaskMaterial.name = "OutlineMask (Instance)";
- outlineFillMaterial.name = "OutlineFill (Instance)";
- needsUpdate = true;
- }
- void OnEnable()
- {
- foreach (var renderer in renderers)
- {
- var materials = renderer.sharedMaterials.Clone() as Material[];
- System.Array.Resize(ref materials, materials.Length + 2);
- materials[materials.Length - 2] = outlineMaskMaterial;
- materials[materials.Length - 1] = outlineFillMaterial;
- renderer.materials = materials;
- }
- }
- void OnDisable()
- {
- foreach (var renderer in renderers)
- {
- var materials = renderer.sharedMaterials.Clone() as Material[];
- System.Array.Resize(ref materials, materials.Length - 2);
- renderer.materials = materials;
- }
- }
- void Update()
- {
- if (needsUpdate)
- {
- needsUpdate = false;
- UpdateMaterialProperties();
- }
- }
- void UpdateMaterialProperties()
- {
- outlineFillMaterial.SetColor("_OutlineColor", outlineColor);
- switch (outlineMode)
- {
- case Mode.OutlineAll:
- outlineMaskMaterial.SetFloat("_ZTest", (float)UnityEngine.Rendering.CompareFunction.Always);
- outlineFillMaterial.SetFloat("_ZTest", (float)UnityEngine.Rendering.CompareFunction.Always);
- outlineFillMaterial.SetFloat("_OutlineWidth", outlineWidth);
- break;
- case Mode.OutlineVisible:
- outlineMaskMaterial.SetFloat("_ZTest", (float)UnityEngine.Rendering.CompareFunction.Always);
- outlineFillMaterial.SetFloat("_ZTest", (float)UnityEngine.Rendering.CompareFunction.LessEqual);
- outlineFillMaterial.SetFloat("_OutlineWidth", outlineWidth);
- break;
- case Mode.OutlineHidden:
- outlineMaskMaterial.SetFloat("_ZTest", (float)UnityEngine.Rendering.CompareFunction.Always);
- outlineFillMaterial.SetFloat("_ZTest", (float)UnityEngine.Rendering.CompareFunction.Greater);
- outlineFillMaterial.SetFloat("_OutlineWidth", outlineWidth);
- break;
- case Mode.OutlineAndSilhouette:
- outlineMaskMaterial.SetFloat("_ZTest", (float)UnityEngine.Rendering.CompareFunction.LessEqual);
- outlineFillMaterial.SetFloat("_ZTest", (float)UnityEngine.Rendering.CompareFunction.Always);
- outlineFillMaterial.SetFloat("_OutlineWidth", outlineWidth);
- break;
- case Mode.SilhouetteOnly:
- outlineMaskMaterial.SetFloat("_ZTest", (float)UnityEngine.Rendering.CompareFunction.LessEqual);
- outlineFillMaterial.SetFloat("_ZTest", (float)UnityEngine.Rendering.CompareFunction.Greater);
- outlineFillMaterial.SetFloat("_OutlineWidth", 0);
- break;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment