# 虚幻4渲染编程(UI篇)【第二卷:程序化UI特效-[1]】
当遇见某些特殊需求,比如对游戏效果有很多变化的要求,这时使用静态的贴图就不太适合了,这时候就需要实时计算绘制出来的数据。下面就来总结一些常用的程序化UI效果,下面的效果将全部使用公式计算的方式生成,不使用一张贴图。
------
## **【1】律动波形**
![img](ProgUIEffect.assets/v2-317773f6929bd55a90d0e5e346bde0ce_b.jpg)
![img](ProgUIEffect.assets/v2-b4ed86effa7f88394c1c55434061355b_hd.jpg)
使用 ![y = asin(Prog UI Effect.assets/equation.svg) + d](https://www.zhihu.com/equation?tex=y+%3D+asin%28bx+%2B+c%29+%2B+d) 这个简单的公式,把图像画出来
![img](ProgUIEffect.assets/v2-23cd690a7f39cbbad8d66e41071a6206_b.jpg)
然后重复一次相减即可得到一条细线。然后再重叠第二个波上去,即可得到更有变化的效果。我这里只叠加了两个波,如果还想更丰富还可以继续往上叠。
把自变量x变成整数就可以得到柱状波形
![img](ProgUIEffect.assets/v2-050d6a57304846cd6b0fa37c0b62349f_hd.jpg)
![img](ProgUIEffect.assets/v2-5c152269bee1e1fd93a92fda1c9c5b2c_b.jpg)
![img](ProgUIEffect.assets/v2-eaaad36599f3b91d7c766f053fd308c5_hd.jpg)
如果不和Y的绝对值比较的话,可以得到一边的效果
![img](ProgUIEffect.assets/v2-e13536f5a991e29529dcbc7cbbd8df89_b.jpg)
------
## **【2】技能冷却**
![img](ProgUIEffect.assets/v2-578b2b10be88ab5cbf2902ff4bd1ed1e_b.jpg)
![img](ProgUIEffect.assets/v2-982f1b3bdbab92c705e04054bf792f75_hd.jpg)
先用代码画个圆然后画冷却线
圆
```text
step(distance(uv, float2(0.5, 0.5)) , R);
```
冷却线
```text
step(H, uv.y );
```
如果想要制作扇形效果,可以使用极坐标的方法,先把UV变换到中心点
![img](ProgUIEffect.assets/v2-8cf438a980b72838b0f6a8b1fde99d15_hd.jpg)
然后用极坐标判断即可
![img](ProgUIEffect.assets/v2-5726f6788388b6552b8c04758c76b469_b.jpg)
```text
float SkillTime(float2 uv, float R, float Radius)
{
float2 centeruv = uv - 0.5f;
float cos = dot(normalize(centeruv), float2(1,0));
return step(Radius, cos);
}
```
------
## **【3】旋转扭曲**
使用旋转矩阵变换一下就好了,还是非常简单的
![img](ProgUIEffect.assets/v2-b743f4c4b6b3e6cb00abba5157021a42_b.jpg)
请无视gif压缩产生的马赛克
```text
float2 RotateUV(float2 uv,float2 center, float angle)
{
float PI = 3.1415927f;
float Ang = angle * (2.0f * PI/ 360.0f);
float2 RowX = float2(cos(Ang), -sin(Ang));
float2 RowY = float2(sin(Ang), cos(Ang));
float ArgOne = dot(RowX, uv - center);
float ArgTwo = dot(RowY, uv - center);
return float2(ArgOne, ArgTwo) + center;
}
```
有了最基础的旋转,就可以在此基础上做些其它效果了
![img](ProgUIEffect.assets/v2-20c26e8be1d497d29b363bb59b29708e_b.jpg)
代码如下:
```text
float2 Twirl(float2 uv, float2 centeroffset, float strenth)
{
//Transform uv to center
uv = uv - float2(0.5, 0.5);
//Offset the uv center
float2 delta = uv - centeroffset;
float angle = strenth * length(delta);
float x = cos(angle) * delta.x - sin(angle) * delta.y;
float y = sin(angle) * delta.x + cos(angle) * delta.y;
float RowX = x + centeroffset.x;
float RowY = y + centeroffset.y;
return float2(RowX, RowY);
}
```
Enjoy it!