Q弹效果
一个小小的脚本。Unity shader实现Sprite的Q弹效果。打算用来整一个厌世猫猫合唱团233333
思路
脚本可设置两个变量,持续时间,弹动频率,弹动高度。在持续时间内,根据变化函数对vertex位置进行修改。
常用的几个变种…懒得分文件和整合,在此记录一下:
- y轴弹簧
v2f vert(appdata v)
{
v2f o;
float t = _Time.y - _PointTime;
// 在点击和指定变化时间内弹性变化
if (t > 0 && t < _Duration)
{
// 拉伸幅度和位置的关系
float r = 1 - saturate(length(v.vertex.y - _Force) / _Position.w);
// 弹动随时间逐渐复原
float l = 1 - t / _Duration;
//改变弹动时vertex的位置
v.vertex.y += r * l * sin(t * _Frequency);//这里仅加上竖直方向弹动,当然也可以改改改成其他形式的弹动
}
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
- 根据碰撞位置变形
v2f vert(appdata v)
{
v2f o;
float t = _Time.y - _PointTime;
if (t > 0 && t < _Duration)
{
float r = 1 - saturate(length(v.vertex.xy - _Position.xy) / _Position.w);
float l = 1 - t / _Duration;
v.vertex.x += r * l * cos(t * _Frequency);
v.vertex.y += r * l * cos(t * _Frequency);
}
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
- 迷之晃圈圈
v2f vert(appdata v)
{
v2f o;
float t = _Time.y - _PointTime;
if (t > 0 && t < _Duration)
{
float rx = 1 - saturate(length(v.vertex.x)/ _Position.w);
float ry = 1 - saturate(length(v.vertex.y) / _Position.w);
float l = 1 - t / _Duration;
v.vertex.x += rx * l * sin(t * _Frequency);
v.vertex.y += ry * l * cos(t * _Frequency);
}
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
- scaling
v2f vert(appdata v)
{
v2f o;
float t = _Time.y - _PointTime;
if (t > 0 && t < _Duration)
{
float l = 1 - t / _Duration;
v.vertex.x *= l * (abs(sin(t * _Frequency))) + 1;
v.vertex.y *= l * (abs(sin(t * _Frequency))) + 1;
}
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
- 3D版本
晚点补上,道理一样,就多了个法线
repo
话外
面无表情中透漏着一丝不羁…魔性MAX…→ω→