103 lines
3.7 KiB
C#
103 lines
3.7 KiB
C#
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<LevelAssetGenerator>("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<LevelData>();
|
|
|
|
// 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);
|
|
}
|
|
} |