using EPOOutline; using System.Collections.Generic; using UnityEngine; using WS; [ObjectSystem] public class HighlightComponentAwakSystem : AwakeSystem { public override void Awake(HighlightComponent self) { self.Awake(); } } ///高亮管理组件 public class HighlightComponent : SingleComponent { ///高亮数据 private class HighlightData { ///高亮组件 public Outlinable outlinable; /// public bool IsOften; } ///所有高亮物体 private Dictionary AllHighlight = new Dictionary(); ///默认颜色 private Color DefaultColor; public void Awake() { DefaultColor = new Color(1, 1, 0, 1); } ///开启高亮 public void OpenHighlight(GameObject obj) { OpenHighlight(obj, DefaultColor); } ///开启高亮 public void OpenHighlight(GameObject obj, Color color) { Add(obj, color); } ///关闭高亮 public void CloseHighlight(GameObject obj) { Remove(obj); } /////开启常亮高亮 //public void OpenOftenHighlight(GameObject obj) //{ // OpenOftenHighlight(obj, DefaultColor); //} ///开启常亮高亮 public void OpenOftenHighlight(GameObject obj, Color color) { Add(obj, color, true); } ///关闭常亮高亮 public void CloseOftenHighlight(GameObject obj) { Remove(obj, true); } ///开启高亮 private void Add(GameObject obj, Color color, bool isoften = false) { if (!AllHighlight.ContainsKey(obj)) { Outlinable outlinable = obj.AddComponent(); outlinable.FrontParameters.Color = color; outlinable.AddAllChildRenderersToRenderingList(RenderersAddingMode.SkinnedMeshRenderer | RenderersAddingMode.MeshRenderer | RenderersAddingMode.SpriteRenderer); AllHighlight.Add(obj, new HighlightData { outlinable = outlinable, IsOften = isoften }); } AllHighlight[obj].outlinable.FrontParameters.Color = color; } ///移除 private void Remove(GameObject obj, bool isoften = false) { if (AllHighlight.ContainsKey(obj)) { HighlightData data = AllHighlight[obj]; if (!isoften && data.IsOften) { return; } AllHighlight.Remove(obj); UnityEngine.Object.Destroy(data.outlinable); } } public void OpenOftenHighlight(GameObject obj) { } public void SetOperateObjLayer(Transform transform, int layer) { transform.gameObject.layer = layer; foreach (Transform child in transform) { SetOperateObjLayer(child, layer); } } }