11 Commits

12 changed files with 2178 additions and 2178 deletions

View File

@ -49,6 +49,7 @@ jobs:
with:
name: build-windows
path: build/
owerwrite: true
build-macos:
runs-on: "ubuntu-latest"
@ -81,6 +82,7 @@ jobs:
with:
name: build-macos
path: build/
owerwrite: true
build-linux:
runs-on: "ubuntu-latest"
@ -113,6 +115,7 @@ jobs:
with:
name: build-linux
path: build/
owerwrite: true
create-release:
needs: [build-windows, build-macos, build-linux]

File diff suppressed because it is too large Load Diff

View File

@ -7,9 +7,9 @@ public class ShipGameMode : IGameMode
private const float HorizontalSpeed = 8.6f;
private const float JumpForce = 26.6581f;
private const KeyCode JumpKey = KeyCode.Space;
private const float UpperAngle = 45f;
private const float LowerAngle = -45f;
private const float RotationTransitionDuration = 0.5f;
private const float MaxAscentAngle = 45f;
private const float MaxDescentAngle = -45f;
private const float RotationSpeed = 360f;
public void Update(Player player)
{
@ -20,26 +20,28 @@ public class ShipGameMode : IGameMode
if (jumpPressed)
{
Jump(player);
}
if (Input.GetKeyDown(JumpKey))
{
player.Transform.rotation = Quaternion.Euler(0, 0, UpperAngle);
}
else
{
player.Transform.rotation = Quaternion.Euler(0, 0, UpperAngle);
}
float targetAngle;
if (player.RigidBody.linearVelocity.y > 0.1f)
{
float velocityLerp = Mathf.Clamp01(player.RigidBody.linearVelocity.y / JumpForce);
targetAngle = Mathf.Lerp(0f, MaxAscentAngle, velocityLerp);
}
else if (player.RigidBody.linearVelocity.y < -0.1f)
{
float velocityLerp = Mathf.Clamp01(Mathf.Abs(player.RigidBody.linearVelocity.y) / 20f);
targetAngle = Mathf.Lerp(0f, MaxDescentAngle, velocityLerp);
}
else
{
float currentAngle = GetCurrentZAngle(player);
float t = Mathf.Clamp01(Time.deltaTime / RotationTransitionDuration);
float interpolationFactor = Mathf.Sin(t * (Mathf.PI / 2));
float newAngle = Mathf.Lerp(currentAngle, LowerAngle, interpolationFactor);
player.Transform.rotation = Quaternion.Euler(0, 0, newAngle);
targetAngle = 0f;
}
float currentAngle = GetCurrentZAngle(player);
float newAngle = Mathf.MoveTowardsAngle(currentAngle, targetAngle, RotationSpeed * Time.deltaTime);
player.Transform.rotation = Quaternion.Euler(0, 0, newAngle);
if (player.Particle.gameObject.activeSelf)
{
player.Particle.gameObject.SetActive(false);
@ -58,19 +60,21 @@ public class ShipGameMode : IGameMode
public void Jump(Player player)
{
player.RigidBody.linearVelocity = new Vector2(player.RigidBody.linearVelocity.x, 0);
player.RigidBody.AddForce(Vector2.up * JumpForce, ForceMode2D.Impulse);
if (player.LevelsLoader != null)
if (player.RigidBody.linearVelocity.y <= 0.1f)
{
player.LevelsLoader.IncreaseTotalJumps();
player.RigidBody.linearVelocity = new Vector2(player.RigidBody.linearVelocity.x, 0);
player.RigidBody.AddForce(Vector2.up * JumpForce, ForceMode2D.Impulse);
if (player.LevelsLoader != null)
{
player.LevelsLoader.IncreaseTotalJumps();
}
}
}
public void OnCollisionEnter(Player player, Collision2D collision)
{
float currentAngle = GetCurrentZAngle(player);
float shortestAngle = Mathf.DeltaAngle(currentAngle, 0);
player.Transform.rotation = Quaternion.RotateTowards(player.Transform.rotation, Quaternion.Euler(0, 0, 0), Mathf.Abs(shortestAngle));
float snappedAngle = 0f;
player.Transform.rotation = Quaternion.Euler(0, 0, snappedAngle);
}
public void OnCollisionExit(Player player, Collision2D collision)

View File

@ -166,7 +166,6 @@ public class LevelEditor : MonoBehaviour
{
if (!IsPlacementValid())
{
Debug.Log("Placement invalide : collision.");
return;
}
PlaceBlock();
@ -201,7 +200,6 @@ public class LevelEditor : MonoBehaviour
currentBlock = sel;
isPlacingBlock = true;
currentScale = currentBlock.transform.localScale;
Debug.Log($"Sélection : {sel.name}");
}
}
void PlaceBlock()
@ -211,7 +209,6 @@ public class LevelEditor : MonoBehaviour
if (isSpikeType)
{
// 1) Bloquer si on perçoit un spike de même type dans la direction de snap
if (IsBlockedBySameTypeInSnapDirection())
{
Debug.LogError("Impossible de poser un spike sur un autre spike !");
@ -219,7 +216,6 @@ public class LevelEditor : MonoBehaviour
}
else
{
// 2) On snap dans la direction (down/left/up/right), et on détruit si aucun support
if (!SnapSpikeByRotation())
{
Debug.LogError("Impossible de poser un spike dans le vide !");
@ -227,31 +223,41 @@ public class LevelEditor : MonoBehaviour
}
else
{
// 3) On fait lajustement fin (si besoin)
TrySnapToNearbyBlock();
}
}
}
else
{
// tous les autres blocs
TrySnapToNearbyBlock();
if (name.Contains("obstacleblock"))
{
foreach (Transform child in currentBlock.transform)
{
if (child.name.ToLower().Contains("obstaclekiller"))
{
var col = child.GetComponent<BoxCollider2D>();
if (col != null)
{
Vector2 originalSize = col.size;
col.size = new Vector2(originalSize.x, 1f);
col.offset = new Vector2(col.offset.x, -0.5f);
}
}
}
}
}
isPlacingBlock = false;
currentBlock = null;
}
/// <summary>
/// Vérifie quil ny ait pas déjà un spike/smallspike/killzone
/// juste devant le spike selon sa rotation.
/// </summary>
bool IsBlockedBySameTypeInSnapDirection()
{
var col = currentBlock.GetComponent<Collider2D>();
var b = col.bounds;
// 1) Détermine direction de snap (0→down,1→left,2→up,3→right)
int rot = (Mathf.RoundToInt(currentBlock.transform.eulerAngles.z / 90) % 4 + 4) % 4;
Vector2 dir = rot switch
{
@ -261,17 +267,15 @@ public class LevelEditor : MonoBehaviour
_ => Vector2.down
};
// 2) Origine : on place la « boîte » juste en bordure du sprite
float offset = 0.01f;
Vector2 origin = rot switch
{
1 => new Vector2(b.min.x - offset, b.center.y), // gauche
3 => new Vector2(b.max.x + offset, b.center.y), // droite
2 => new Vector2(b.center.x, b.max.y + offset), // haut
_ => new Vector2(b.center.x, b.min.y - offset) // bas
1 => new Vector2(b.min.x - offset, b.center.y), // left
3 => new Vector2(b.max.x + offset, b.center.y), // right
2 => new Vector2(b.center.x, b.max.y + offset), // top
_ => new Vector2(b.center.x, b.min.y - offset) // bottom
};
// 3) On boxcast exactement la taille du sprite pour 100 unités
RaycastHit2D[] hits = Physics2D.BoxCastAll(
origin,
b.size,
@ -293,11 +297,9 @@ public class LevelEditor : MonoBehaviour
if (meIsSpikeFamily && otherIsSpikeFamily)
{
// on bloque absolument tout chevauchement entre ces trois types
return true;
}
// si on tape autre chose (sol, block, bonus…), on arrête le scan
break;
}
@ -306,13 +308,11 @@ public class LevelEditor : MonoBehaviour
bool SnapSpikeByRotation()
{
// Récupère bounds et demi-tailles
var col = currentBlock.GetComponent<Collider2D>();
var b = col.bounds;
float hw = b.extents.x;
float hh = b.extents.y;
// 1) Détermine la rotation en quarts de tour : 0→down, 1→left, 2→up, 3→right
int rot = ((Mathf.RoundToInt(currentBlock.transform.eulerAngles.z / 90f) % 4) + 4) % 4;
Vector2 dir;
switch (rot)
@ -323,12 +323,10 @@ public class LevelEditor : MonoBehaviour
default: dir = Vector2.down; break;
}
// 2) Calcule 3 origines le long de la face « avant » du spike
const float eps = 0.01f;
List<Vector2> origins = new List<Vector2>();
if (dir == Vector2.down || dir == Vector2.up)
{
// face inférieure ou supérieure → balaye laxe X
float y0 = (dir == Vector2.down) ? b.min.y - eps : b.max.y + eps;
origins.Add(new Vector2(b.min.x + 0.1f * b.size.x, y0));
origins.Add(new Vector2(b.center.x, y0));
@ -336,14 +334,12 @@ public class LevelEditor : MonoBehaviour
}
else
{
// face gauche ou droite → balaye laxe Y
float x0 = (dir == Vector2.left) ? b.min.x - eps : b.max.x + eps;
origins.Add(new Vector2(x0, b.min.y + 0.1f * b.size.y));
origins.Add(new Vector2(x0, b.center.y));
origins.Add(new Vector2(x0, b.max.y - 0.1f * b.size.y));
}
// 3) Pour chaque origine, on lance un RaycastAll et on garde le hit le plus proche
float bestDist = float.PositiveInfinity;
RaycastHit2D bestHit = default;
foreach (var o in origins)
@ -361,11 +357,9 @@ public class LevelEditor : MonoBehaviour
}
}
// 4) Aucun support trouvé → échec
if (bestHit.collider == null)
return false;
// 5) Sinon, colle bord à bord
Vector3 p = currentBlock.transform.position;
if (dir == Vector2.down) p.y = bestHit.point.y + hh;
else if (dir == Vector2.up) p.y = bestHit.point.y - hh;
@ -373,7 +367,6 @@ public class LevelEditor : MonoBehaviour
else if (dir == Vector2.right) p.x = bestHit.point.x - hw;
currentBlock.transform.position = new Vector3(p.x, p.y, -1f);
Debug.Log($"Spike snapé {dir} sur « {bestHit.collider.name} » à {currentBlock.transform.position}");
return true;
}
@ -406,7 +399,6 @@ public class LevelEditor : MonoBehaviour
? ResizeAxis.Horizontal
: ResizeAxis.Vertical;
isResizing = true;
Debug.Log($"Début redim {tgt.name} (axe {currentResizeAxis})");
}
void PerformResizing()
@ -422,14 +414,12 @@ public class LevelEditor : MonoBehaviour
if (IsOverlapping(resizingTarget))
{
resizingTarget.transform.localScale = originalScale;
Debug.Log("Redim annulé : collision");
}
if (Input.GetMouseButtonUp(0))
{
isResizing = false;
resizingTarget = null;
currentResizeAxis = ResizeAxis.None;
Debug.Log("Fin redim");
}
}
@ -455,7 +445,6 @@ public class LevelEditor : MonoBehaviour
toD = toD.transform.parent.gameObject;
if (toD == currentBlock) { currentBlock = null; isPlacingBlock = false; }
Destroy(toD);
Debug.Log($"Supprimé {toD.name}");
}
}
@ -472,7 +461,7 @@ public class LevelEditor : MonoBehaviour
var col = currentBlock.GetComponent<Collider2D>();
var b = col.bounds;
float snapDistance = 1f;
float snapDistance = 2f;
float verticalEps = 0.1f;
// === SNAP HORIZONTAL (droite)
@ -484,7 +473,6 @@ public class LevelEditor : MonoBehaviour
if (IsInvalidSnapTarget(h)) continue;
float newX = h.bounds.min.x - b.extents.x;
currentBlock.transform.position = new Vector3(newX, currentBlock.transform.position.y, -1f);
Debug.Log($"Snap horizontal à droite contre {h.name}");
return;
}
@ -496,7 +484,6 @@ public class LevelEditor : MonoBehaviour
if (IsInvalidSnapTarget(h)) continue;
float newX = h.bounds.max.x + b.extents.x;
currentBlock.transform.position = new Vector3(newX, currentBlock.transform.position.y, -1f);
Debug.Log($"Snap horizontal à gauche contre {h.name}");
return;
}
@ -509,7 +496,6 @@ public class LevelEditor : MonoBehaviour
if (IsInvalidSnapTarget(h)) continue;
float newY = h.bounds.max.y + b.extents.y;
currentBlock.transform.position = new Vector3(currentBlock.transform.position.x, newY, -1f);
Debug.Log($"Snap vertical (bas) contre {h.name}");
return;
}
@ -521,7 +507,6 @@ public class LevelEditor : MonoBehaviour
if (IsInvalidSnapTarget(h)) continue;
float newY = h.bounds.min.y - b.extents.y;
currentBlock.transform.position = new Vector3(currentBlock.transform.position.x, newY, -1f);
Debug.Log($"Snap vertical (haut) contre {h.name}");
return;
}
}
@ -554,7 +539,6 @@ public class LevelEditor : MonoBehaviour
void HandleBlockRotation()
{
currentBlock.transform.Rotate(0, 0, -90f);
Debug.Log("Rotation 90°!");
}
void InstantiateAndPrepare(GameObject prefab, Vector3? scaleOverride = null)
@ -582,8 +566,6 @@ public class LevelEditor : MonoBehaviour
Destroy(child.gameObject);
}
Debug.Log("Éditeur vidé.");
currentBlock = null;
isPlacingBlock = false;
currentPage = 0;

