Skip to content

Commit 3914710

Browse files
committed
added support for loop groups
1 parent 84ee7cb commit 3914710

7 files changed

Lines changed: 183 additions & 13 deletions

File tree

Assets/UIManager/Scripts/Editor.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
using System.Collections;
2+
using System.Collections.Generic;
3+
using UnityEngine;
4+
using UnityEditor;
5+
namespace Rellac.UI.Editor
6+
{
7+
[CustomEditor(typeof(UIManager))]
8+
[CanEditMultipleObjects]
9+
public class UIManagerEditor : UnityEditor.Editor
10+
{
11+
SerializedProperty containsLoopGroup;
12+
SerializedProperty initialPanel;
13+
SerializedProperty loopTransitionSpeed;
14+
SerializedProperty prevTransition;
15+
SerializedProperty nextTransition;
16+
SerializedProperty loopGroup;
17+
18+
void OnEnable()
19+
{
20+
containsLoopGroup = serializedObject.FindProperty("containsLoopGroup");
21+
initialPanel = serializedObject.FindProperty("initialPanel");
22+
loopTransitionSpeed = serializedObject.FindProperty("loopTransitionSpeed");
23+
prevTransition = serializedObject.FindProperty("prevTransition");
24+
nextTransition = serializedObject.FindProperty("nextTransition");
25+
loopGroup = serializedObject.FindProperty("loopGroup");
26+
}
27+
28+
public override void OnInspectorGUI()
29+
{
30+
serializedObject.Update();
31+
EditorGUILayout.PropertyField(containsLoopGroup);
32+
if (containsLoopGroup.boolValue)
33+
{
34+
EditorGUILayout.PropertyField(loopTransitionSpeed);
35+
EditorGUILayout.PropertyField(prevTransition);
36+
EditorGUILayout.PropertyField(nextTransition);
37+
EditorGUILayout.PropertyField(loopGroup);
38+
} else
39+
{
40+
EditorGUILayout.PropertyField(initialPanel);
41+
}
42+
serializedObject.ApplyModifiedProperties();
43+
}
44+
}
45+
}

Assets/UIManager/Scripts/Editor/UIManagerEditor.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/UIManager/Scripts/UIManager.cs

Lines changed: 109 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,36 @@ namespace Rellac.UI
55
[CreateAssetMenu(fileName = "New UI Manager", menuName = "UI/Manager", order = 1)]
66
public class UIManager : ScriptableObject
77
{
8+
/// <summary>
9+
/// Manager loops between a selection of UIPanels
10+
/// </summary>
11+
[Tooltip("")]
12+
[SerializeField] private bool containsLoopGroup = false;
813
/// <summary>
914
/// Panel to start when manager is initialised - no transition will be made
1015
/// </summary>
1116
[Tooltip("Panel to start when manager is initialised - no transition will be made")]
1217
[SerializeField] private UIPanel initialPanel = null;
18+
/// <summary>
19+
/// Speed to play transitions across a loop group
20+
/// </summary>
21+
[Tooltip("Speed to play transitions across a loop group")]
22+
[SerializeField] private float loopTransitionSpeed = 1;
23+
/// <summary>
24+
/// Animation to play when transitioning to the previous panel in a loop group
25+
/// </summary>
26+
[Tooltip("Animation to play when transitioning to the previous panel in a loop group")]
27+
[SerializeField] private UITransition prevTransition = null;
28+
/// <summary>
29+
/// Animation to play when transitioning to the next panel in a loop group
30+
/// </summary>
31+
[Tooltip("Animation to play when transitioning to the next panel in a loop group")]
32+
[SerializeField] private UITransition nextTransition = null;
33+
/// <summary>
34+
/// Group of UIPanels to transition between is manager contains a loop group
35+
/// </summary>
36+
[Tooltip("Group of UIPanels to transition between is manager contains a loop group")]
37+
[SerializeField] private UIPanel[] loopGroup = null;
1338

1439
RectTransform root_;
1540
/// <summary>
@@ -45,6 +70,27 @@ public Animator animator
4570
private bool transitioning = false;
4671
private UIPanel currentPanel;
4772

73+
private int loopIdx_;
74+
private int loopIdx
75+
{
76+
get
77+
{
78+
return loopIdx_;
79+
}
80+
set
81+
{
82+
loopIdx_ = value;
83+
if (loopIdx_ >= loopGroup.Length)
84+
{
85+
loopIdx_ = 0;
86+
}
87+
if (loopIdx < 0)
88+
{
89+
loopIdx = loopGroup.Length - 1;
90+
}
91+
}
92+
}
93+
4894
/// <summary>
4995
/// Initialise manager in scene
5096
/// </summary>
@@ -63,11 +109,18 @@ public void Initialise(RectTransform parent)
63109
fitter.Fit();
64110
}
65111

