Files
JJBB/Assets/Project/Script/Common/Utilities/Particle/WarningSector.cs
2024-08-23 15:49:34 +08:00

77 lines
2.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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);
}
}