View File

@ -80,7 +80,6 @@ public class TestManager : MonoBehaviour
currentPlayer.RigidBody.freezeRotation = true;
currentPlayer.RigidBody.linearVelocity = Vector2.zero;
currentPlayer.SpeedMultiplier = 1f;
// currentPlayer.SpriteRenderer.sprite = Resources.Load<Sprite>("Shapes/BaseSquare");
currentPlayer.ChangeGameMode(gameMode);
isTesting = true;
@ -95,9 +94,7 @@ public class TestManager : MonoBehaviour
currentPlayer.SpriteRenderer.enabled = true;
if (currentPlayer.Particle != null)
currentPlayer.Particle.Play(); // Démarrer la particule
Debug.Log("[TestManager] Test du niveau démarré !");
currentPlayer.Particle.Play();
}
public void StopTest()
@ -112,7 +109,7 @@ public class TestManager : MonoBehaviour
currentPlayer.SpeedMultiplier = 0f;
if (currentPlayer.Particle != null)
currentPlayer.Particle.Stop(true, ParticleSystemStopBehavior.StopEmittingAndClear); // Arrêter proprement
currentPlayer.Particle.Stop(true, ParticleSystemStopBehavior.StopEmittingAndClear);
if (currentPlayer.SpriteRenderer != null)
currentPlayer.SpriteRenderer.enabled = false;
@ -128,7 +125,5 @@ public class TestManager : MonoBehaviour
}
isTesting = false;
Debug.Log("[TestManager] Test du niveau arrêté, joueur reset et caméra recentrée !");
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 353 KiB

