using UnityEngine; using UnityEditor; // 에디터 기능 사용을 위해 필수 using System.IO; public class LevelAssetGenerator : EditorWindow { // 생성할 레벨 개수 설정 private int levelCount = 100; // 저장될 경로 (Resources 폴더에 넣으면 런타임 로드가 편함) private string savePath = "Assets/Resources/Levels"; // Unity 상단 메뉴에 도구 추가 [Tools -> Generate Levels] [MenuItem("Tools/Generate Levels")] public static void ShowWindow() { GetWindow("Level Generator"); } private void OnGUI() { GUILayout.Label("Puzzle Level Auto-Generator", EditorStyles.boldLabel); levelCount = EditorGUILayout.IntField("Total Levels", levelCount); savePath = EditorGUILayout.TextField("Save Path", savePath); EditorGUILayout.Space(); if (GUILayout.Button("Generate 100 Levels")) { CreateLevels(); } } private void CreateLevels() { // 1. 폴더가 없으면 생성 if (!Directory.Exists(savePath)) { Directory.CreateDirectory(savePath); AssetDatabase.Refresh(); } for (int i = 1; i <= levelCount; i++) { // 2. 인스턴스 생성 LevelData levelData = ScriptableObject.CreateInstance(); // 3. 데이터 설정 (난이도 로직) SetLevelDifficulty(levelData, i); // 4. 파일 저장 string fileName = $"Level_{i:D3}.asset"; // Level_001.asset 형식 string fullPath = $"{savePath}/{fileName}"; // 이미 존재하는 파일이면 덮어쓰기 위해 고유 경로 생성 fullPath = AssetDatabase.GenerateUniqueAssetPath(fullPath); AssetDatabase.CreateAsset(levelData, fullPath); } // 5. 저장 및 새로고침 AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); Debug.Log($"Success! {levelCount} levels generated at {savePath}"); } // 레벨 번호에 따른 난이도 및 색상 로직 private void SetLevelDifficulty(LevelData data, int levelNum) { data.levelIndex = levelNum; // 1. 그리드 크기 설정 (기존과 동일) if (levelNum <= 10) data.gridSize = new Vector2Int(3, 3); else if (levelNum <= 30) data.gridSize = new Vector2Int(4, 4); else if (levelNum <= 60) data.gridSize = new Vector2Int(5, 5); else data.gridSize = new Vector2Int(6, 7); // 2. 색상 생성 로직 개선 (HSV 기반 상대적 변환) // (A) 기준이 되는 메인 색상(Hue)을 하나 뽑습니다. (0.0 ~ 1.0) float baseHue = Random.Range(0f, 1f); // (B) 난이도에 따라 색상 범위(Range)를 결정합니다. // 초반: 아주 비슷한 색 (유사색) -> 범위 0.1 ~ 0.2 // 후반: 보색에 가까운 색 -> 범위 0.3 ~ 0.5 float range = (levelNum < 20) ? 0.15f : 0.4f; // (C) 4개의 코너 색상을 기준 색상에서 'range'만큼만 비틀어서 생성합니다. // 명도(V)와 채도(S)는 높게 고정하여 '칙칙한 색'을 방지합니다. data.colorTL = Color.HSVToRGB(baseHue, 0.7f, 0.9f); // 우상단: Hue를 살짝 더함 data.colorTR = Color.HSVToRGB((baseHue + range * 0.3f) % 1f, 0.7f, 0.9f); // 좌하단: Hue를 살짝 뺌 + 명도를 조금 어둡게(입체감) data.colorBL = Color.HSVToRGB((baseHue - range * 0.3f + 1f) % 1f, 0.8f, 0.8f); // 우하단: 대각선 방향으로 가장 많이 변화 data.colorBR = Color.HSVToRGB((baseHue + range) % 1f, 0.8f, 0.7f); } }