Skip to content

Commit 7a765c3

Browse files
committed
feat: add TransitionAutoSpeed property
You can use this property to loop the TransitionRate without tweener or animation.
1 parent b57e98b commit 7a765c3

File tree

4 files changed

+43
-7
lines changed

4 files changed

+43
-7
lines changed

Packages/src/Editor/UIEffectEditor.cs

+8
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public class UIEffect2Editor : Editor
5353
private SerializedProperty _transitionColor;
5454
private SerializedProperty _transitionColorGlow;
5555
private SerializedProperty _transitionPatternReverse;
56+
private SerializedProperty _transitionAutoPlaySpeed;
5657

5758
private SerializedProperty _targetMode;
5859
private SerializedProperty _targetColor;
@@ -126,6 +127,7 @@ private void OnEnable()
126127
_transitionColor = serializedObject.FindProperty("m_TransitionColor");
127128
_transitionColorGlow = serializedObject.FindProperty("m_TransitionColorGlow");
128129
_transitionPatternReverse = serializedObject.FindProperty("m_TransitionPatternReverse");
130+
_transitionAutoPlaySpeed = serializedObject.FindProperty("m_TransitionAutoPlaySpeed");
129131

130132
_targetMode = serializedObject.FindProperty("m_TargetMode");
131133
_targetColor = serializedObject.FindProperty("m_TargetColor");
@@ -253,6 +255,12 @@ public void DrawProperties()
253255
EditorGUILayout.PropertyField(_transitionColorGlow);
254256
}
255257

258+
EditorGUILayout.PropertyField(_transitionAutoPlaySpeed);
259+
if (0 < _transitionFilter.intValue && !Mathf.Approximately(0, _transitionAutoPlaySpeed.floatValue))
260+
{
261+
EditorApplication.QueuePlayerLoopUpdate();
262+
}
263+
256264
EditorGUI.indentLevel--;
257265
}
258266

Packages/src/Runtime/UIEffect.cs

+19
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@ public class UIEffect : UIEffectBase
9696
[SerializeField]
9797
protected bool m_TransitionPatternReverse = false;
9898

99+
[Range(-5, 5)]
100+
[SerializeField]
101+
protected float m_TransitionAutoPlaySpeed = 0f;
102+
99103
[SerializeField]
100104
protected TargetMode m_TargetMode = TargetMode.None;
101105

@@ -515,6 +519,18 @@ public bool transitionPatternReverse
515519
}
516520
}
517521

522+
public float transitionAutoPlaySpeed
523+
{
524+
get => m_TransitionAutoPlaySpeed;
525+
set
526+
{
527+
value = Mathf.Clamp(value, -5, 5);
528+
if (Mathf.Approximately(m_TransitionAutoPlaySpeed, value)) return;
529+
context.transitionAutoPlaySpeed = m_TransitionAutoPlaySpeed = value;
530+
SetMaterialDirty();
531+
}
532+
}
533+
518534
public TargetMode targetMode
519535
{
520536
get => m_TargetMode;
@@ -957,6 +973,7 @@ protected override void UpdateContext(UIEffectContext c)
957973
c.transitionColor = m_TransitionColor;
958974
c.transitionColorGlow = m_TransitionColorGlow;
959975
c.transitionPatternReverse = m_TransitionPatternReverse;
976+
c.transitionAutoPlaySpeed = m_TransitionAutoPlaySpeed;
960977

961978
c.targetMode = m_TargetMode;
962979
c.targetColor = m_TargetColor;
@@ -1094,6 +1111,7 @@ public void LoadPreset(UIEffect preset)
10941111
m_TransitionColor = preset.m_TransitionColor;
10951112
m_TransitionColorGlow = preset.m_TransitionColorGlow;
10961113
m_TransitionPatternReverse = preset.m_TransitionPatternReverse;
1114+
m_TransitionAutoPlaySpeed = preset.m_TransitionAutoPlaySpeed;
10971115

10981116
m_TargetMode = preset.m_TargetMode;
10991117
m_TargetColor = preset.m_TargetColor;
@@ -1165,6 +1183,7 @@ internal void CopyFrom(UIEffectContext c)
11651183
m_TransitionColor = c.transitionColor;
11661184
m_TransitionColorGlow = c.transitionColorGlow;
11671185
m_TransitionPatternReverse = c.transitionPatternReverse;
1186+
m_TransitionAutoPlaySpeed = c.transitionAutoPlaySpeed;
11681187

11691188
m_TargetMode = c.targetMode;
11701189
m_TargetColor = c.targetColor;

Packages/src/Runtime/UIEffectContext.cs

+4
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public class UIEffectContext
3333
private static readonly int s_TransitionColor = Shader.PropertyToID("_TransitionColor");
3434
private static readonly int s_TransitionColorGlow = Shader.PropertyToID("_TransitionColorGlow");
3535
private static readonly int s_TransitionPatternReverse = Shader.PropertyToID("_TransitionPatternReverse");
36+
private static readonly int s_TransitionAutoPlaySpeed = Shader.PropertyToID("_TransitionAutoPlaySpeed");
3637
private static readonly int s_TargetColor = Shader.PropertyToID("_TargetColor");
3738
private static readonly int s_TargetRange = Shader.PropertyToID("_TargetRange");
3839
private static readonly int s_TargetSoftness = Shader.PropertyToID("_TargetSoftness");
@@ -188,6 +189,7 @@ public class UIEffectContext
188189
public Color transitionColor = new Color(0f, 0.5f, 1.0f, 1.0f);
189190
public bool transitionColorGlow;
190191
public bool transitionPatternReverse;
192+
public float transitionAutoPlaySpeed;
191193

192194
public TargetMode targetMode = TargetMode.None;
193195
public Color targetColor = Color.white;
@@ -269,6 +271,7 @@ public void CopyFrom(UIEffectContext preset)
269271
transitionColorFilter = preset.transitionColorFilter;
270272
transitionColorGlow = preset.transitionColorGlow;
271273
transitionPatternReverse = preset.transitionPatternReverse;
274+
transitionAutoPlaySpeed = preset.transitionAutoPlaySpeed;
272275

273276
targetMode = preset.targetMode;
274277
targetColor = preset.targetColor;
@@ -343,6 +346,7 @@ public void ApplyToMaterial(Material material, float actualSamplingScale = 1f)
343346
material.SetColor(s_TransitionColor, transitionColor);
344347
material.SetInt(s_TransitionColorGlow, transitionColorGlow ? 1 : 0);
345348
material.SetInt(s_TransitionPatternReverse, transitionPatternReverse ? 1 : 0);
349+
material.SetFloat(s_TransitionAutoPlaySpeed, transitionAutoPlaySpeed);
346350

347351
material.SetColor(s_TargetColor, targetColor);
348352
material.SetFloat(s_TargetRange, Mathf.Clamp01(targetRange));

Packages/src/Shaders/UIEffect.cginc

+12-7
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,11 @@ float2 texel_size()
7272
return _MainTex_TexelSize.xy * _SamplingScale;
7373
}
7474