66-
RectTransform panelRoot = (RectTransform)Instantiate(initialPanel.panelPrefab, inParent).transform;
112+
UIPanel panel = initialPanel;
113+
if (containsLoopGroup)
114+
{
115+
panel = loopGroup[0];
116+
loopIdx = 0;
117+
}
118+
119+
RectTransform panelRoot = (RectTransform)Instantiate(panel.panelPrefab, inParent).transform;
67120
animator.Play("Instant");
68-
initialPanel.Initialise(panelRoot);
69-
root.GetComponent<MonoBehaviour>().StartCoroutine(initialPanel.WaitForTransitionIn(panelRoot));
70-
currentPanel = initialPanel;
121+
panel.Initialise(panelRoot);
122+
root.GetComponent<MonoBehaviour>().StartCoroutine(panel.WaitForTransitionIn(panelRoot, panel.animationSpeed));
123+
currentPanel = panel;
71124
transitioning = false;
72125
}
73126

@@ -76,11 +129,61 @@ public void Initialise(RectTransform parent)
76129
/// </summary>
77130
/// <param name="input">UIPanel to transition to</param>
78131
public void SetPanel(UIPanel input)
132+
{
133+
if (TryPreparePanel(input))
134+
{
135+
input.PlayTransition(this, input.transition, containsLoopGroup ? loopTransitionSpeed : input.animationSpeed);
136+
transitioning = true;
137+
}
138+
}
139+
140+
public void NextPanel()
141+
{
142+
if (CheckIsValidLoopGroup())
143+
{
144+
loopIdx++;
145+
if (TryPreparePanel(loopGroup[loopIdx]))
146+
{
147+
loopGroup[loopIdx].PlayTransition(this, nextTransition, containsLoopGroup ? loopTransitionSpeed : loopGroup[loopIdx].animationSpeed);
148+
transitioning = true;
149+
}
150+
}
151+
}
152+
153+
public void PreviousPanel()
154+
{
155+
if (CheckIsValidLoopGroup())
156+
{
157+
loopIdx--;
158+
if (TryPreparePanel(loopGroup[loopIdx]))
159+
{
160+
loopGroup[loopIdx].PlayTransition(this, prevTransition, containsLoopGroup ? loopTransitionSpeed : loopGroup[loopIdx].animationSpeed);
161+
transitioning = true;
162+
}
163+
}
164+
}
165+
166+
private bool CheckIsValidLoopGroup()
167+
{
168+
if (!containsLoopGroup)
169+
{
170+
Debug.LogError("Trying to Call NextPanel() on a UIManager that doesn't contain a loop group");
171+
return false;
172+
}
173+
if (loopGroup.Length == 0)
174+
{
175+
Debug.LogError("No panels listed in loop group of " + name);
176+
return false;
177+
}
178+
return true;
179+
}
180+
181+
private bool TryPreparePanel(UIPanel input)
79182
{
80183
if (transitioning)
81184
{
82185
Debug.LogError("Wait for transition to end before setting new panel");
83-
return;
186+
return false;
84187
}
85188
if (currentPanel != null)
86189
{
@@ -102,8 +205,7 @@ public void SetPanel(UIPanel input)
102205
}
103206
root.GetComponent<MonoBehaviour>().StartCoroutine(WaitForAnimationEnd(input));
104207
input.Initialise((RectTransform)Instantiate(input.panelPrefab, inParent).transform);
105-
input.PlayTransition(this);
106-
transitioning = true;
208+
return true;
107209
}
108210

109211
private IEnumerator WaitForAnimationEnd(UIPanel panel)

Assets/UIManager/Scripts/UIPanel.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,16 +66,16 @@ public void Initialise(RectTransform input)
6666
/// Play set animation transition for this panel
6767
/// </summary>
6868
/// <param name="manager">UIManager handling Animation</param>
69-
public void PlayTransition(UIManager manager)
69+
public void PlayTransition(UIManager manager, UITransition transition_, float speed)
7070
{
71-
manager.animator.speed = 1f / animationSpeed;
72-
manager.animator.Play(transition.inAnimation.name);
73-
manager.root.GetComponent<MonoBehaviour>().StartCoroutine(WaitForTransitionIn(instantiation));
71+
manager.animator.speed = 1f / speed;
72+
manager.animator.Play(transition_.inAnimation.name);
73+
manager.root.GetComponent<MonoBehaviour>().StartCoroutine(WaitForTransitionIn(instantiation, speed));
7474
}
7575

76-
public IEnumerator WaitForTransitionIn(RectTransform parent)
76+
public IEnumerator WaitForTransitionIn(RectTransform parent, float speed)
7777
{
78-
yield return new WaitForSeconds(transition.inAnimation.length * animationSpeed);
78+
yield return new WaitForSeconds(transition.inAnimation.length * speed);
7979
onPanelTransitionedIn.Invoke(parent);
8080
}
8181

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ An initialised Manager can swap between panels via SetPanel(UIPanel)
2626

2727
![](SetPanel-example.png)
2828

29+
UI Managers can be set to have "loop groups" - if so, you will specify here a previous/next transition to override what is specified in the UIPanels listed on the UIManager. Panels will logically transition by calling NextPanel() and PreviousPanel() in the UIManager, the index will reset automatically. A Manager with a loop group will override the speed of the animation transition. That value is set here.
30+
31+
![](UIManagers-example.png)
32+
2933
# UI Panel
3034
----------
3135
**Create > UI > Panel**

UIManagers-example.png

23.7 KB
Loading

0 commit comments

Comments
 (0)