Files
JJBB/Assets/Project/Script/Common/Utilities/Particle/WarningSector.cs

77 lines
2.4 KiB
C#
Raw Normal View History

2024-08-23 15:49:34 +08:00
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<Renderer>().material;
_innerMaterial = _innerCircle.GetComponent<Renderer>().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;
// 扇形边线参数四座标代表Cos1f / 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);
}
}