75+
float transition_rate()
76+
{
77+
return frac(_TransitionAutoPlaySpeed * _Time.y + _TransitionRate);
78+
}
79+
7580
float3 rgb_to_hsv(float3 c)
7681
{
7782
const float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
@@ -101,8 +106,8 @@ float transition_alpha(float2 uvLocal)
101106
return 1;
102107
#elif TRANSITION_PATTERN
103108
{
104-
const half scale = lerp(100, 10, _TransitionWidth);
105-
const half2 time = half2(-_TransitionRate * 2, 0);
109+
const half scale = lerp(100, 1, _TransitionWidth);
110+
const half2 time = half2(-transition_rate() * 2, 0);
106111
uv = uvLocal * _TransitionTex_ST.xy * scale + _TransitionTex_ST.zw + time;
107112
}
108113
#else
@@ -112,7 +117,7 @@ float transition_alpha(float2 uvLocal)
112117
#endif
113118

114119
const float alpha = tex2D(_TransitionTex, uv).a;
115-
return (1 - alpha) * _TransitionReverse + alpha * (1 - _TransitionReverse);
120+
return _TransitionReverse ? 1 - alpha : alpha;
116121
}
117122

118123

@@ -424,7 +429,7 @@ float2 move_transition_filter(const float4 uvMask, const float alpha)
424429
}
425430
#endif
426431

427-
const float factor = alpha - _TransitionRate * (1 + _TransitionWidth * 1.5) + _TransitionWidth;
432+
const float factor = alpha - transition_rate() * (1 + _TransitionWidth * 1.5) + _TransitionWidth;
428433
const float band = max(0, _TransitionWidth - factor);
429434

430435
#if TRANSITION_MELT
@@ -444,11 +449,11 @@ half4 apply_transition_filter(half4 color, const float alpha, const float2 uvLoc
444449
{
445450
#if TRANSITION_FADE // Transition.Fade
446451
{
447-
color *= saturate(alpha + 1 - _TransitionRate * 2);
452+
color *= saturate(alpha + 1 - transition_rate() * 2);
448453
}
449454
#elif TRANSITION_CUTOFF // Transition.Cutoff
450455
{
451-
color *= step(0.001, alpha - _TransitionRate);
456+
color *= step(0.001, alpha - transition_rate());
452457
}
453458
#elif TRANSITION_PATTERN // Transition.Pattern
454459
{
@@ -461,7 +466,7 @@ half4 apply_transition_filter(half4 color, const float alpha, const float2 uvLoc
461466
// Transition.Dissolve/Shiny/ShinyOnly/Melt
462467
#elif TRANSITION_DISSOLVE || TRANSITION_SHINY || TRANSITION_MASK || TRANSITION_MELT || TRANSITION_BURN
463468
{
464-
const float factor = alpha - _TransitionRate * (1 + _TransitionWidth) + _TransitionWidth;
469+
const float factor = alpha - transition_rate() * (1 + _TransitionWidth) + _TransitionWidth;
465470
const float softness = max(0.0001, _TransitionWidth * _TransitionSoftness);
466471
const fixed bandLerp = saturate((_TransitionWidth - factor) * 1 / softness);
467472
const fixed softLerp = saturate(factor * 2 / softness);

0 commit comments

Comments
 (0)