using System.Collections.Generic; using Module.Log; using UnityEngine; public class UICameraMaskable : MonoBehaviour { public static int clipAreaPropertyId; public UICameraMask mask { get; private set; } private List materialList; private bool started; private void OnEnable() { if (started) { mask = GetParentMask(transform); if (mask == null) { LogModule.WarningLog(string.Format("物体{0}上的UICameraMaskable无法找到Mask!", gameObject.name)); UICameraMask.RemoveClipForOne(this); } else { mask.AddClippable(this); } } } private void OnDisable() { if (mask != null) mask.RemoveClippable(this); } private void OnDestroy() { for (int i = 0; i < materialList.Count; i++) Destroy(materialList[i]); } private void Start() { if (clipAreaPropertyId == 0) clipAreaPropertyId = Shader.PropertyToID("_ClipArea"); materialList = new List(); var renderers = GetComponentsInChildren(); for (int i = 0; i < renderers.Length; i++) for (int j = 0; j < renderers[i].materials.Length; j++) materialList.Add(renderers[i].materials[j]); started = true; OnEnable(); } private static UICameraMask GetParentMask(Transform child) { Transform parent = child.parent; if (parent == null) return null; else { var uiCameraMask = parent.GetComponent(); if (uiCameraMask) return uiCameraMask; else return GetParentMask(parent); } } public void SetClipRect(Vector4 area) { for (int i = 0; i < materialList.Count; i++) materialList[i].SetVector(clipAreaPropertyId, area); } }