Q弹效果

一个小小的脚本。Unity shader实现Sprite的Q弹效果。打算用来整一个厌世猫猫合唱团233333

思路

脚本可设置两个变量,持续时间弹动频率弹动高度。在持续时间内,根据变化函数对vertex位置进行修改。

常用的几个变种…懒得分文件和整合,在此记录一下:


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


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

晚点补上,道理一样,就多了个法线

repo

代码在此

话外

面无表情中透漏着一丝不羁…魔性MAX…→ω→