evelynshilosky

Outline - Part 5

Feb 25th, 2025
726
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.39 KB | None | 0 0
  1. using UnityEngine;
  2.  
  3. [DisallowMultipleComponent]
  4. public class Outline : MonoBehaviour
  5. {
  6.     public enum Mode
  7.     {
  8.         OutlineAll,
  9.         OutlineVisible,
  10.         OutlineHidden,
  11.         OutlineAndSilhouette,
  12.         SilhouetteOnly
  13.     }
  14.  
  15.     public Mode OutlineMode
  16.     {
  17.         get { return outlineMode; }
  18.         set
  19.         {
  20.             outlineMode = value;
  21.             needsUpdate = true;
  22.         }
  23.     }
  24.  
  25.     public Color OutlineColor
  26.     {
  27.         get { return outlineColor; }
  28.         set
  29.         {
  30.             outlineColor = value;
  31.             needsUpdate = true;
  32.         }
  33.     }
  34.  
  35.     public float OutlineWidth
  36.     {
  37.         get { return outlineWidth; }
  38.         set
  39.         {
  40.             outlineWidth = value;
  41.             needsUpdate = true;
  42.         }
  43.     }
  44.  
  45.     [SerializeField]
  46.     private Mode outlineMode;
  47.  
  48.     [SerializeField]
  49.     private Color outlineColor = Color.blue;
  50.  
  51.     [SerializeField, Range(0f, 10f)]
  52.     private float outlineWidth = 5f;
  53.  
  54.     private Renderer[] renderers;
  55.     private Material outlineMaskMaterial;
  56.     private Material outlineFillMaterial;
  57.  
  58.     private bool needsUpdate;
  59.  
  60.     void Awake()
  61.     {
  62.         renderers = GetComponentsInChildren<Renderer>();
  63.  
  64.         outlineMaskMaterial = Instantiate(Resources.Load<Material>(@"Materials/OutlineMask"));
  65.         outlineFillMaterial = Instantiate(Resources.Load<Material>(@"Materials/OutlineFill"));
  66.  
  67.         outlineMaskMaterial.name = "OutlineMask (Instance)";
  68.         outlineFillMaterial.name = "OutlineFill (Instance)";
  69.  
  70.         needsUpdate = true;
  71.     }
  72.  
  73.     void OnEnable()
  74.     {
  75.         foreach (var renderer in renderers)
  76.         {
  77.             var materials = renderer.sharedMaterials.Clone() as Material[];
  78.             System.Array.Resize(ref materials, materials.Length + 2);
  79.             materials[materials.Length - 2] = outlineMaskMaterial;
  80.             materials[materials.Length - 1] = outlineFillMaterial;
  81.             renderer.materials = materials;
  82.         }
  83.     }
  84.  
  85.     void OnDisable()
  86.     {
  87.         foreach (var renderer in renderers)
  88.         {
  89.             var materials = renderer.sharedMaterials.Clone() as Material[];
  90.             System.Array.Resize(ref materials, materials.Length - 2);
  91.             renderer.materials = materials;
  92.         }
  93.     }
  94.  
  95.     void Update()
  96.     {
  97.         if (needsUpdate)
  98.         {
  99.             needsUpdate = false;
  100.             UpdateMaterialProperties();
  101.         }
  102.     }
  103.  
  104.     void UpdateMaterialProperties()
  105.     {
  106.         outlineFillMaterial.SetColor("_OutlineColor", outlineColor);
  107.  
  108.         switch (outlineMode)
  109.         {
  110.             case Mode.OutlineAll:
  111.                 outlineMaskMaterial.SetFloat("_ZTest", (float)UnityEngine.Rendering.CompareFunction.Always);
  112.                 outlineFillMaterial.SetFloat("_ZTest", (float)UnityEngine.Rendering.CompareFunction.Always);
  113.                 outlineFillMaterial.SetFloat("_OutlineWidth", outlineWidth);
  114.                 break;
  115.  
  116.             case Mode.OutlineVisible:
  117.                 outlineMaskMaterial.SetFloat("_ZTest", (float)UnityEngine.Rendering.CompareFunction.Always);
  118.                 outlineFillMaterial.SetFloat("_ZTest", (float)UnityEngine.Rendering.CompareFunction.LessEqual);
  119.                 outlineFillMaterial.SetFloat("_OutlineWidth", outlineWidth);
  120.                 break;
  121.  
  122.             case Mode.OutlineHidden:
  123.                 outlineMaskMaterial.SetFloat("_ZTest", (float)UnityEngine.Rendering.CompareFunction.Always);
  124.                 outlineFillMaterial.SetFloat("_ZTest", (float)UnityEngine.Rendering.CompareFunction.Greater);
  125.                 outlineFillMaterial.SetFloat("_OutlineWidth", outlineWidth);
  126.                 break;
  127.  
  128.             case Mode.OutlineAndSilhouette:
  129.                 outlineMaskMaterial.SetFloat("_ZTest", (float)UnityEngine.Rendering.CompareFunction.LessEqual);
  130.                 outlineFillMaterial.SetFloat("_ZTest", (float)UnityEngine.Rendering.CompareFunction.Always);
  131.                 outlineFillMaterial.SetFloat("_OutlineWidth", outlineWidth);
  132.                 break;
  133.  
  134.             case Mode.SilhouetteOnly:
  135.                 outlineMaskMaterial.SetFloat("_ZTest", (float)UnityEngine.Rendering.CompareFunction.LessEqual);
  136.                 outlineFillMaterial.SetFloat("_ZTest", (float)UnityEngine.Rendering.CompareFunction.Greater);
  137.                 outlineFillMaterial.SetFloat("_OutlineWidth", 0);
  138.                 break;
  139.         }
  140.     }
  141.  
  142. }
  143.  
Advertisement
Add Comment
Please, Sign In to add comment