HighlightSeeThroughOccluder.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. namespace HighlightPlus {
  6. public struct MeshData {
  7. public Renderer renderer;
  8. public int subMeshCount;
  9. }
  10. public enum OccluderMode {
  11. BlocksSeeThrough,
  12. TriggersSeeThrough
  13. }
  14. public enum DetectionMethod {
  15. Stencil = 0,
  16. RayCast = 1
  17. }
  18. [ExecuteInEditMode]
  19. public class HighlightSeeThroughOccluder : MonoBehaviour {
  20. public OccluderMode mode = OccluderMode.BlocksSeeThrough;
  21. public DetectionMethod detectionMethod = DetectionMethod.Stencil;
  22. [NonSerialized]
  23. public MeshData[] meshData;
  24. List<Renderer> rr;
  25. void OnEnable () {
  26. if (gameObject.activeInHierarchy) {
  27. Init();
  28. }
  29. }
  30. void Init() {
  31. if (detectionMethod == DetectionMethod.RayCast) {
  32. HighlightEffect.RegisterOccluder(this);
  33. return;
  34. }
  35. if (rr == null) {
  36. rr = new List<Renderer>();
  37. } else {
  38. rr.Clear();
  39. }
  40. GetComponentsInChildren(rr);
  41. int rrCount = rr.Count;
  42. meshData = new MeshData[rrCount];
  43. for (int k = 0; k < rrCount; k++) {
  44. meshData[k].renderer = rr[k];
  45. meshData[k].subMeshCount = 1;
  46. if (rr[k] is MeshRenderer) {
  47. MeshFilter mf = rr[k].GetComponent<MeshFilter>();
  48. if (mf != null && mf.sharedMesh != null) {
  49. meshData[k].subMeshCount = mf.sharedMesh.subMeshCount;
  50. }
  51. } else if (rr[k] is SkinnedMeshRenderer) {
  52. SkinnedMeshRenderer smr = (SkinnedMeshRenderer)rr[k];
  53. meshData[k].subMeshCount = smr.sharedMesh.subMeshCount;
  54. }
  55. }
  56. if (rrCount > 0) {
  57. HighlightEffect.RegisterOccluder(this);
  58. }
  59. }
  60. void OnDisable () {
  61. HighlightEffect.UnregisterOccluder(this);
  62. }
  63. }
  64. }