77 lines
2.4 KiB
C#
77 lines
2.4 KiB
C#
|
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;
|
|||
|
// 扇形边线参数,四座标代表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);
|
|||
|
}
|
|||
|
}
|