Weekly Progress Report #10: Level Select Improvements
Level Quick Select
During playtests, two specific problems came up in relation to the level select:
- "It's hard to figure out which levels I am missing stars in."
- "I don't want to have to spend 30 seconds walking from one level to another if I want to go back to the beginning."
So in order to deal with both of these issues at once, I present: The level Quick Select menu.

The UI needs some tweaking, and it doesn't support controllers yet, but the basic functionality is there, and I think it works very well.
Improved Level Order Tooling
This week I managed to finally make a change I've wanted for a couple months now: Adding difficulty information to the Level Order configuration list. I use the Unity Reorderable List package to make adding and swapping levels very easy. It's a very good package, but I had some trouble getting more information beyond simple level names to display in the collapsed view. This week I finally figured out how:

The trick to it was switching from the [Reorderable] attribute, to using the ReorderableList class. Once I made that change, all I had to do was add an element name callback:
[CustomEditor(typeof(LevelOrder))]
public class LevelOrderEditor : Editor
{
ReorderableList otherLevelsList;
private int maxLevelNameLength = 0;
private void OnEnable()
{
otherLevelsList = new ReorderableList(serializedObject.FindProperty("orderedLevels"));
maxLevelNameLength = 0;
foreach (LevelInfo info in LevelOrder.Instance.Levels())
{
maxLevelNameLength = Mathf.Max(info.name.Length, maxLevelNameLength);
}
otherLevelsList.getElementNameCallback += GetElementName;
}
private string GetElementName(SerializedProperty element)
{
string name = element.FindPropertyRelative("name").stringValue;
int difficulty = element.FindPropertyRelative("difficulty").intValue;
string paddedName = name.PadRight(maxLevelNameLength, ' ').Replace(" ", "\t");
return $"{paddedName} \t [{difficulty}]";
}
}
There's a little bit of logic in there to try to get the difficulty to a somewhat consistent spot. It works fine, and is as good as I need it to be given that the labels don't use a monospaced font.
Bug of the Week
Normally when you restart a level, the game instantly resets your character, as seen in this gif:

But when you completed a level successfully and then retried, the game would do this weird fly-over instead:

The fly-over effect was due to Cinemachine transitioning between two cameras. I changed the transition style to "Cut", but that resulted in a single frame where the camera was in the wrong place. In order to deal with that, I decided to just add a quick screen wipe effect when resetting after a completion. I'd been planning to do something like that for a while, but never really had a reason to until now. I think it's the "proper" effect, because when you reset after a completion, the game will clear out all the attempt ragdolls and reset the replays it's recording, so it acts much more like initially entering a level than retrying a failed attempt.
Changelog
- Remove distant walls from some levels
- Added new level using Rings (this time it's not underwater).
- Level order list now includes difficulty ratings.
- Added new falling level.
- Add another ring level
- Show a message when you automatically explode due to "High Scores Only" toggle.
- Fix bug where restarting after a completing a level caused a camera fly-over or weird clipping.
- Added level quick-select menu.
- Update level quick select with all the level entry points.