示例:文字弹跳效果
工程截图
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 文字弹跳效果
/// </summary>
public class UITextWaveEffect : MonoBehaviour
{
[SerializeField]
private List<RectTransform> childs = new List<RectTransform>();
private List<UIWaveEffect> effects = new List<UIWaveEffect>();
[SerializeField]
private float delayPlay = 0.2f;
[SerializeField]
private float delayCycle = 0.2f;
[SerializeField]
private float speed = 10;
[SerializeField]
private float amplitude = 10; //幅度
private float t;
void Awake()
{
for (int i=0; i< childs.Count; i++)
{
UIWaveEffect effect = new UIWaveEffect();
effect.rectTransform = childs[i];
effect.delayPlay = i * delayPlay;
effect.speed = speed;
effect.amplitude = amplitude;
effects.Add(effect);
}
}
public void Reset()
{
for (int i = 0; i < effects.Count; i++)
{
var effect = effects[i];
effect.Reset();
}
t = 0;
}
private void OnEnable()
{
Reset();
}
void Update()
{
for (int i=0; i< effects.Count; i++)
{
var effect = effects[i];
effect.Update();
}
//最后一个对象弹跳完成后,延迟一定时间再重置播放
if (effects[effects.Count - 1].IsPause)
{
t += Time.deltaTime;
if (t >= delayCycle)
{
Reset();
}
}
}
public class UIWaveEffect
{
public RectTransform rectTransform;
public float delayPlay;
public float speed;
public float amplitude;
private float t0,t1;
private bool pause;
public float Y
{
get
{
Vector2 pos = rectTransform.anchoredPosition;
return pos.y;
}
set
{
Vector2 pos = rectTransform.anchoredPosition;
pos.y = value;
rectTransform.anchoredPosition = pos;
}
}
public bool IsPause
{
get { return pause; }
}
public void Reset()
{
t0 = 0;
t1 = 0;
Y = 0;
pause = false;
}
public void Update()
{
if (pause)
return;
//延迟播放
if (t0 < delayPlay)
{
t0 += Time.deltaTime;
return;
}
t1 += Time.deltaTime * speed;
Y = Mathf.Lerp(0, amplitude, Mathf.Sin(t1));
//播放一次弹跳后暂停
if (t1 >= Mathf.PI)
pause = true;
}
}
}
运行效果