Technobabble

Technobabble is a fast-paced beat ‘em up platformer that focuses on delivering an experience of fluid, free-flowing movement. This was a two semester project where I joined a team of 19 after their one semester vertical slice phase.


Tools

One of the game’s main features was a rhythm-based event system that let enemies, platforms, and menu elements act to the beat of the background music. When I joined, my first role was to develop a way to abstract the data this system worked with. The solution involved collecting all the varied data into one object type and registering it as a custom Unreal asset.


UENUM(BlueprintType)
enum class EBeatType : uint8
{
	BT_OffBeat UMETA(DisplayName="OffBeat"),
	BT_UpBeat UMETA(DisplayName="UpBeat"),
	BT_DownBeat UMETA(DisplayName="DownBeat")
};

USTRUCT(BlueprintType)
struct FTimelineEvent
{
	GENERATED_USTRUCT_BODY()

public:
	// The type of beat for this event
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	EBeatType type;

	// The time it takes place on the timeline
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float time;

	// The time before which the player is considered too early
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float windowEarly;

	// The time after which the player is considered too late
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float windowLate;
};

UCLASS(BlueprintType)
class TECHNOBABBLE_API UConductorData : public UObject
{
	GENERATED_BODY()
	
public:
	// Audio file (or Sound Cue) for playback
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	USoundBase *Music;

	// Float curve for the timelines to follow
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	UCurveFloat *TimelineMeasure;

	// The song's bpm affects the speed of the timelines
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float BPM;

	// Array of timing events
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	TArray<FTimelineEvent> Events;
};
			
		

Then, I could refactor the rhythm system to have the timelines based their entire configuration off of whichever asset it's given. The final result gave level designers the ability to script a change in music while keeping everything synced during runtime.

Player Controller

The movement mechanics are meant to mimic the qualities of rollerblading, so at certain times the player's input is modified:

  • While moving above a certain speed, if the player suddenly switches their input against their current velocity, apply an impulse force in the opposite direction.
  • Moving on sloped surfaces will damp their max speed and apply a growing downward force if the player doesn’t provide input.
  • If the player stops providing input while moving, the velocity at that moment is preserved and the character slows to a stop.