@startuml Geometry Dash - Diagramme de classe skinparam style strictuml skinparam classAttributeIconSize 0 skinparam classFontStyle Bold hide enum methods package UnityEngine { class GameObject { } class MonoBehaviour { } class Rigidbody2D { } class Transform { } class ParticleSystem { } class SpriteRenderer { } class Collider2D { } class Collision2D { } class Vector3 { } class Vector2 { } class Quaternion { } class Mathf { {method} + Lerp(...) {static} {method} + Round(...) {static} {method} + Clamp(...) {static} {method} + Sin(...) {static} {method} + Abs(...) {static} {method} + DeltaAngle(...) {static} {method} + MoveTowardsAngle(...) {static} {method} + RoundToInt(...) {static} } class Time { {method} + deltaTime: float {static} {readOnly} {method} + timeScale: float {static} } class Input { {method} + GetKey(...) {static} {method} + GetKeyDown(...) {static} {method} + GetMouseButtonDown(...) {static} {method} + GetMouseButtonUp(...) {static} {method} + GetAxis(...) {static} } class Camera { {method} + main: Camera {static} {readOnly} {method} + ScreenToWorldPoint(...) } class Physics2D { {method} + OverlapBoxAll(...) {static} {method} + RaycastAll(...) {static} {method} + OverlapPoint(...) {static} {method} + OverlapAreaAll(...) {static} } class Resources { {method} + Load(...) {static} {method} + LoadAll(...) {static} } class PlayerPrefs { {method} + GetFloat(...) {static} {method} + SetFloat(...) {static} {method} + HasKey(...) {static} } class AudioSource { {method} + volume: float {method} + clip: AudioClip {method} + Play() {method} + Pause() } class AudioClip { } class Slider { } class Button { } class Image { } class RectTransform { } class Bounds { } class Debug { {method} + Log(...) {static} {method} + LogWarning(...) {static} {method} + LogError(...) {static} } class Application { {method} + persistentDataPath: string {static} {readOnly} {method} + dataPath: string {static} {readOnly} {method} + Quit() {static} } class Canvas { {method} + ForceUpdateCanvases() {static} } class UnityEngine.Object { {method} + FindAnyObjectByType(...) {static} } class Renderer { } } package UnityEngine.SceneManagement { class SceneManager { {method} + LoadScene(...) {static} {method} + LoadSceneAsync(...) {static} {method} + GetActiveScene(...) {static} } } package UnityEngine.UI { class Text { } } package TMPro { class TMP_Text { } } package System { package IO { class Path { {method} + Combine(...) {static} {method} + GetFileNameWithoutExtension(...) {static} } class File { {method} + Exists(...) {static} {method} + ReadAllText(...) {static} {method} + WriteAllText(...) {static} {method} + Copy(...) {static} {method} + GetExtension(...) {static} {method} + GetFileName(...) {static} {method} + GetFileNameWithoutExtension(...) {static} } class Directory { {method} + Exists(...) {static} {method} + CreateDirectory(...) {static} } } package Collections { class IEnumerator { } package Generic { class List { } } } } package SimpleFileBrowser { class FileBrowser { {method} + WaitForLoadDialog(...) {static} {method} + WaitForSaveDialog(...) {static} {method} + Success: bool {static} {readOnly} {method} + Result: string[*] {static} {readOnly} {method} + PickMode: enumeration {static} {readOnly} } } class PlayerCamera { {field} + playerObject: UnityEngine.GameObject {field} + normalMinYFollow: float {field} + shipMinYFollow: float {field} + smoothSpeed: float {field} - initialY: float {field} + isPlaying: bool {method} - Start() {method} - Update() } PlayerCamera --|> UnityEngine.MonoBehaviour PlayerCamera --> UnityEngine.GameObject : <> PlayerCamera ..> UnityEngine.Mathf : <> PlayerCamera ..> UnityEngine.Time : <> PlayerCamera ..> Player : <> PlayerCamera ..> ShipGameMode : <> PlayerCamera ..> UnityEngine.Transform : <> PlayerCamera ..> UnityEngine.Vector3 : <> class Player { {field} + RigidBody: UnityEngine.Rigidbody2D {get} {private set} {field} + Transform: UnityEngine.Transform {get} {private set} {field} + Particle: UnityEngine.ParticleSystem {get} {private set} {field} + LevelsLoader: LevelsLoader {get} {set} {field} + SpriteRenderer: UnityEngine.SpriteRenderer {get} {private set} {field} + IsColliding: bool {get} {set} {field} + HasStarted: bool {get} {set} {field} + CanJump: bool {get} {set} {field} + CurrentGameMode: IGameMode {get} {set} {field} + SpeedMultiplier: float {method} + Awake() {method} + Start() {method} + Update() {method} + OnCollisionEnter2D(collision: UnityEngine.Collision2D) {method} + OnCollisionExit2D(collision: UnityEngine.Collision2D) {method} + OnTriggerEnter2D(collision: UnityEngine.Collider2D) {method} + ChangeGameMode(newMode: IGameMode) } Player --|> UnityEngine.MonoBehaviour Player *--> UnityEngine.Rigidbody2D : <> Player *--> UnityEngine.Transform : <> Player *--> UnityEngine.ParticleSystem : <> Player o--> LevelsLoader : <> Player *--> UnityEngine.SpriteRenderer : <> Player o--> IGameMode : <> Player ..> UnityEngine.Resources : <> Player ..> UnityEngine.Debug : <> Player ..> ShipPortal : <> Player ..> CubePortal : <> Player ..> BonusBoostSpeed : <> Player ..> BonusSlowSpeed : <> Player ..> NormalGameMode : <> Player ..> UnityEngine.Collision2D : <> Player ..> UnityEngine.Collider2D : <> class PauseMenu { {field} + pauseMenu: UnityEngine.GameObject {field} + pauseButton: UnityEngine.GameObject {field} + levelLoader: LevelLoader {field} + volumeSlider: UnityEngine.UI.Slider {method} + Start() {method} + ChangeVolume() {method} + Pause() {method} + Home() {method} + Resume() } PauseMenu --|> UnityEngine.MonoBehaviour PauseMenu --> UnityEngine.GameObject : <> PauseMenu --> LevelLoader : <> PauseMenu --> UnityEngine.UI.Slider : <> PauseMenu ..> UnityEngine.PlayerPrefs : <> PauseMenu ..> UnityEngine.Time : <> PauseMenu ..> UnityEngine.SceneManagement.SceneManager : <> class MainMenu { {method} + LaunchGame() {method} + OpenImport() {method} + QuitGame() {method} + LevelEditor() {method} + EditorChoice() {method} + CreateLevel() } MainMenu --|> UnityEngine.MonoBehaviour MainMenu ..> UnityEngine.SceneManagement.SceneManager : <> MainMenu ..> UnityEngine.Application : <> class LevelStat { {field} + JsonName: string {get} {set} {field} + totalJumps: Integer {field} + totalAttempts: Integer {field} + progressionPercent: Integer {method} + {static} CreateFromJSON(jsonString: string): LevelStat } LevelStat ..> UnityEngine.JsonUtility : <> class LevelsLoader { {field} + levels: System.Collections.Generic.List {field} + levelCurrent: Level {method} - Start() {method} - LoadAllLevels() {method} - SaveLevelCurrent() {method} + NextLevel() {method} + PreviousLevel() {method} + IncreaseTotalJumps() {method} + IncreaseTotalAttempts() {method} + CalculateCurrentProgressionPercent(playerPosition: UnityEngine.Vector3): Integer {method} + RefreshLevels() } LevelsLoader --|> UnityEngine.MonoBehaviour LevelsLoader *--> Level : <> LevelsLoader ..> UnityEngine.TextAsset : <> LevelsLoader ..> UnityEngine.Resources : <> LevelsLoader ..> System.IO.Path : <> LevelsLoader ..> UnityEngine.Application : <> LevelsLoader ..> System.IO.File : <> LevelsLoader ..> UnityEngine.JsonUtility : <> LevelsLoader ..> LevelStat : <> LevelsLoader ..> UnityEngine.Vector3 : <> LevelsLoader ..> UnityEngine.Mathf : <> LevelsLoader ..> WinnerWall : <> LevelsLoader ..> UnityEngine.GameObject : <> LevelsLoader ..> UnityEngine.Renderer : <> LevelsLoader ..> System.Collections.Generic.List : <> class LevelLoader { {field} + levelsLoader: LevelsLoader {field} + audioSource: UnityEngine.AudioSource {field} + progressionText: UnityEngine.UI.Text {field} - groundY: float {method} - GetPrefab(type: string): UnityEngine.GameObject {method} - LoadAudio() {method} - LoadElements() {method} + Start() {method} + Update() } LevelLoader --|> UnityEngine.MonoBehaviour LevelLoader o--> LevelsLoader : <> LevelLoader *--> UnityEngine.AudioSource : <> LevelLoader --> UnityEngine.UI.Text : <> LevelLoader ..> System.IO.Path : <> LevelLoader ..> UnityEngine.Resources : <> LevelLoader ..> UnityEngine.PlayerPrefs : <> LevelLoader ..> UnityEngine.GameObject : <> LevelLoader ..> UnityEngine.Vector3 : <> LevelLoader ..> UnityEngine.Quaternion : <> LevelLoader ..> UnityEngine.Transform : <> LevelLoader ..> WinnerWall : <> LevelLoader ..> Level : <> LevelLoader ..> Ground : <> LevelLoader ..> UnityEngine.AudioClip : <> LevelLoader ..> UnityEngine.Renderer : <> class LevelEditor { {field} - currentBlock: UnityEngine.GameObject {field} - isPlacingBlock: bool {field} - currentScale: UnityEngine.Vector3 {field} - scaleStep: float {field} + blockGroupContainer: UnityEngine.Transform {field} + buttonPrefabTemplate: UnityEngine.GameObject {field} - currentPage: Integer {field} - buttonsPerPage: Integer {constant} {field} - blockPrefabs: System.Collections.Generic.List {field} - currentButtons: System.Collections.Generic.List {field} - resizingTarget: UnityEngine.GameObject {field} - isResizing: bool {field} - originalMousePos: UnityEngine.Vector3 {field} - originalScale: UnityEngine.Vector3 {field} - currentResizeAxis: ResizeAxis {method} - Start() {method} - LoadPrefabs() {method} - GenerateButtons() {method} - ClearCurrentButtons() {method} + NextPage() {method} + PreviousPage() {method} - SelectPrefab(prefab: UnityEngine.GameObject) {method} - Update() {method} - PlaceBlock() {method} - TrySnapToNearbyBlock() {method} - InstantiateAndPrepare(prefab: UnityEngine.GameObject, scaleOverride: UnityEngine.Vector3?) {method} - HandleBlockRotation() } LevelEditor --|> UnityEngine.MonoBehaviour LevelEditor o--> blockGroupContainer : <> LevelEditor --> buttonPrefabTemplate : <> LevelEditor *--> blockPrefabs : <> LevelEditor *--> currentButtons : <> LevelEditor o--> currentBlock : <> LevelEditor o--> resizingTarget : <> LevelEditor ..> UnityEngine.GameObject : <> LevelEditor ..> UnityEngine.Vector3 : <> LevelEditor ..> UnityEngine.Mathf : <> LevelEditor ..> UnityEngine.Input : <> LevelEditor ..> UnityEngine.Camera : <> LevelEditor ..> UnityEngine.Physics2D : <> LevelEditor ..> UnityEngine.Collider2D : <> LevelEditor ..> UnityEngine.Bounds : <> LevelEditor ..> UnityEngine.SpriteRenderer : <> LevelEditor ..> UnityEngine.UI.Button : <> LevelEditor ..> UnityEngine.UI.Image : <> LevelEditor ..> UnityEngine.RectTransform : <> LevelEditor ..> UnityEngine.Debug : <> LevelEditor ..> System.Collections.Generic.List : <> LevelEditor ..> UnityEngine.Resources : <> LevelEditor ..> Player : <> ' (via tags) LevelEditor ..> Ground : <> ' (via tags) LevelEditor ..> Portal : <> ' (via tags) LevelEditor ..> SmallObstacle : <> ' (via tags) LevelEditor ..> Spike : <> ' (via tags) LevelEditor ..> Block : <> ' (via tags) LevelEditor ..> Bonus : <> ' (via tags) enum ResizeAxis <> { None Horizontal Vertical } LevelEditor *--> ResizeAxis : <> class LevelElement { {field} + type: string {field} + x: float {field} + y: float {field} + scaleX: float {field} + scaleY: float } class Level { {field} + {static} {readOnly} LAST_X: Integer = 15 {field} + JsonName: string {get} {set} {field} + TotalJumps: Integer {get} {set} {field} + TotalAttempts: Integer {get} {set} {field} + ProgressionPercent: Integer {get} {set} {field} + ProgressionPercentMax: Integer {get} {set} {field} + name: string {field} + musicName: string {field} + order: Integer {field} + elements: System.Collections.Generic.List {field} + LastX: float {get} {method} + {static} CreateFromJSON(jsonString: string): Level } Level *--> LevelElement : <> Level ..> UnityEngine.JsonUtility : <> Level ..> System.Collections.Generic.List : <> class JSONImporter { {field} + statusText: TMPro.TMP_Text {method} - Awake() {method} - Start() {method} + ImportJSON() {method} - ShowFileBrowser(): System.Collections.IEnumerator {method} - UpdateStatus(message: string, color: UnityEngine.Color) } JSONImporter --|> UnityEngine.MonoBehaviour JSONImporter --> TMPro.TMP_Text : <> JSONImporter ..> System.Collections.IEnumerator : <> JSONImporter ..> SimpleFileBrowser.FileBrowser : <> JSONImporter ..> System.IO.Path : <> JSONImporter ..> System.IO.File : <> JSONImporter ..> UnityEngine.Color : <> JSONImporter ..> LevelsLoader : <> JSONImporter ..> UnityEngine.Object : <> JSONImporter ..> UnityEngine.Canvas : <> JSONImporter ..> UnityEngine.SceneManagement.SceneManager : <> class JSONExporter { {field} + statusText: TMPro.TMP_Text {field} - editor: LevelEditor {field} - levelsFolder: string {method} - Awake() {method} - Start() {method} + ExportJSON() {method} - ShowSaveDialog(): System.Collections.IEnumerator {method} - SetStatus(message: string, color: UnityEngine.Color) } JSONExporter --|> UnityEngine.MonoBehaviour JSONExporter o--> LevelEditor : <> JSONExporter --> TMPro.TMP_Text : <> JSONExporter ..> System.Collections.IEnumerator : <> JSONExporter ..> System.Collections.Generic.List : <> JSONExporter ..> SimpleFileBrowser.FileBrowser : <> JSONExporter ..> System.IO.Path : <> JSONExporter ..> System.IO.File : <> JSONExporter ..> System.IO.Directory : <> JSONExporter ..> UnityEngine.Collider2D : <> JSONExporter ..> UnityEngine.Object : <> JSONExporter ..> UnityEngine.Vector3 : <> JSONExporter ..> UnityEngine.Mathf : <> JSONExporter ..> UnityEngine.JsonUtility : <> JSONExporter ..> UnityEngine.Color : <> JSONExporter ..> LevelsLoader : <> JSONExporter ..> UnityEngine.Canvas : <> class SerializableElement <> { {field} + type: string {field} + x: float {field} + y: float {field} + scaleX: float {field} + scaleY: float } JSONExporter ..> SerializableElement : <> class LevelData <> { {field} + name: string {field} + musicName: string {field} + order: Integer {field} + elements: SerializableElement[*] } LevelData *--> SerializableElement : <> JSONExporter ..> LevelData : <> interface IGameMode <> { {method} + Update(player: Player) {abstract} {method} + OnCollisionEnter(player: Player, collision: UnityEngine.Collision2D) {abstract} {method} + OnCollisionExit(player: Player, collision: UnityEngine.Collision2D) {abstract} } class ShipGameMode implements IGameMode { {field} - HorizontalSpeed: float {constant} {field} - JumpForce: float {constant} {field} - JumpKey: UnityEngine.KeyCode {constant} {field} - UpperAngle: float {constant} {field} - LowerAngle: float {constant} {field} - RotationTransitionDuration: float {constant} {method} + Update(player: Player) {method} - GetCurrentZAngle(player: Player): float {method} - Jump(player: Player) {method} + OnCollisionEnter(player: Player, collision: UnityEngine.Collision2D) {method} + OnCollisionExit(player: Player, collision: UnityEngine.Collision2D) } ShipGameMode ..|> IGameMode ShipGameMode ..> Player : <> ShipGameMode ..> UnityEngine.Vector2 : <> ShipGameMode ..> UnityEngine.Input : <> ShipGameMode ..> UnityEngine.KeyCode : <> ShipGameMode ..> UnityEngine.Mathf : <> ShipGameMode ..> UnityEngine.Time : <> ShipGameMode ..> UnityEngine.Quaternion : <> ShipGameMode ..> UnityEngine.SceneManagement.SceneManager : <> ShipGameMode ..> UnityEngine.Collision2D : <> ShipGameMode ..> LevelsLoader : <> class NormalGameMode implements IGameMode { {field} - HorizontalSpeed: float {constant} {field} - JumpForce: float {constant} {field} - JumpKey: UnityEngine.KeyCode {constant} {field} - isRotating: bool {field} - targetRotationAngle: float {field} - rotationSpeed: float {readOnly} {method} + Update(player: Player) {method} - Jump(player: Player) {method} - PerformRotation(player: Player) {method} - IsJumping(player: Player): bool {method} - AlignRotation(player: Player) {method} - UpdateParticlePositionAndRotation(player: Player) {method} + OnCollisionEnter(player: Player, collision: UnityEngine.Collision2D) {method} + OnCollisionExit(player: Player, collision: UnityEngine.Collision2D) } NormalGameMode ..|> IGameMode NormalGameMode ..> Player : <> NormalGameMode ..> UnityEngine.Vector2 : <> NormalGameMode ..> UnityEngine.Input : <> NormalGameMode ..> UnityEngine.KeyCode : <> NormalGameMode ..> UnityEngine.Mathf : <> NormalGameMode ..> UnityEngine.Time : <> NormalGameMode ..> UnityEngine.Quaternion : <> NormalGameMode ..> UnityEngine.SceneManagement.SceneManager : <> NormalGameMode ..> UnityEngine.Collision2D : <> NormalGameMode ..> LevelsLoader : <> NormalGameMode ..> UnityEngine.Vector3 : <> ' Tags class ShipPortal { } class CubePortal { } class BonusBoostSpeed { } class BonusSlowSpeed { } class Kill { } class Win { } class Ground { } class WinnerWall { } class Block { } class SmallObstacle { } class Spike { } class Portal { } class Bonus { } Player ..> ShipPortal : <> Player ..> CubePortal : <> Player ..> BonusBoostSpeed : <> Player ..> BonusSlowSpeed : <> ShipGameMode ..> Kill : <> ShipGameMode ..> Win : <> ShipGameMode ..> Ground : <> NormalGameMode ..> Kill : <> NormalGameMode ..> Win : <> LevelLoader ..> WinnerWall : <> LevelLoader ..> Ground : <> LevelEditor ..> Ground : <> LevelEditor ..> Block : <> LevelEditor ..> SmallObstacle : <> LevelEditor ..> Spike : <> LevelEditor ..> Portal : <> LevelEditor ..> Bonus : <> LevelsLoader ..> WinnerWall : <> @enduml