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