View File

@ -1,16 +1,16 @@
{
"dependencies": {
"com.unity.collab-proxy": "2.6.0",
"com.unity.collab-proxy": "2.8.1",
"com.unity.feature.2d": "2.0.1",
"com.unity.ide.rider": "3.0.31",
"com.unity.ide.visualstudio": "2.0.22",
"com.unity.inputsystem": "1.11.2",
"com.unity.ide.rider": "3.0.36",
"com.unity.ide.visualstudio": "2.0.23",
"com.unity.inputsystem": "1.14.0",
"com.unity.multiplayer.center": "1.0.0",
"com.unity.test-framework": "1.4.5",
"com.unity.test-framework": "1.5.1",
"com.unity.timeline": "1.8.7",
"com.unity.toolchain.linux-x86_64": "2.0.10",
"com.unity.ugui": "2.0.0",
"com.unity.visualscripting": "1.9.4",
"com.unity.visualscripting": "1.9.6",
"com.yasirkula.simplefilebrowser": "https://github.com/yasirkula/UnitySimpleFileBrowser.git",
"com.unity.modules.accessibility": "1.0.0",
"com.unity.modules.ai": "1.0.0",

View File

@ -1,11 +1,11 @@
{
"dependencies": {
"com.unity.2d.animation": {
"version": "10.1.3",
"version": "10.1.4",
"depth": 1,
"source": "registry",
"dependencies": {
"com.unity.2d.common": "9.0.6",
"com.unity.2d.common": "9.0.7",
"com.unity.2d.sprite": "1.0.0",
"com.unity.collections": "1.2.4",
"com.unity.modules.animation": "1.0.0",
@ -14,7 +14,7 @@
"url": "https://packages.unity.com"
},
"com.unity.2d.aseprite": {
"version": "1.1.6",
"version": "1.1.9",
"depth": 1,
"source": "registry",
"dependencies": {
@ -26,7 +26,7 @@
"url": "https://packages.unity.com"
},
"com.unity.2d.common": {
"version": "9.0.6",
"version": "9.0.7",
"depth": 2,
"source": "registry",
"dependencies": {
@ -62,11 +62,11 @@
"dependencies": {}
},
"com.unity.2d.spriteshape": {
"version": "10.0.6",
"version": "10.0.7",
"depth": 1,
"source": "registry",
"dependencies": {
"com.unity.2d.common": "9.0.5",
"com.unity.2d.common": "9.0.7",
"com.unity.mathematics": "1.1.0",
"com.unity.modules.physics2d": "1.0.0"
},
@ -82,11 +82,10 @@
}
},
"com.unity.2d.tilemap.extras": {
"version": "4.0.2",
"version": "4.1.0",
"depth": 1,
"source": "registry",
"dependencies": {
"com.unity.ugui": "1.0.0",
"com.unity.2d.tilemap": "1.0.0",
"com.unity.modules.tilemap": "1.0.0",
"com.unity.modules.jsonserialize": "1.0.0"
@ -94,7 +93,7 @@
"url": "https://packages.unity.com"
},
"com.unity.burst": {
"version": "1.8.18",
"version": "1.8.21",
"depth": 3,
"source": "registry",
"dependencies": {
@ -104,7 +103,7 @@
"url": "https://packages.unity.com"
},
"com.unity.collab-proxy": {
"version": "2.6.0",
"version": "2.8.1",
"depth": 0,
"source": "registry",
"dependencies": {},
@ -125,27 +124,26 @@
"com.unity.ext.nunit": {
"version": "2.0.5",
"depth": 1,
"source": "registry",
"dependencies": {},
"url": "https://packages.unity.com"
"source": "builtin",
"dependencies": {}
},
"com.unity.feature.2d": {
"version": "2.0.1",
"depth": 0,
"source": "builtin",
"dependencies": {
"com.unity.2d.animation": "10.1.3",
"com.unity.2d.animation": "10.1.4",
"com.unity.2d.pixel-perfect": "5.0.3",
"com.unity.2d.psdimporter": "9.0.3",
"com.unity.2d.sprite": "1.0.0",
"com.unity.2d.spriteshape": "10.0.6",
"com.unity.2d.spriteshape": "10.0.7",
"com.unity.2d.tilemap": "1.0.0",
"com.unity.2d.tilemap.extras": "4.0.2",
"com.unity.2d.aseprite": "1.1.6"
"com.unity.2d.tilemap.extras": "4.1.0",
"com.unity.2d.aseprite": "1.1.9"
}
},
"com.unity.ide.rider": {
"version": "3.0.31",
"version": "3.0.36",
"depth": 0,
"source": "registry",
"dependencies": {
@ -154,7 +152,7 @@
"url": "https://packages.unity.com"
},
"com.unity.ide.visualstudio": {
"version": "2.0.22",
"version": "2.0.23",
"depth": 0,
"source": "registry",
"dependencies": {
@ -163,7 +161,7 @@
"url": "https://packages.unity.com"
},
"com.unity.inputsystem": {
"version": "1.11.2",
"version": "1.14.0",
"depth": 0,
"source": "registry",
"dependencies": {
@ -210,22 +208,21 @@
"url": "https://packages.unity.com"
},
"com.unity.test-framework": {
"version": "1.4.5",
"version": "1.5.1",
"depth": 0,
"source": "registry",
"source": "builtin",
"dependencies": {
"com.unity.ext.nunit": "2.0.3",
"com.unity.modules.imgui": "1.0.0",
"com.unity.modules.jsonserialize": "1.0.0"
},
"url": "https://packages.unity.com"
}
},
"com.unity.test-framework.performance": {
"version": "3.0.3",
"version": "3.1.0",
"depth": 3,
"source": "registry",
"dependencies": {
"com.unity.test-framework": "1.1.31",
"com.unity.test-framework": "1.1.33",
"com.unity.modules.jsonserialize": "1.0.0"
},
"url": "https://packages.unity.com"
@ -262,7 +259,7 @@
}
},
"com.unity.visualscripting": {
"version": "1.9.4",
"version": "1.9.6",
"depth": 0,
"source": "registry",
"dependencies": {

View File

@ -91,8 +91,8 @@ PlayerSettings:
submitAnalytics: 1
usePlayerLog: 1
dedicatedServerOptimizations: 1
bakeCollisionMeshes: 0
forceSingleInstance: 0
bakeCollisionMeshes: 1
forceSingleInstance: 1
useFlipModelSwapchain: 1
resizableWindow: 0
useMacAppStoreValidation: 0
@ -105,7 +105,7 @@ PlayerSettings:
xboxEnableKinectAutoTracking: 0
xboxEnableFitness: 0
visibleInBackground: 1
allowFullscreenSwitch: 1
allowFullscreenSwitch: 0
fullscreenMode: 3
xboxSpeechDB: 0
xboxEnableHeadOrientation: 0
@ -140,7 +140,7 @@ PlayerSettings:
loadStoreDebugModeEnabled: 0
visionOSBundleVersion: 1.0
tvOSBundleVersion: 1.0
bundleVersion: v1.0.0-staging.4
bundleVersion: v1.0.2
preloadedAssets: []
metroInputSource: 0
wsaTransparentSwapchain: 0
@ -673,7 +673,8 @@ PlayerSettings:
webGLWebAssemblyBigInt: 0
webGLCloseOnQuit: 0
webWasm2023: 0
scriptingDefineSymbols: {}
scriptingDefineSymbols:
Server: -306
additionalCompilerArguments: {}
platformArchitecture: {}
scriptingBackend:
@ -698,7 +699,7 @@ PlayerSettings:
tvOS: 1
incrementalIl2cppBuild: {}
suppressCommonWarnings: 1
allowUnsafeCode: 0
allowUnsafeCode: 1
useDeterministicCompilation: 1
additionalIl2CppArgs:
scriptingRuntimeVersion: 1

View File

@ -1,2 +1,2 @@
m_EditorVersion: 6000.0.25f1
m_EditorVersionWithRevision: 6000.0.25f1 (4859ab7b5a49)
m_EditorVersion: 6000.0.49f1
m_EditorVersionWithRevision: 6000.0.49f1 (840e0a9776d9)

View File

@ -0,0 +1,16 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &1
MonoBehaviour:
m_ObjectHideFlags: 53
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a287be6c49135cd4f9b2b8666c39d999, type: 3}
m_Name:
m_EditorClassIdentifier:
assetDefaultFramerate: 60
m_DefaultFrameRate: 60

View File

@ -6,9 +6,9 @@ Développement d'une reproduction du jeu [Geometry Dash](https://fr.wikipedia.or
Afin de tester le jeu, plusieurs `.zip` avec l'exécutable sont disponibles, généré automatiquement grâce au déploiement continu de [GameCI](https://game.ci/), en fonction du système d'exploitation:
- [Windows (x64)](https://github.com/boudji-ludwig-pett/cnam-geometry-dash/releases/download/v1.0.0-staging.4/windows.zip)
- [GNU/Linux (x64)](https://github.com/boudji-ludwig-pett/cnam-geometry-dash/releases/download/v1.0.0-staging.4/linux.zip)
- [macOS (x64)](https://github.com/boudji-ludwig-pett/cnam-geometry-dash/releases/download/v1.0.0-staging.4/macOS.zip)
- [Windows (x64)](https://github.com/boudji-ludwig-pett/cnam-geometry-dash/releases/download/v1.0.2/windows.zip)
- [GNU/Linux (x64)](https://github.com/boudji-ludwig-pett/cnam-geometry-dash/releases/download/v1.0.2/linux.zip)
- [macOS (x64)](https://github.com/boudji-ludwig-pett/cnam-geometry-dash/releases/download/v1.0.2/macOS.zip)
### Membres du groupe
@ -28,7 +28,7 @@ Afin de tester le jeu, plusieurs `.zip` avec l'exécutable sont disponibles, gé
## Prérequis
[Unity](https://unity.com/) v6000.0.25f1 (LTS)
[Unity](https://unity.com/) v6000.0.49f1 (LTS)
## Installation
@ -49,3 +49,5 @@ cd cnam-geometry-dash
![Gameplay](./Documentation/Screenshots/gameplay.png)
![Levels selection](./Documentation/Screenshots/levels-selection.png)
![Edit Level](./Documentation/Screenshots/edit-level.png)