mirror of
				https://github.com/boudji-ludwig-pett/cnam-geometry-dash.git
				synced 2025-06-27 11:58:51 +02:00 
			
		
		
		
	feat: export level (#57)
This commit is contained in:
		| @@ -96,6 +96,19 @@ TextureImporter: | |||||||
|     ignorePlatformSupport: 0 |     ignorePlatformSupport: 0 | ||||||
|     androidETC2FallbackOverride: 0 |     androidETC2FallbackOverride: 0 | ||||||
|     forceMaximumCompressionQuality_BC6H_BC7: 0 |     forceMaximumCompressionQuality_BC6H_BC7: 0 | ||||||
|  |   - serializedVersion: 4 | ||||||
|  |     buildTarget: Android | ||||||
|  |     maxTextureSize: 2048 | ||||||
|  |     resizeAlgorithm: 0 | ||||||
|  |     textureFormat: -1 | ||||||
|  |     textureCompression: 1 | ||||||
|  |     compressionQuality: 50 | ||||||
|  |     crunchedCompression: 0 | ||||||
|  |     allowsAlphaSplitting: 0 | ||||||
|  |     overridden: 0 | ||||||
|  |     ignorePlatformSupport: 0 | ||||||
|  |     androidETC2FallbackOverride: 0 | ||||||
|  |     forceMaximumCompressionQuality_BC6H_BC7: 0 | ||||||
|   spriteSheet: |   spriteSheet: | ||||||
|     serializedVersion: 2 |     serializedVersion: 2 | ||||||
|     sprites: |     sprites: | ||||||
| @@ -134,7 +147,8 @@ TextureImporter: | |||||||
|     secondaryTextures: [] |     secondaryTextures: [] | ||||||
|     spriteCustomMetadata: |     spriteCustomMetadata: | ||||||
|       entries: [] |       entries: [] | ||||||
|     nameFileIdTable: {} |     nameFileIdTable: | ||||||
|  |       RegularBlock01_0: 229215520534054086 | ||||||
|   mipmapLimitGroupName:  |   mipmapLimitGroupName:  | ||||||
|   pSDRemoveMatte: 0 |   pSDRemoveMatte: 0 | ||||||
|   userData:  |   userData:  | ||||||
|   | |||||||
| @@ -96,6 +96,19 @@ TextureImporter: | |||||||
|     ignorePlatformSupport: 0 |     ignorePlatformSupport: 0 | ||||||
|     androidETC2FallbackOverride: 0 |     androidETC2FallbackOverride: 0 | ||||||
|     forceMaximumCompressionQuality_BC6H_BC7: 0 |     forceMaximumCompressionQuality_BC6H_BC7: 0 | ||||||
|  |   - serializedVersion: 4 | ||||||
|  |     buildTarget: Android | ||||||
|  |     maxTextureSize: 2048 | ||||||
|  |     resizeAlgorithm: 0 | ||||||
|  |     textureFormat: -1 | ||||||
|  |     textureCompression: 1 | ||||||
|  |     compressionQuality: 50 | ||||||
|  |     crunchedCompression: 0 | ||||||
|  |     allowsAlphaSplitting: 0 | ||||||
|  |     overridden: 0 | ||||||
|  |     ignorePlatformSupport: 0 | ||||||
|  |     androidETC2FallbackOverride: 0 | ||||||
|  |     forceMaximumCompressionQuality_BC6H_BC7: 0 | ||||||
|   spriteSheet: |   spriteSheet: | ||||||
|     serializedVersion: 2 |     serializedVersion: 2 | ||||||
|     sprites: |     sprites: | ||||||
| @@ -134,7 +147,8 @@ TextureImporter: | |||||||
|     secondaryTextures: [] |     secondaryTextures: [] | ||||||
|     spriteCustomMetadata: |     spriteCustomMetadata: | ||||||
|       entries: [] |       entries: [] | ||||||
|     nameFileIdTable: {} |     nameFileIdTable: | ||||||
|  |       NewLevelButton 1_0: 4829622404114481491 | ||||||
|   mipmapLimitGroupName:  |   mipmapLimitGroupName:  | ||||||
|   pSDRemoveMatte: 0 |   pSDRemoveMatte: 0 | ||||||
|   userData:  |   userData:  | ||||||
|   | |||||||
| @@ -96,6 +96,19 @@ TextureImporter: | |||||||
|     ignorePlatformSupport: 0 |     ignorePlatformSupport: 0 | ||||||
|     androidETC2FallbackOverride: 0 |     androidETC2FallbackOverride: 0 | ||||||
|     forceMaximumCompressionQuality_BC6H_BC7: 0 |     forceMaximumCompressionQuality_BC6H_BC7: 0 | ||||||
|  |   - serializedVersion: 4 | ||||||
|  |     buildTarget: Android | ||||||
|  |     maxTextureSize: 2048 | ||||||
|  |     resizeAlgorithm: 0 | ||||||
|  |     textureFormat: -1 | ||||||
|  |     textureCompression: 1 | ||||||
|  |     compressionQuality: 50 | ||||||
|  |     crunchedCompression: 0 | ||||||
|  |     allowsAlphaSplitting: 0 | ||||||
|  |     overridden: 0 | ||||||
|  |     ignorePlatformSupport: 0 | ||||||
|  |     androidETC2FallbackOverride: 0 | ||||||
|  |     forceMaximumCompressionQuality_BC6H_BC7: 0 | ||||||
|   spriteSheet: |   spriteSheet: | ||||||
|     serializedVersion: 2 |     serializedVersion: 2 | ||||||
|     sprites: |     sprites: | ||||||
| @@ -134,7 +147,8 @@ TextureImporter: | |||||||
|     secondaryTextures: [] |     secondaryTextures: [] | ||||||
|     spriteCustomMetadata: |     spriteCustomMetadata: | ||||||
|       entries: [] |       entries: [] | ||||||
|     nameFileIdTable: {} |     nameFileIdTable: | ||||||
|  |       CubePortalLabelled_0: -799402021850825835 | ||||||
|   mipmapLimitGroupName:  |   mipmapLimitGroupName:  | ||||||
|   pSDRemoveMatte: 0 |   pSDRemoveMatte: 0 | ||||||
|   userData:  |   userData:  | ||||||
|   | |||||||
| @@ -96,6 +96,19 @@ TextureImporter: | |||||||
|     ignorePlatformSupport: 0 |     ignorePlatformSupport: 0 | ||||||
|     androidETC2FallbackOverride: 0 |     androidETC2FallbackOverride: 0 | ||||||
|     forceMaximumCompressionQuality_BC6H_BC7: 0 |     forceMaximumCompressionQuality_BC6H_BC7: 0 | ||||||
|  |   - serializedVersion: 4 | ||||||
|  |     buildTarget: Android | ||||||
|  |     maxTextureSize: 2048 | ||||||
|  |     resizeAlgorithm: 0 | ||||||
|  |     textureFormat: -1 | ||||||
|  |     textureCompression: 1 | ||||||
|  |     compressionQuality: 50 | ||||||
|  |     crunchedCompression: 0 | ||||||
|  |     allowsAlphaSplitting: 0 | ||||||
|  |     overridden: 0 | ||||||
|  |     ignorePlatformSupport: 0 | ||||||
|  |     androidETC2FallbackOverride: 0 | ||||||
|  |     forceMaximumCompressionQuality_BC6H_BC7: 0 | ||||||
|   spriteSheet: |   spriteSheet: | ||||||
|     serializedVersion: 2 |     serializedVersion: 2 | ||||||
|     sprites: |     sprites: | ||||||
| @@ -134,7 +147,8 @@ TextureImporter: | |||||||
|     secondaryTextures: [] |     secondaryTextures: [] | ||||||
|     spriteCustomMetadata: |     spriteCustomMetadata: | ||||||
|       entries: [] |       entries: [] | ||||||
|     nameFileIdTable: {} |     nameFileIdTable: | ||||||
|  |       ShipPortalLabelled_0: -1834338360412052916 | ||||||
|   mipmapLimitGroupName:  |   mipmapLimitGroupName:  | ||||||
|   pSDRemoveMatte: 0 |   pSDRemoveMatte: 0 | ||||||
|   userData:  |   userData:  | ||||||
|   | |||||||
| @@ -96,6 +96,19 @@ TextureImporter: | |||||||
|     ignorePlatformSupport: 0 |     ignorePlatformSupport: 0 | ||||||
|     androidETC2FallbackOverride: 0 |     androidETC2FallbackOverride: 0 | ||||||
|     forceMaximumCompressionQuality_BC6H_BC7: 0 |     forceMaximumCompressionQuality_BC6H_BC7: 0 | ||||||
|  |   - serializedVersion: 4 | ||||||
|  |     buildTarget: Android | ||||||
|  |     maxTextureSize: 2048 | ||||||
|  |     resizeAlgorithm: 0 | ||||||
|  |     textureFormat: -1 | ||||||
|  |     textureCompression: 1 | ||||||
|  |     compressionQuality: 50 | ||||||
|  |     crunchedCompression: 0 | ||||||
|  |     allowsAlphaSplitting: 0 | ||||||
|  |     overridden: 0 | ||||||
|  |     ignorePlatformSupport: 0 | ||||||
|  |     androidETC2FallbackOverride: 0 | ||||||
|  |     forceMaximumCompressionQuality_BC6H_BC7: 0 | ||||||
|   spriteSheet: |   spriteSheet: | ||||||
|     serializedVersion: 2 |     serializedVersion: 2 | ||||||
|     sprites: |     sprites: | ||||||
| @@ -134,7 +147,8 @@ TextureImporter: | |||||||
|     secondaryTextures: [] |     secondaryTextures: [] | ||||||
|     spriteCustomMetadata: |     spriteCustomMetadata: | ||||||
|       entries: [] |       entries: [] | ||||||
|     nameFileIdTable: {} |     nameFileIdTable: | ||||||
|  |       Remove_0: -6564193165698205349 | ||||||
|   mipmapLimitGroupName:  |   mipmapLimitGroupName:  | ||||||
|   pSDRemoveMatte: 0 |   pSDRemoveMatte: 0 | ||||||
|   userData:  |   userData:  | ||||||
|   | |||||||
| @@ -306,6 +306,9 @@ GameObject: | |||||||
|   - component: {fileID: 678214373} |   - component: {fileID: 678214373} | ||||||
|   - component: {fileID: 678214375} |   - component: {fileID: 678214375} | ||||||
|   - component: {fileID: 678214374} |   - component: {fileID: 678214374} | ||||||
|  |   - component: {fileID: 678214377} | ||||||
|  |   - component: {fileID: 678214376} | ||||||
|  |   - component: {fileID: 678214378} | ||||||
|   m_Layer: 5 |   m_Layer: 5 | ||||||
|   m_Name: Save |   m_Name: Save | ||||||
|   m_TagString: Untagged |   m_TagString: Untagged | ||||||
| @@ -370,6 +373,90 @@ CanvasRenderer: | |||||||
|   m_PrefabAsset: {fileID: 0} |   m_PrefabAsset: {fileID: 0} | ||||||
|   m_GameObject: {fileID: 678214372} |   m_GameObject: {fileID: 678214372} | ||||||
|   m_CullTransparentMesh: 1 |   m_CullTransparentMesh: 1 | ||||||
|  | --- !u!114 &678214376 | ||||||
|  | MonoBehaviour: | ||||||
|  |   m_ObjectHideFlags: 0 | ||||||
|  |   m_CorrespondingSourceObject: {fileID: 0} | ||||||
|  |   m_PrefabInstance: {fileID: 0} | ||||||
|  |   m_PrefabAsset: {fileID: 0} | ||||||
|  |   m_GameObject: {fileID: 678214372} | ||||||
|  |   m_Enabled: 1 | ||||||
|  |   m_EditorHideFlags: 0 | ||||||
|  |   m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} | ||||||
|  |   m_Name:  | ||||||
|  |   m_EditorClassIdentifier:  | ||||||
|  |   m_Navigation: | ||||||
|  |     m_Mode: 3 | ||||||
|  |     m_WrapAround: 0 | ||||||
|  |     m_SelectOnUp: {fileID: 0} | ||||||
|  |     m_SelectOnDown: {fileID: 0} | ||||||
|  |     m_SelectOnLeft: {fileID: 0} | ||||||
|  |     m_SelectOnRight: {fileID: 0} | ||||||
|  |   m_Transition: 1 | ||||||
|  |   m_Colors: | ||||||
|  |     m_NormalColor: {r: 1, g: 1, b: 1, a: 1} | ||||||
|  |     m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} | ||||||
|  |     m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} | ||||||
|  |     m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} | ||||||
|  |     m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} | ||||||
|  |     m_ColorMultiplier: 1 | ||||||
|  |     m_FadeDuration: 0.1 | ||||||
|  |   m_SpriteState: | ||||||
|  |     m_HighlightedSprite: {fileID: 0} | ||||||
|  |     m_PressedSprite: {fileID: 0} | ||||||
|  |     m_SelectedSprite: {fileID: 0} | ||||||
|  |     m_DisabledSprite: {fileID: 0} | ||||||
|  |   m_AnimationTriggers: | ||||||
|  |     m_NormalTrigger: Normal | ||||||
|  |     m_HighlightedTrigger: Highlighted | ||||||
|  |     m_PressedTrigger: Pressed | ||||||
|  |     m_SelectedTrigger: Selected | ||||||
|  |     m_DisabledTrigger: Disabled | ||||||
|  |   m_Interactable: 1 | ||||||
|  |   m_TargetGraphic: {fileID: 678214374} | ||||||
|  |   m_OnClick: | ||||||
|  |     m_PersistentCalls: | ||||||
|  |       m_Calls: | ||||||
|  |       - m_Target: {fileID: 678214377} | ||||||
|  |         m_TargetAssemblyTypeName: JSONExporter, Assembly-CSharp | ||||||
|  |         m_MethodName: ExportJSON | ||||||
|  |         m_Mode: 1 | ||||||
|  |         m_Arguments: | ||||||
|  |           m_ObjectArgument: {fileID: 0} | ||||||
|  |           m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine | ||||||
|  |           m_IntArgument: 0 | ||||||
|  |           m_FloatArgument: 0 | ||||||
|  |           m_StringArgument:  | ||||||
|  |           m_BoolArgument: 0 | ||||||
|  |         m_CallState: 2 | ||||||
|  | --- !u!114 &678214377 | ||||||
|  | MonoBehaviour: | ||||||
|  |   m_ObjectHideFlags: 0 | ||||||
|  |   m_CorrespondingSourceObject: {fileID: 0} | ||||||
|  |   m_PrefabInstance: {fileID: 0} | ||||||
|  |   m_PrefabAsset: {fileID: 0} | ||||||
|  |   m_GameObject: {fileID: 678214372} | ||||||
|  |   m_Enabled: 1 | ||||||
|  |   m_EditorHideFlags: 0 | ||||||
|  |   m_Script: {fileID: 11500000, guid: d3227fe18f4441647bdd19d3131efa02, type: 3} | ||||||
|  |   m_Name:  | ||||||
|  |   m_EditorClassIdentifier:  | ||||||
|  |   editor: {fileID: 0} | ||||||
|  | --- !u!114 &678214378 | ||||||
|  | MonoBehaviour: | ||||||
|  |   m_ObjectHideFlags: 0 | ||||||
|  |   m_CorrespondingSourceObject: {fileID: 0} | ||||||
|  |   m_PrefabInstance: {fileID: 0} | ||||||
|  |   m_PrefabAsset: {fileID: 0} | ||||||
|  |   m_GameObject: {fileID: 678214372} | ||||||
|  |   m_Enabled: 1 | ||||||
|  |   m_EditorHideFlags: 0 | ||||||
|  |   m_Script: {fileID: 11500000, guid: f5bf592d3d8430744a08058675701934, type: 3} | ||||||
|  |   m_Name:  | ||||||
|  |   m_EditorClassIdentifier:  | ||||||
|  |   mapParent: {fileID: 0} | ||||||
|  |   blockGroupContainer: {fileID: 394350961} | ||||||
|  |   buttonPrefabTemplate: {fileID: 1993500743} | ||||||
| --- !u!1 &739948034 | --- !u!1 &739948034 | ||||||
| GameObject: | GameObject: | ||||||
|   m_ObjectHideFlags: 0 |   m_ObjectHideFlags: 0 | ||||||
|   | |||||||
							
								
								
									
										147
									
								
								Assets/Scripts/JSONExporter.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										147
									
								
								Assets/Scripts/JSONExporter.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,147 @@ | |||||||
