Skip to content

Commit 3bdc61c

Browse files
committed
feat: add UIEffectReplica component
`UIEffectReplica` component applies visual effects to UI elements by replicating the settings of another `UIEffect` component. This allows the same effect to be applied across multiple UI elements simultaneously.
1 parent 4adb58c commit 3bdc61c

File tree

4 files changed

+183
-0
lines changed

4 files changed

+183
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
using UnityEditor;
2+
3+
namespace Coffee.UIEffects.Editors
4+
{
5+
/// <summary>
6+
/// UIEffect editor.
7+
/// </summary>
8+
[CustomEditor(typeof(UIEffectReplica))]
9+
[CanEditMultipleObjects]
10+
public class UIEffectReplicaEditor : Editor
11+
{
12+
private SerializedProperty _target;
13+
private SerializedProperty _useTargetTransform;
14+
private Editor _uiEffectEditor;
15+
16+
private void OnEnable()
17+
{
18+
_target = serializedObject.FindProperty("m_Target");
19+
_useTargetTransform = serializedObject.FindProperty("m_UseTargetTransform");
20+
}
21+
22+
public override void OnInspectorGUI()
23+
{
24+
serializedObject.Update();
25+
EditorGUILayout.PropertyField(_target);
26+
EditorGUILayout.PropertyField(_useTargetTransform);
27+
28+
if (_target.objectReferenceValue)
29+
{
30+
EditorGUI.BeginDisabledGroup(true);
31+
CreateCachedEditor(_target.objectReferenceValue, null, ref _uiEffectEditor);
32+
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
33+
(_uiEffectEditor as UIEffect2Editor)?.DrawProperties();
34+
EditorGUILayout.EndVertical();
35+
EditorGUI.EndDisabledGroup();
36+
}
37+
38+
serializedObject.ApplyModifiedProperties();
39+
}
40+
}
41+
}

Packages/src/Editor/UIEffectReplicaEditor.cs.meta

+12
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
+119
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
using Coffee.UIEffectInternal;
2+
using UnityEngine;
3+
4+
namespace Coffee.UIEffects
5+
{
6+
public class UIEffectReplica : UIEffectBase
7+
{
8+
[SerializeField] private UIEffect m_Target;
9+
[SerializeField] private bool m_UseTargetTransform = true;
10+
11+
private UIEffect _currentTarget;
12+
private Matrix4x4 _prevTransformHash;
13+
14+
public UIEffect target
15+
{
16+
get => m_Target;
17+
set
18+
{
19+
if (m_Target == value) return;
20+
m_Target = value;
21+
RefreshTarget(m_Target);
22+
SetVerticesDirty();
23+
SetMaterialDirty();
24+
}
25+
}
26+
27+
public bool useTargetTransform
28+
{
29+
get => m_UseTargetTransform;
30+
set
31+
{
32+
if (m_UseTargetTransform == value) return;
33+
m_UseTargetTransform = value;
34+
SetVerticesDirty();
35+
}
36+
}
37+
38+
public override uint effectId => target ? target.effectId : 0;
39+
public override UIEffectContext context => target && target.isActiveAndEnabled ? target.context : null;
40+
41+
public override RectTransform transitionRoot => useTargetTransform && target
42+
? target.transitionRoot
43+
: transform as RectTransform;
44+
45+
protected override void OnEnable()
46+
{
47+
RefreshTarget(target);
48+
UIExtraCallbacks.onBeforeCanvasRebuild += SetVerticesDirtyIfTransformChanged;
49+
CheckTransform();
50+
base.OnEnable();
51+
}
52+
53+
protected override void OnDisable()
54+
{
55+
RefreshTarget(null);
56+
UIExtraCallbacks.onBeforeCanvasRebuild -= SetVerticesDirtyIfTransformChanged;
57+
base.OnDisable();
58+
}
59+
60+
#if UNITY_EDITOR
61+
protected override void OnValidate()
62+
{
63+
RefreshTarget(target);
64+
base.OnValidate();
65+
}
66+
#endif
67+
68+
private void RefreshTarget(UIEffect newTarget)
69+
{
70+
if (_currentTarget == newTarget) return;
71+
if (_currentTarget)
72+
{
73+
_currentTarget.replicas.Remove(this);
74+
}
75+
76+
_currentTarget = newTarget;
77+
if (_currentTarget)
78+
{
79+
_currentTarget.replicas.Add(this);
80+
}
81+
}
82+
83+
protected override void UpdateContext(UIEffectContext c)
84+
{
85+
}
86+
87+
public override void ApplyContextToMaterial()
88+
{
89+
if (!isActiveAndEnabled || !target || !target.isActiveAndEnabled) return;
90+
91+
base.ApplyContextToMaterial();
92+
}
93+
94+
public override void SetRate(float rate, UIEffectTweener.CullingMask mask)
95+
{
96+
}
97+
98+
public override bool IsRaycastLocationValid(Vector2 sp, Camera eventCamera)
99+
{
100+
return !target || target.IsRaycastLocationValid(sp, eventCamera);
101+
}
102+
103+
private bool CheckTransform()
104+
{
105+
return useTargetTransform
106+
&& target
107+
&& transform.HasChanged(target.transform, ref _prevTransformHash,
108+
UIEffectProjectSettings.sensitivity);
109+
}
110+
111+
private void SetVerticesDirtyIfTransformChanged()
112+
{
113+
if (CheckTransform())
114+
{
115+
SetVerticesDirty();
116+
}
117+
}
118+
}
119+
}

Packages/src/Runtime/UIEffectReplica.cs.meta

+11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)