作者:lashley谢 | 来源:互联网 | 2023-08-21 16:49
最近项目有一个需求: 用图片实现桶中的水涨效果
效果如下:
![效果图](https://www.#.com/go/Ly9pbWctYmxvZy5jc2RuLm5ldC8yMDE4MDMxNDAwMTMzMTc5Nj93YXRlcm1hcmsvMi90ZXh0L0x5OWliRzluTG1OelpHNHVibVYwTDNGeFh6SXlNakU0TURBMS9mb250LzVhNkw1TDJUL2ZvbnRzaXplLzQwMC9maWxsL0kwSkJRa0ZDTUE9PS9kaXNzb2x2ZS83MA==)
找不到好的贴图,效果比较丑,请见谅! 哈哈!
思路: 修改贴图的像素值,具体做法见代码
using DG.Tweening;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class PixelBoDong : MonoBehaviour {
public RawImage CurRawImage;
[Header("动画时间")]
public float AnimTime = 3f;
[Header("波动底图")]
public Texture2D ShowTexture;
[Header("当前波动的起始高度,百分比相对于贴图高度")]
public float HPrecent;
[Header("当前波动振幅,相对于贴图高度")]
public float CurSwingPrecent;
[Header("波动周期")]
public float CurSwingCycle;
[Header("相位值,百分比相对于贴图宽度")]
public float CurXiangWei;
private int m_CurSwingValue;
private Color32[] m_PixelsBase;
private Color32[] m_PixelsDrawLine;
private Tween m_CurTween;
private void Awake()
{
InitData();
}
private void InitData()
{
HPrecent = Mathf.Clamp(HPrecent, 0, 1f);
CurSwingPrecent = Mathf.Clamp(CurSwingPrecent, 0, 1f);
CurXiangWei = Mathf.Clamp(CurXiangWei, 0, 1f);
}
[ContextMenu("Ceshi")]
public void DrawBoDongAnim()
{
if (m_CurTween != null) {
m_CurTween.Kill();
m_CurTween = null;
}
if (ShowTexture == null) return;
ShowTexture = GameObject.Instantiate(ShowTexture);
m_CurSwingValue = Convert.ToInt32(CurSwingPrecent * ShowTexture.height);
CurRawImage.texture = ShowTexture;
CurRawImage.SetNativeSize();
m_PixelsBase = ShowTexture.GetPixels32();
int baseH;
m_PixelsDrawLine = new Color32[m_PixelsBase.Length];
float endValue = ShowTexture.width * CurXiangWei;
m_CurTween = DOTween.To(() => 0, (v) =>
{
baseH = Convert.ToInt32(HPrecent * Mathf.Clamp(v, 0, endValue) / endValue * ShowTexture.width);
Array.Copy(m_PixelsBase, m_PixelsDrawLine, m_PixelsBase.Length);
for (int i = 0, len = ShowTexture.width; i float tmpD = m_CurSwingValue * Mathf.Sin(CurSwingCycle * i - v);
int tmpH = Mathf.Clamp(Convert.ToInt32(tmpD) + baseH, 0, ShowTexture.height - 1);
for (int y = tmpH, lenY = ShowTexture.height; y new Color32(1, 1, 1, 0);
}
}
ShowTexture.SetPixels32(m_PixelsDrawLine);
ShowTexture.Apply();
}, endValue, AnimTime).SetEase(Ease.Linear).SetLoops(-1, LoopType.Incremental);
}
}
注意事项
- 打开贴图的可读写属性
- 贴图的格式为 RGBA32、ARGB32、 RGB24 and Alpha8
- 需引入DOTween 插件,但最后提供的包中已包含该插件
- 导入下面的包后,打开Main场景,需要自己手动调用动画函数,具体见代码
完整包下载地址
地址:https://pan.baidu.com/s/14le2NLYYcmr8cet-zCff8w
密码:zn0i