|  | using UnityEngine; | ||||||
|  | using System.IO; | ||||||
|  | using System.Collections; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using SimpleFileBrowser; | ||||||
|  | using TMPro; | ||||||
|  |  | ||||||
|  | [RequireComponent(typeof(LevelEditor))] | ||||||
|  | public class JSONExporter : MonoBehaviour | ||||||
|  | { | ||||||
|  |     public TMP_Text statusText; | ||||||
|  |     private LevelEditor editor; | ||||||
|  |     private string levelsFolder; | ||||||
|  |  | ||||||
|  |     private void Awake() | ||||||
|  |     { | ||||||
|  |         editor = GetComponent<LevelEditor>(); | ||||||
|  |         levelsFolder = Path.Combine(Application.dataPath, "Resources/Levels"); | ||||||
|  |         if (!Directory.Exists(levelsFolder)) | ||||||
|  |             Directory.CreateDirectory(levelsFolder); | ||||||
|  |  | ||||||
|  |         if (statusText == null) | ||||||
|  |         { | ||||||
|  |             var statusObj = GameObject.Find("StatusText"); | ||||||
|  |             if (statusObj != null) | ||||||
|  |                 statusText = statusObj.GetComponent<TMP_Text>(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private void Start() | ||||||
|  |     { | ||||||
|  |         SetStatus("Ready to export...", Color.white); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void ExportJSON() | ||||||
|  |     { | ||||||
|  |         SetStatus("Exporting...", Color.yellow); | ||||||
|  |         StartCoroutine(ShowSaveDialog()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private IEnumerator ShowSaveDialog() | ||||||
|  |     { | ||||||
|  |         yield return FileBrowser.WaitForSaveDialog( | ||||||
|  |             FileBrowser.PickMode.Files, | ||||||
|  |             false, | ||||||
|  |             levelsFolder, | ||||||
|  |             "NewLevel.json", | ||||||
|  |             "Save Level JSON", | ||||||
|  |             "Save" | ||||||
|  |         ); | ||||||
|  |  | ||||||
|  |         if (!FileBrowser.Success) | ||||||
|  |         { | ||||||
|  |             SetStatus("Save canceled.", Color.red); | ||||||
|  |             yield break; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         string chosenPath = FileBrowser.Result[0]; | ||||||
|  |         string fileName = Path.GetFileNameWithoutExtension(chosenPath); | ||||||
|  |         string destPath = Path.Combine(levelsFolder, fileName + ".json"); | ||||||
|  |  | ||||||
|  |         var elements = new List<SerializableElement>(); | ||||||
|  |         var allCols = Object.FindObjectsByType<Collider2D>(FindObjectsSortMode.None); | ||||||
|  |         foreach (var col in allCols) | ||||||
|  |         { | ||||||
|  |             var go = col.gameObject; | ||||||
|  |             if (!go.name.Contains("(Clone)") || go.name.ToLower().Contains("ground")) | ||||||
|  |                 continue; | ||||||
|  |  | ||||||
|  |             Vector3 scale = go.transform.localScale; | ||||||
|  |             Vector3 pos = go.transform.position; | ||||||
|  |  | ||||||
|  |             elements.Add(new SerializableElement | ||||||
|  |             { | ||||||
|  |                 type = go.name.Replace("(Clone)", ""), | ||||||
|  |                 x = Mathf.Round(pos.x * 100f) / 100f, | ||||||
|  |                 y = Mathf.Round(pos.y * 100f) / 100f, | ||||||
|  |                 scaleX = Mathf.Round(scale.x * 100f) / 100f, | ||||||
|  |                 scaleY = Mathf.Round(scale.y * 100f) / 100f | ||||||
|  |             }); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         if (elements.Count == 0) | ||||||
|  |         { | ||||||
|  |             SetStatus("No elements to export.", Color.red); | ||||||
|  |             yield break; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         LevelData data = new LevelData | ||||||
|  |         { | ||||||
|  |             name = fileName, | ||||||
|  |             musicName = "", | ||||||
|  |             order = 0, | ||||||
|  |             elements = elements.ToArray() | ||||||
|  |         }; | ||||||
|  |         string json = JsonUtility.ToJson(data, prettyPrint: true); | ||||||
|  |  | ||||||
|  |         try | ||||||
|  |         { | ||||||
|  |             File.WriteAllText(destPath, json); | ||||||
|  |             SetStatus("Export successful: " + fileName + ".json", Color.green); | ||||||
|  |         } | ||||||
|  |         catch (System.Exception e) | ||||||
|  |         { | ||||||
|  |             Debug.LogError("Export error: " + e); | ||||||
|  |             SetStatus("Export error. See console.", Color.red); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  | #if UNITY_EDITOR | ||||||
|  |         UnityEditor.AssetDatabase.Refresh(); | ||||||
|  | #endif | ||||||
|  |         var loader = Object.FindAnyObjectByType<LevelsLoader>(); | ||||||
|  |         if (loader != null) | ||||||
|  |             loader.RefreshLevels(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private void SetStatus(string message, Color color) | ||||||
|  |     { | ||||||
|  |         if (statusText != null) | ||||||
|  |         { | ||||||
|  |             statusText.text = message; | ||||||
|  |             statusText.color = color; | ||||||
|  |             statusText.gameObject.SetActive(false); | ||||||
|  |             statusText.gameObject.SetActive(true); | ||||||
|  |             Canvas.ForceUpdateCanvases(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     [System.Serializable] | ||||||
|  |     private class SerializableElement | ||||||
|  |     { | ||||||
|  |         public string type; | ||||||
|  |         public float x; | ||||||
|  |         public float y; | ||||||
|  |         public float scaleX; | ||||||
|  |         public float scaleY; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     [System.Serializable] | ||||||
|  |     private class LevelData | ||||||
|  |     { | ||||||
|  |         public string name; | ||||||
|  |         public string musicName; | ||||||
|  |         public int order; | ||||||
|  |         public SerializableElement[] elements; | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										2
									
								
								Assets/Scripts/JSONExporter.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								Assets/Scripts/JSONExporter.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | |||||||
|  | fileFormatVersion: 2 | ||||||
|  | guid: d3227fe18f4441647bdd19d3131efa02 | ||||||
| @@ -41,6 +41,16 @@ public class LevelEditor : MonoBehaviour | |||||||
|  |  | ||||||
|     void GenerateButtons() |     void GenerateButtons() | ||||||
|     { |     { | ||||||
|  |         if (buttonPrefabTemplate == null) | ||||||
|  |         { | ||||||
|  |             Debug.LogError("LevelEditor.GenerateButtons(): buttonPrefabTemplate n’est pas assigné !"); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         if (blockGroupContainer == null) | ||||||
|  |         { | ||||||
|  |             Debug.LogError("LevelEditor.GenerateButtons(): blockGroupContainer n’est pas assigné !"); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|         ClearCurrentButtons(); |         ClearCurrentButtons(); | ||||||
|  |  | ||||||
|         Transform container = blockGroupContainer; |         Transform container = blockGroupContainer; | ||||||
| @@ -440,9 +450,4 @@ public class LevelEditor : MonoBehaviour | |||||||
|         currentBlock.transform.Rotate(0f, 0f, -90f); // ➔ Rotation de 90° dans le sens horaire |         currentBlock.transform.Rotate(0f, 0f, -90f); // ➔ Rotation de 90° dans le sens horaire | ||||||
|         Debug.Log("🔄 Bloc pivoté de 90° !"); |         Debug.Log("🔄 Bloc pivoté de 90° !"); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void Save() |  | ||||||
|     { |  | ||||||
|         // TODO : Implémenter la sauvegarde du niveau |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user