using UnityEngine; using GCGame.Table; public class WarningSector : ParticleCleaner { public float scale = 1.06f; private Transform _innerCircle; private Transform _outerCircle; private Material _innerMaterial; private Material _outerMaterial; private float _sizeTime; private int _scaleId; private int _edgeId; private int _sizeId; private float _animDuration; protected override void Awake() { base.Awake(); _outerCircle = transform.Find("Outer"); _innerCircle = transform.Find("Inner"); _outerMaterial = _outerCircle.GetComponent().material; _innerMaterial = _innerCircle.GetComponent().material; _edgeId = Shader.PropertyToID("_Edge"); _sizeId = Shader.PropertyToID("_Size"); _scaleId = Shader.PropertyToID("_Scale"); } private void Update() { if (_animDuration > 0) { var sizeRatio = Mathf.Clamp01((Time.time - _sizeTime) / _animDuration); _innerMaterial.SetFloat(_sizeId, sizeRatio); } } public void SetEffectData(Tab_Effect effectData) { var radius = effectData.GetParamValuebyIndex(0) * 0.01f * 2f * scale; var degree = effectData.GetParamValuebyIndex(1) * 0.5f * Mathf.Deg2Rad; var size = Vector3.one * radius; _innerCircle.localScale = size; _outerCircle.localScale = size; // 扇形边线参数,四座标代表Cos,1f / Tan,直线sqrt(A ^ 2 + B ^ 2) var edgeParam = new Vector4(Mathf.Cos(degree), 1f / Mathf.Tan(degree), 0f, 0f); edgeParam.z = Mathf.Sqrt(edgeParam.x * edgeParam.x + 1f); _outerMaterial.SetVector(_edgeId, edgeParam); _outerMaterial.SetFloat(_scaleId, radius * 0.25f); var time = effectData.GetParamValuebyIndex(2); if (time > 0) { _animDuration = time.ToClientTime(); _sizeTime = Time.time; _innerCircle.gameObject.SetActive(true); _innerMaterial.SetVector(_edgeId, edgeParam); _innerMaterial.SetFloat(_scaleId, radius * 0.25f); Update(); } else { _animDuration = -1f; _innerCircle.gameObject.SetActive(false); } } private void OnDestroy() { if (_innerMaterial != null) Destroy(_innerMaterial); if (_outerMaterial != null) Destroy(_outerMaterial); } }